在Mac上使用GDB进行调试

 

最近搞了一台黑苹果,写CPP代码的时候需要用gcc而不是预装的llvm。通过homebrew安装gcc和gdb之后发现gdb在vscode种仍然无法正常使用。看了一下gdb的verbose log,发现其中一行错误:

->1011^error,msg=”Unable to find Mach task port for process-id 9157: (os/kern) failure (0x5).\n (please check gdb is codesigned - see taskgated(8))”

怀疑这是Mac OS的代码签名和安全性之类的问题,于是查了一些关于code sign的资料,终于搞定了。

方法记录如下。

警告:这里会生成一个用来代码签名的根证书,并用来进行代码签名。如果证书被泄漏,将会有潜在被侵入的可能性。

首先在Launchpad找到Others -> Keychain Access -> 选项 -> Certificate Assistant -> Create a Certificate。如下图。

img1

然后在弹出的创建证书窗口里填信息:

  • 名字随便写一个
  • Identify Type 选自签名跟证书(Self Signed Root)
  • Certificate Type 选择代码签名(Code Signing)
  • 最后把Let me override defaults钩上然后选择下一步。

img1

后面有一系列可以填的选项,例如过期时间(Validity Period)之类的可以多填一些,最后一步选择证书路径的下拉列表选择System。然后完成创建。

创建完成之后,在下面的位置找到刚刚创建好的证书,双击打开。

img1

然后将其中的信任设置改成Always Trust,如图:

img1

接下来是对高版本的Mac OS X至关重要的一步:找一个文件夹创建一个xml文件(这里取名gdb-entitlement.xml),并写入如下内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.cs.debugger</key>
    <true/>
</dict>
</plist>

然后重启电脑,进入终端,然后执行命令:

codesign --entitlements gdb-entitlement.xml -fs <证书名> $(which gdb)

重启之后就可以用了。

如果你使用的是Mac OS 10.12以上的版本,还需要在每次执行gdb命令之前都执行一次”set startup-with-shell off”命令,否则会在启动程序的时候卡住不动。

如果不想每次都输入,也可以将这句话写入到程序目录的路径下:

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

目前已知问题是用vscode+gdb调试的时候,仍然会出现启动卡住的情况……以后慢慢研究吧