golang dlv程序调试
安装dlv
执行go install 安装dlv
go install github.com/go-delve/delve/cmd/dlv@latest
执行 dlv version 查看是否安装成功
$ dlv version
Delve Debugger
Version: 1.22.0
Build: $Id: 61ecdbbe1b574f0dd7d7bad8b6a5d564cce981e9 $
断点调试
dlv有以下三种方式进行断点调试:
- dlv attach pid:对正在运行的进程直接进行调试(pid 为进程id);
- dlv debug:编译源文件并开始调试,这里应和 main 函数位于同一目录,或者指定完整的 main 函数路径
- dlv exec filename:从二进制文件启动调试
dlv常用调试命令:
| 命令 | 含义 |
|---|---|
| b | 设置断点 |
| bp | 打印正活动的断点信息 |
| clear | 删除断点 |
| clearall | 删除所有断点 |
| c | 运行直到断点处或程序终止 |
| n | 下一步,不会进入函数 |
| s | 下一步,会进入函数 |
| so | 跳出当前函数 |
| args | 查看函数参数 |
| locals | 查看所有局部变量 |
| list | 打印当前源代码 |
| on | 运行到某断点然后执行相应的命令,比如 on 2 list |
| bt | 打印当前调用栈 |
| exit | 退出 |
| goroutines (grs) | 列出所有的 goroutines |
| goroutine (gr) | 查看当前的 goroutine |
goland 使用 dlv 进行断点调试
点击debug按钮进入调试

添加断点

注:有的goland编译器不能执行debug如下图,是因为goland自带的dlv版本过低,升级dlv的版本即可


或者去修改dlv的默认路径:


goland debugger使用

dlv + goland 协程调试
参考文章:https://polarisxu.studygolang.com/posts/go/translation/how-to-find-goroutines-during-debugging/
使用自定义数据为 goroutine 加上标签
go func() {
labels := pprof.Labels("task", "协程唯一值")
pprof.Do(context.Background(), labels, func(_ context.Context) {
// 此处为协程执行任务
}
}()
dlv + goland 实现远程调试
- 在目标服务器安装dlv
- 将本地项目打包成二进制文件并推送到目标服务器
go build -gcflags "all=-N -l" 关闭内联优化,编译生成调试符号
- 在目标服务器执行dlv命令
dlv --listen=127.0.0.1:1234 --headless=true --api-version=2 --check-go-version=false --only-same-user=false exec main
--listen 监听端口
--headless 无头模块,接受客户端连接
--api-version 无头模式设置为2
--only-same-user 是否多用户连接
- 在goland上设置远程debug



浙公网安备 33010602011771号