使用 dlv 进行 debug
使用 dlv
可以方便的对 go
生成的二进制文件进行 debug
,以下面的代码 main.go
为例讲解 dlv
的使用
1 | package main |
1️⃣ 安装 dlv
直接使用 go install
命令即可将 dlv
安装到 $GOPATH/bin
目录下面
1 | # 可以下载最新的 |
2️⃣ 编译代码,设置编译参数
直接使用 go build
编译二进制文件的时候,会对代码进行优化和内联,导致使用 dlv
的时候部分命令不能使用,比如函数的调用。
1 | # 存在优化的编译 |
3️⃣ dlv exec path/to/bin,进入调试模式
使用 exec
子命令,直接调试可运行的二进制文件
1 | ➜ dlv exec ./http_server |
4️⃣ 比对文件路径和行数,设置对应的断点
比如我想在 main.go
的 Hello
函数进行调试,定位这个函数的行数为第 9
行,路径为 main.go
,然后可以执行 break main.go:9
1 | (dlv) break main.go:9 |
如果提示 location xxx ambiguous
,需要对路径进行明确,使用输出的长路径即可,比如 break github.com/xxx/xxx/main.go
。
设置好断点之后,可以通过 breakpoints
命令查询所有的断点,可以发现 dlv
默认也会将 panic
加入断点。
1 | (dlv) breakpoints |
5️⃣ 执行程序,直到运行到断点或者程序结束
这一步不能省略!!! 省略之后无法调试断点,执行 continue
命令
1 | (dlv) continue |
6️⃣ 进行请求,使其能够执行到断点处
如果请求 ok 了,continue
命令不再阻塞
1 | (dlv) continue |
如果出现 warning
是因为二进制文件是经过优化的,编译的时候可以添加 -gcflags="all=-N -l"
参数去掉该提示。
7️⃣ 愉快的进行调试
使用 dlv 提供的命令,进行调试
命令 | 说明 |
---|---|
args | 当前函数的参数 |
step | 进入函数/方法中 |
next | 跳转到下一行代码 |
continue/c | 运行代码直到下一个断点或者结束 |
break/b | 设置断点 |
breakpoints/bp | 所有的断点 |
clear xx | 清理掉第 xx 个断点 |
clearall | 清理所有的断点 |
locals | 输出所有局部变量 |
输出指定的变量 |
print
如果需要输出长字符串,可以先执行 config max-string-len 1000
扩大输出的字符串长度
编译时需要禁止优化才能使用
1 | go build xxxx -gcflags="all=-N -l" |
命令 | 说明 |
---|---|
list | 输出源代码 |
call | 调用函数 |
8️⃣ More
dlv
不仅使用 attach
对正在运行的程序进行调试,也可以直接对二进制文件进行调试 (dlv exec
),甚至是没有编译的代码包 (dlv debug
),更多更详细的文档,可以参考下面的两个链接:
多动手试试,很容易就可以熟悉 dlv
使用~
生活杂笔,学习杂记,偶尔随便写写东西。
使用 dlv 进行 debug