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://zhuanlan.zhihu.com/p/670644118
安装:https://github.com/go-delve/delve
go install github.com/go-delve/delve/cmd/dlv@latest
go版本小于1.16的用下面方式安装
git clone https://github.com/go-delve/delve
cd delve
go install github.com/go-delve/delve/cmd/dlv
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 | / | 把你想要监控的变量,在每执行一行的时候都打印出来。 | 
| locals | / | 打印局部变量 | 
| p | 打印表达式的结果 | |
| set | / | 设置某个变量的值 | 
| vars | / | 查看全局变量 | 
| whatis | / | 查看变量类型 | 
其他
| 指令 | 缩写 | 用法 | 
|---|---|---|
| disassemble | disass | 查看反编译后的代码,机器码 | 
| exit | quit / q | 退出 | 
| funcs | / | 打印程序用到的所有函数 | 
| help | h | 帮助信息 | 
| list | ls / l | 打印代码 | 
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号