Go语言调试
Go 语言支持 GDB、LLDB 和 Delve 几种调试器。其中 GDB 是最早支持的调试工具,Delve 则是专门为 Go 语言设计开发的调试工具。在调试 Go 程序时,Delve 是 GDB 的更好替代方案,它比 GDB 更了解 Go 的运行时、数据结构和表达式。
注意:以下调试方法都需要在编译go程序时关闭内联和优化,否则打印变量会提示No symbol in current context,断点打不上之类。
- 1.10及以后,编译时需指定
-gcflags="all=-N -l"
- 1.10之前,编译时需指定
-gcflags="-N -l"
使用gdb调试go程序
# 在~/.gdbinit中添加
add-auto-load-safe-path /usr/share/go-1.22/src/runtime/runtime-gdb.py # 这个runtime-gdb.py文件的位置可以自行locate搜索一下
使用dlv调试go程序
参考:https://zhuanlan.zhihu.com/p/670644118、https://cloud.tencent.com/developer/article/2378458
安装:https://github.com/go-delve/delve
go install github.com/go-delve/delve/cmd/dlv@latest
dlv命令
指令 | 用处 |
---|---|
attach | 控制一个已经运行的进程,并开始一个新的调试会话。 当退出调试会话时,你可以选择让该进程继续运行或杀死它。 |
exec | 这个命令将使Delve执行二进制文件,并立即附加到它,开始一个新的调试会话。 |
help | 使用手册 |
debug | 默认情况下,没有参数,Delve将编译当前目录下的 "main "包,并开始调试。或者可以指定一个包的名字,Delve将编译该包,并开始一个新的调试会话。 |
test | test命令允许你在单元测试的背景下开始一个新的调试会话。默认情况下,Delve将调试当前目录下的测试。另外,你可以指定一个包的名称,Delve将在该包中调试测试。双破折号-- 可以用来传递参数给测试程序。 |
version | 查看dlv版本 |
dlv调试指令
断点管理
指令 | 缩写 | 用法 |
---|---|---|
break | b | 设置断点 |
breakpoints | bp | 查看当前所有断点 |
clear | / | 删除断点 |
clearall | / | 删除多个断点 |
toggle | / | 启用或关闭断点 |
程序执行中的调试指令
指令 | 缩写 | 用法 |
---|---|---|
continue | c | 继续执行到一个断点或者程序结束吗 |
next | n | 执行下一行代码 |
restart | r | 重新执行程序 |
step | s | 执行代码的下一步 |
step-instruction | si | 执行下一行机器码 |
stepout | so | 跳出当前执行函数 |
frame、up、down | 切换栈帧 | |
stack | bt | 打印调用堆栈 |
goroutines | grs | 显示所有 goroutines |
goroutine | gr | 切换到某个 goroutine 的上下文去 |
参数管理
指令 | 缩写 | 用法 |
---|---|---|
args | / | 打印函数参数 |
display | / | 打印加入到display的变量的值,每次执行下一行代码或下一个断点时 |
locals | / | 打印局部变量 |
p | 打印表达式的结果 | |
set | / | 设置某个变量的值 |
vars | / | 查看全局变量 |
whatis | / | 查看变量类型 |
其他
指令 | 缩写 | 用法 |
---|---|---|
disassemble | disass | 查看反编译后的代码,机器码 |
exit | quit / q | 退出 |
funcs | / | 打印程序用到的所有函数 |
help | h | 帮助信息 |
list | ls / l | 打印代码 |