Go语言调试
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"
-gcflags是给go编译器的参数,gc是go compile的意思。
-N
是不要优化代码,-l
是禁止内联代码
使用gdb调试go程序
需要加载调试golang的扩展脚本runtime-gdb.py。gdb不能打印go中map具体的内容,只能够打印map底层的结构,用起来有点不爽。
# 在~/.gdbinit中添加
add-auto-load-safe-path /usr/share/go-1.22/src/runtime/runtime-gdb.py # 这个runtime-gdb.py文件的位置可以自行locate搜索一下
使用dlv调试go程序
安装:https://github.com/go-delve/delve
go install github.com/go-delve/delve/cmd/dlv@latest
dlv命令
指令 | 用处 |
---|---|
help | 使用手册 |
version | 查看dlv版本 |
attach | 控制一个已经运行的进程,并开始一个新的调试会话。 当退出调试会话时,你可以选择让该进程继续运行或杀死它。 |
exec | 这个命令将使Delve执行二进制文件,并立即附加到它,开始一个新的调试会话。 |
debug | 默认情况下,没有参数,Delve将编译当前目录下的 "main "包,并开始调试。或者可以指定一个包的名字,Delve将编译该包,并开始一个新的调试会话。 |
core | 调试coredump文件 |
test | test命令允许你在单元测试的背景下开始一个新的调试会话。默认情况下,Delve将调试当前目录下的测试。另外,你可以指定一个包的名称,Delve将在该包中调试测试。双破折号-- 可以用来传递参数给测试程序。 |
trace | 编译并开始调试程序 |
Go提供了环境变量
GOTRACEBACK
用于控制程序崩溃(panic)时生成的输出。 此变量还可以强制生成core dump,从而可以进行调试。可以采用不同的值来控制程序崩溃时输出的详细程度:
- none 不显示任何goroutine栈trace。
- single 默认选项,只显示当前goroutine栈trace。
- all 显示所有用户创建的goroutine栈trace。
- system 显示所有goroutine栈trace,甚至运行时的trace。
- crash 类似 system, 而且还会生成 core dump。 这个选项使我们能够在发生崩溃的情况下调试程序。
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 | 打印代码 |