Delve 是go语言的一款调试器
调试方式
- 命令行调试
- 配合goland等ide进行remote debug
命令行调试
dlv exec
如果你已经有一个编译好的应用,可以直接通过dlv exec
执行一个预编译好的二进制程序并开启debug会话
|
|
dlv attach
如果程序已经运行,可以直接attach
|
|
dlv attach 会导致程序阻塞,千万要注意
dlv core
如果程序出core,使用dlv core
命令来检查core dump,帮助调查core发生时的进程运行状态
|
|
A core dump file is a file that contains the memory dump of a running process and its process status
dlv debug
在禁用编译优化条件下编译程序,开启并attach
|
|
输入 help 显示所有可以操作的命令
|
|
按回车键可以重复上次的操作
远程debug(配合goland使用)
第一步: 在远端机器项目下开启dlv API服务端口
第二步: 本机goland配置远端ip:端口,点击启动程序并开启debug会话
交互模式
delve提供两种交互模式 命令行交互模式
与 headless模式
, 其中命令行交互模式是默认模式,这里重点说一下headless模式。
通过--headless
开启模式。该模式下delve对外暴露API接口,通过这些接口,其他IDE或编辑器可以与delve进行交互。
举例: dlv debug —headless —log —listen=127.0.0.1:8181 —accept-multiclient
- —headless表示以headless启动
- —listen指明要监听的端口
- —accept-multiclient表明开启多客户端访问支持
你可以通过connect命令直接连接这台headless调试服务器
dlv connect 127.0.0.1:8181
FAQ
线上环境使用须知
无论是debug还是attach都会导致程序的阻塞,对于线上服务谨慎使用(举个例子,在A方法中打断点,来请求暂停至A方法后,整个程序阻塞,对于不会调用A方法的请求同样也会阻塞)
…
删除断点时通常只需要删除某个方法内的断点,如何操作
clearall
例: clearall main.main
观测程序栈帧信息时如何同时显示源码
使用bt -full
如何在delve中重新加载源文件
Delve目前不支持重新加载正在运行的编译代码并保存断点及跟踪等状态。
暂时可以用source
命令来加速重新编译运行后设置断点、跟踪等的时间
例如debug.txt存在以下内容
|
|
回到dlv debug
|
|
相关资料
delve api
使用 Delve 调试 Go 服务的一次经历
Using the Go Delve Debugger from the command line
注释1. all=-N -l表示关闭编译优化及内联。go build 可以用-gcflags向go编译器传入参数,也就是传给go tool compile的参数,可以通过go tool compile —help查看所有可用参数。 ↩