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://cloud.tencent.com/developer/article/2378458

安装: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 / 打印局部变量
print p 打印表达式的结果
set / 设置某个变量的值
vars / 查看全局变量
whatis / 查看变量类型

其他

指令 缩写 用法
disassemble disass 查看反编译后的代码,机器码
exit quit / q 退出
funcs / 打印程序用到的所有函数
help h 帮助信息
list ls / l 打印代码
posted @ 2024-11-25 21:01  3的4次方  阅读(26)  评论(0编辑  收藏  举报