当前位置:网站首页>Go 语言源码级调试器 Delve
Go 语言源码级调试器 Delve
2022-07-01 16:11:00 【frank.】
大家好,我是 frank。
01
介绍
Delve 是一个简单、强大和易用的 Go 语言源代码层级的调试器,也是 Go 官方推荐使用的调试器。
02
安装
Delve 安装非常简单,如果读者朋友使用的是 Go 1.16 或更高版本,可以直接使用 go install 安装:
go install github.com/go-delve/delve/cmd/[email protected]
如果读者朋友们使用的是低于 Go 1.16 的版本,可是先下载 Delve 源码,然后使用 go install 安装:
git clone https://github.com/go-delve/delve
cd delve
go install github.com/go-delve/delve/cmd/dlv
安装完成之后,可以使用 go help install 查看 dlv 可执行文件的详细位置。我建议读者朋友们将 dlv可执行文件,配置到 PATH 环境变量。
需要注意的是,如果读者朋友们使用的是 macOS,还需要安装命令行开发工具:
xcode-select --install
为了避免每次使用 dlv 都需要授权允许使用 debugger,建议读者朋友们开启开发者模式:
sudo /usr/sbin/DevToolsSecurity -enable
03
实践
在完成 Part 02 中的所有操作之后,我们使用 dlv version 检查 dlv 可执行程序是否已可以使用。
我们可以使用 dlv 的任意可用命令启动一个调式会话,比较常用的命令是 dlv debug, dlv exec 和 dlv test。限于篇幅,本文我们介绍 dlv debug 的使用方法。
示例代码:
package main
import (
"fmt"
)
func main() {
a := 1
b := 2
c := sum(a, b)
fmt.Println(c)
}
func sum(a, b int) int {
res := a + b
return res
}
阅读上面这段我们将用于调试会话的代码示例,它包含一个 main 函数和一个 sum 函数,main 函数中定义变量 a 和变量 b,调用 sub 函数,并将返回结果赋值给变量 c,最后打印变量 c 的值。
启动一个调试会话:
[[email protected] work]# dlv debug
Type 'help' for list of commands.
(dlv)
阅读上面这段代码,我们使用 dlv debug 启动一个调试会话,在没有任何参数的情况下,Delve 编译并开始调试当前目录中的 main 包。
我们也可以指定一个文件名,Delve 将会编译该指定文件的 main 包,并启动一个调试会话。
[[email protected] work]# dlv debug main.go
Type 'help' for list of commands.
(dlv)
调试会话启动后,我们可以使用调试命令进行调试程序。
list 命令:
dlv debug
Type 'help' for list of commands.
(dlv) list main.main
Showing /work/main.go:7 (PC: 0x49670a)
2:
3: import (
4: "fmt"
5: )
6:
7: func main() {
8: a := 1
9: b := 2
10: c := sum(a, b)
11: fmt.Println(c)
12: }
(dlv) list ./main.go:7
Showing /work/main.go:7 (PC: 0x49670a)
2:
3: import (
4: "fmt"
5: )
6:
7: func main() {
8: a := 1
9: b := 2
10: c := sum(a, b)
11: fmt.Println(c)
12: }
(dlv)
调试会话启动后,我们可以使用 list 命令列出指定位置的源码,包含两种方式,第一种方式是 <package name>.<func name>,第二种方式是 <file name>:<line number>。
break 命令:
dlv debug
Type 'help' for list of commands.
(dlv) break main.main
Breakpoint 1 set at 0x49670a for main.main() ./main.go:7
(dlv)
我们可以使用 break 命令添加断点,和 list 命令一样,添加断点的位置,也可以使用上述两种方式。
我们可以使用 breakpoints 命令,列出所有断点,可以使用 clear 命令删除指定断点,可以使用 clearall 删除所有断定。
continue、next、step、stepout 和 print 命令:
dlv debug
Type 'help' for list of commands.
(dlv) break main.main
Breakpoint 1 set at 0x49670a for main.main() ./main.go:7
(dlv) continue
> main.main() ./main.go:7 (hits goroutine(1):1 total:1) (PC: 0x49670a)
2:
3: import (
4: "fmt"
5: )
6:
=> 7: func main() {
8: a := 1
9: b := 2
10: c := sum(a, b)
11: fmt.Println(c)
12: }
(dlv) next
> main.main() ./main.go:8 (PC: 0x496718)
3: import (
4: "fmt"
5: )
6:
7: func main() {
=> 8: a := 1
9: b := 2
10: c := sum(a, b)
11: fmt.Println(c)
12: }
13:
(dlv) next
> main.main() ./main.go:9 (PC: 0x496721)
4: "fmt"
5: )
6:
7: func main() {
8: a := 1
=> 9: b := 2
10: c := sum(a, b)
11: fmt.Println(c)
12: }
13:
14: func sum(a, b int) int {
(dlv) next
> main.main() ./main.go:10 (PC: 0x49672a)
5: )
6:
7: func main() {
8: a := 1
9: b := 2
=> 10: c := sum(a, b)
11: fmt.Println(c)
12: }
13:
14: func sum(a, b int) int {
15: res := a + b
(dlv) print a
1
(dlv) print b
2
(dlv) step
> main.sum() ./main.go:14 (PC: 0x4967e0)
9: b := 2
10: c := sum(a, b)
11: fmt.Println(c)
12: }
13:
=> 14: func sum(a, b int) int {
15: res := a + b
16: return res
17: }
(dlv) next
> main.sum() ./main.go:15 (PC: 0x496800)
10: c := sum(a, b)
11: fmt.Println(c)
12: }
13:
14: func sum(a, b int) int {
=> 15: res := a + b
16: return res
17: }
(dlv) next
> main.sum() ./main.go:16 (PC: 0x49680f)
11: fmt.Println(c)
12: }
13:
14: func sum(a, b int) int {
15: res := a + b
=> 16: return res
17: }
(dlv) next
> main.main() ./main.go:10 (PC: 0x496739)
Values returned:
~r0: 3
5: )
6:
7: func main() {
8: a := 1
9: b := 2
=> 10: c := sum(a, b)
11: fmt.Println(c)
12: }
13:
14: func sum(a, b int) int {
15: res := a + b
(dlv) next
> main.main() ./main.go:11 (PC: 0x49673e)
6:
7: func main() {
8: a := 1
9: b := 2
10: c := sum(a, b)
=> 11: fmt.Println(c)
12: }
13:
14: func sum(a, b int) int {
15: res := a + b
16: return res
(dlv) print c
3
(dlv)
阅读上面这段代码,我们使用 Delve 添加断点后,执行 continue 命令,程序将执行到断点位置;执行 next 命令,程序继续执行下一行代码;执行 step 命令,程序步入到调用函数内部;执行 stepout 命令,程序步出到调用函数的调用位置;执行 print 命令,打印指定参数的值。
读者朋友们使用以上命令,可以满足大部分调试场景。为了方便理解,以上示例中使用的命令都没有使用简写形式,在实际使用时,使用简写形式会更加便捷。
简写形式:
- break(b)
- continue(c)
- next(n)
- step(s)
- stepout(so)
- print(p)
04
总结
本文我们简单介绍 Go 语言调试器 Delve 的基本使用方式,读者朋友们可以在程序调试时将 Delve 使用起来,替换使用 print 打印的形式调试代码。
关于 Delve 的高级功能,例如调试 goroutines、将调试器附加到现有进程、远程调试以及从 VSCode 编辑器或 Goland IDE 使用 Delve。感兴趣的读者朋友们可以参考 Delve 的帮助文档。
参考资料:
- https://go.dev/doc/gdb
- https://github.com/go-delve/delve/tree/master/Documentation
边栏推荐
- picgo快捷键 绝了这人和我的想法 一模一样
- The picgo shortcut is amazing. This person thinks exactly the same as me
- 【php毕业设计】基于php+mysql+apache的教材管理系统设计与实现(毕业论文+程序源码)——教材管理系统
- 自動、智能、可視!深信服SSLO方案背後的八大設計
- 2022 Moonriver全球黑客松优胜项目名单
- [200 opencv routines] 216 Draw polylines and polygons
- Sales management system of lightweight enterprises based on PHP
- Can't global transactions be used when shardingjdbc is used in seate?
- STM32F1与STM32CubeIDE编程实例-PWM驱动蜂鸣器生产旋律
- 【每日一题】1175. 质数排列
猜你喜欢

【开源数据】基于虚拟现实场景的跨模态(磁共振、脑磁图、眼动)人类空间记忆研究开源数据集

Crypto Daily: Sun Yuchen proposed to solve global problems with digital technology on MC12

【Hot100】19. Delete the penultimate node of the linked list

电脑照片尺寸如何调整成自己想要的

Win11如何設置用戶權限?Win11設置用戶權限的方法
![[每日一氵]Latex 的通讯作者怎么搞](/img/0f/d19b27dc42124c89993dee1bada838.png)
[每日一氵]Latex 的通讯作者怎么搞

【LeetCode】43. String multiplication

Automatique, intelligent, visuel! Forte conviction des huit conceptions derrière la solution sslo

【观察】数字化时代的咨询往何处走?软通咨询的思与行

【Hot100】17. 电话号码的字母组合
随机推荐
Advanced cross platform application development (24): uni app realizes file download and saving
Nuxt.js数据预取
【SQL语句】请问这边为什么select出了两个上海,查询出了不同的count我想让他变成一个上海,count只显示一个总和
Trace the source of drugs and tamp the safety dike
Five years after graduation, I became a test development engineer with an annual salary of 30w+
2022-07-01日报:谷歌新研究:Minerva,用语言模型解决定量推理问题
There is a difference between u-standard contract and currency standard contract. Will u-standard contract explode
马来西亚《星报》:在WTO MC12 孙宇晨仍在坚持数字经济梦想
AVL balanced binary search tree
基于PHP的轻量企业销售管理系统
超视频时代,什么样的技术会成为底座?
Does 1.5.1 in Seata support mysql8?
STM32F1与STM32CubeIDE编程实例-PWM驱动蜂鸣器生产旋律
【Hot100】20. Valid parentheses
嵌入式开发:5个修订控制最佳实践
Which MySQL functions are currently supported by tablestore in table storage?
IM即時通訊開發實現心跳保活遇到的問題
Sqlserver query: when a.id is the same as b.id, and the A.P corresponding to a.id cannot be found in the B.P corresponding to b.id, the a.id and A.P will be displayed
2023届春招实习-个人面试过程和面经分享
laravel的模型删除后动作