mac 下 gdb 安装及错误排查
使用 brew 安装 gdb
```brew install gdb```
gdb签名
安装后直接使用会提示『Unable to find Mach task port for process-id』错误。这是因为 macos 下gdb 没有权限去访问其他进程,此时需要使用自签名系统证书并给 gdb 程序签名。
- 在钥匙串内创建系统证书:证书名称自定义(这里记录下证书名后续签名需要),证书类型为代码签名,勾选让我覆盖这些默认设置。
- 创建证书后在在钥匙串里 系统-我的证书 里找到创建的证书双击展开信任项,全部设为始终信任。
- 使用
whichis gdb
找到 gdb 所在路径。 - 使用
codesign -s 证书名 gdb 路径
为 gdb 程序进行签名。 - 签名完成后重启 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。