前言 @
此前在开发工作中遇到过一些偶现的并发问题,较难通过打日志和本地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 调用堆栈
- 回车:重复执行上一次操作