1.安装delve
go get -u github.com/go-delve/delve/cmd/dlv
详见:https://github.com/go-delve/delve/blob/master/Documentation/installation/linux/install.md
2.使用delve
使用调试器进行编译需要先产生一个支持调试的版本。
2.1 编译调试一步走
dlv debug,该方式下编译成功后会直接进入调试模式(编译参数可以通过–build-flags 指定):
2.1.1 编译当前目录下的main包
dlv debug
2.1.2 编译非当前目录下的main包
假定github.com/me/foo/cmd/foo是我们的main包路径,delve调用方式为 dlv debug github.com/me/foo/cmd/foo
2.2 编译+delve调试
delve支持先直接调试预先编译好的二进制,但是go 1.10及以上建议开启-gcflags=“all=-N -l” 编译选项进行编译,否则优化后的二进制可能会各种调试问题。
程序运行参数可以以--
分隔,后面紧跟需要传入的参数。
a. 使用go build或项目特定的方式进行编译
b. dlv exec <path/to/binary>。
2.3 简单使用介绍
-
打断点:break packageName.funcName
这里我们对main包里面的dealSignal函数设置断点。
-
运行: continue
delve没有run命令,直接服用continue命令开始调试。如下图,程序运行后停在了dealSignal函数,并显示了代码上下文。
-
单步运行:next(step over)
运行当前栈中下一行,可以看到下一条运行语句的指针已经指向49行。
-
打印变量:print
打印当前堆栈变量,我们这里打印的是一个channel,可以看到delve把channel的成员变量全都递归打印出来了,并且附带成员名称。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WJgQb5OM-1678759503719)(/Users/zsh/Desktop/6.png)] -
帮助命令:help
其他功能详见help。
2.4 相关链接
- 更多使用方式 https://github.com/go-delve/delve/blob/master/Documentation/usage/dlv.md
- 编辑器及ide集成方案 https://github.com/go-delve/delve/blob/master/Documentation/EditorIntegration.md