Skip to Content

使用 GDB 调试 Golang 程序

Posted on One min read

/usr/local/go/src/runtime/runtime-gdb.py

♧ save breakpoints ~/idevz.motan-go.gdb.brks Saved to file ‘/root/idevz.motan-go.gdb.brks’.

Golang 调试编译相关参数

删除调试符号:go build -ldflags “-s -w”

-s: 去掉符号信息。 -w: 去掉DWARF调试信息。 关闭内联优化:go build -gcflags “-N -l”

不能直接对 go run 的进程 GDB 调试

go run 命令创建的二进制文件,没有带 debuginfo,所以不能对他使用 GDB 进行调试。 虽然说在 GDB 运行过程中,可以通过 file 指令来载入要调试的程序,但是前提是待调试的程序有 debuginfo。

全局变量操作

  1. info variables 变量名
  2. p ‘上一步的结果’

断点操作

# 添加断点
b 
# 删除断点
d breakpoints 断点编号
# 查看断点信息
i b

(gdb) info goroutines // 查看 goroutines 信息。

(gdb) goroutine 1 bt // 当前 goroutine 调用堆栈。 (gdb) bt // 查看当前调⽤堆栈,可以与当前 goroutine 调用堆栈对比。 (gdb) info frame // 堆栈帧信息。 (gdb) info locals // 查看局部变量。 (gdb) p $len(s) // 获取对象长度($cap) (gdb) whatis i // 查看对象类型。 (gdb) c // 继续执行,触发 breakpoint() 断点。 (gdb) n // 从 breakpoint() 中出来,执行源码下一行代码。 (gdb) info args // 从参数信息中,我们可以看到命名返回参数的值。 (gdb) x/3xw &r // 查看 r 内存数据。(指针 8 + 长度 4) (gdb) x/15xb 0×42121240 // 查看字符串字节数组

使用 delve 调试 golang 程序

https://yq.aliyun.com/articles/57578 (dlv) b main.go:16 #在 main.go 的第 16 行设置断点。 (dlv) bp #查看当前所有断点 (dlv) c #运行到下一个断点或者程序结尾 (dlv) p a #打印变量 a 的值 (dlv) n #单步执行代码 (dlv) set a=1 #设置变量a 的值 (dlv) goroutines #打印所有的goroutine (dlv) goroutine #打印当前的或者指定的goroutine信息

comments powered by Disqus