前言 @

此前在开发工作中遇到过一些偶现的并发问题,较难通过打日志和本地debug排查,因此当时使用gdb在测试环境排查问题

有人觉得gdb已经过时了,但我觉得目前仍有一些场景它能起到关键作用,此文主要介绍gdb调试go程序的基本方法

gdb配置 @

.gdbinit 是 GDB 的启动配置文件,每次 GDB 启动时都会自动执行其中的命令。

add-auto-load-safe-path用于告诉 GDB 指定路径下的 Python 脚本是 “安全的”,可以自动加载

runtime-gdb.py是 Go 语言官方提供的一个辅助调试脚本,它为 GDB 增加了很多针对 Go 运行时的调试功能,该文件一般在GOROOT目录下/src/runtime目录中

# 打开gdb初始化配置文件
vim ~/.gdbinit

# 添加runtime-gdb路径,注意替换你的GOROOT路径
add-auto-load-safe-path $GO_ROOT/src/runtime/runtime-gdb.py

go编译配置

# 关闭内联优化,方便调试
go build -gcflags "-N -l" demo.go

gdb调试

gdb ./demo

常用命令 @

  • r:run,执行程序
  • n:next,下一步,不进入函数
  • s:step,下一步,会进入函数
  • b:breakponit,设置断点
  • l:list,查看源码
  • c:continue,继续执行到下一断点
  • bt:backtrace,查看当前调用栈
  • p:print,打印查看变量
  • q:quit,退出 GDB
  • whatis:查看对象类型
  • info breakpoints:查看所有的断点
  • info locals:查看局部变量
  • info args:查看函数的参数值及要返回的变量值
  • info frame:堆栈帧信息
  • info goroutines:查看 goroutines 信息
  • goroutine 1 bt:查看指定序号的 goroutine 调用堆栈
  • 回车:重复执行上一次操作