Mac上使用 GDB 调试 Go 程序
libi   gdb mac golang

mac 下 gdb 安装及错误排查

使用 brew 安装 gdb

```brew install gdb```

gdb签名

安装后直接使用会提示『Unable to find Mach task port for process-id』错误。这是因为 macos 下gdb 没有权限去访问其他进程,此时需要使用自签名系统证书并给 gdb 程序签名。

  1. 在钥匙串内创建系统证书:证书名称自定义(这里记录下证书名后续签名需要),证书类型为代码签名,勾选让我覆盖这些默认设置。
  2. 创建证书后在在钥匙串里 系统-我的证书 里找到创建的证书双击展开信任项,全部设为始终信任。
  3. 使用whichis gdb找到 gdb 所在路径。
  4. 使用codesign -s 证书名 gdb 路径为 gdb 程序进行签名。
  5. 签名完成后重启 mac,如果还是同样的错误需要使用 roo 权限运行 gdb。 sudo gdb xxx

其他问题

签名后运行可能又出现一个 『During startup program terminated with signal ?, Unknown signal』错误。 执行以下脚本解决该错误:

echo "set startup-with-shell off" >> ~/.gdbinit

使用 gdb 调试 go 程序

go编译参数

为了方便使用 gdb 调试编译时可以加上gcflags=“-N -l”配置。

go build -gcflags="-N -l"

其中-N 代表关闭编译优化;-l 为关闭函数内联优化。更多编译配置可以使用 go tool compile查看。

另外go 在1.11版本以后因为编译器产生了很多的调试信息,编译时候默认压缩了这些调试信息,在 mac 上使用 gdb 时可能无法支持该格式。此时通过以下编译配置来禁用DWARF压缩:

-ldflags "-compressdwarf=false"。 

启动调试程序

sudo gdb ./xxx

常用gdb指令

gdb指令可以使用简写形式,完整指令可使用help查看。以下指令均为简写:

  • i file :查看当前程序入口地址及段信息。
  • r :运行程序,可以在该指令后附加程序启动参数。
  • l :输出当前程序源码及行号。
  • b :添加断点,可指定行号, 文件名:行号,函数名。使用*前缀指定地址。
  • i b:查看所有断点信息。
  • d : 删除指定编号断点。
  • s:调试步入,进入函数。
  • n:调试步进,执行下一行代码。
  • c: 继续执行,执行到下一个断点处或者程序结束。
  • bt: 打印当前堆栈信息。
  • p: 查看变量的值。
  • ptype: 查看变量类型。
  • q:退出gdb。

文档导航