MacOS Mojave 上 GDB 调试配置
最近在 MacOS 上写代码,需要使用 gdb 进行调试,踩了一些坑,因此在这里做一个简要记录。稍微搜索一下我们就可以知道要在 MacOS 上使用 gdb 需要先创建一个自签名证书(看这里)。
但是我们在 Mojave 上按照文章给出的方式进行,还是出现下面的错误。
1 | Unable to find Mach task port for process-id 432: (os/kern) failure (0x5). |
在这个过程中,我还遇到了不能创建系统证书的问题。
解决方法
首先,系统证书的问题可以通过先创建一个登陆证书,然后将其拖拽到系统条目下即可。那么证书的问题就可以解决了,原以为就可以高高兴兴的调试代码了,可是发现还是出现 Unable to find Mach task ...
错误。
- Open Keychain Access
- In menu, open Keychain Access > Certificate Assistant > Create a certificate
- Give it a name (e.g. gdbc)
- Identity type: Self Signed Root
- Certificate type: Code Signing
- Check: let me override defaults
- Continue until “specify a location for…”
- Set Keychain location to System
- Create certificate and close Certificate Assistant.
- Find certificate in System keychain.
- Double click certificate
- Expand Trust, set Code signing to always trust
- Restart taskgated in terminal:
killall taskgated
实际上我们在上面的步骤 7 是选择的 Login
而非 System
,在证书创建成功之后在将其拖拽到 System
类别下的。我只执行到了步骤 10,之后的步骤便没有继续执行。而是使用下面的方式,
原来是代码签署权利的问题。原文如下:
This is related to codesign entitlements. you must add “com.apple.security.cs.debugger” key in signing process.
for example you must change
codesign -fs gdbcert /usr/local/bin/gdb
tocodesign --entitlements gdb.xml -fs gdbcert /usr/local/bin/gdb
.
gdb.xml
content must something like following code.
1
2
3
4
5
6
7
8 <?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
时采用了如下命令:
1 | $ cat gdb.xml |
按照上面命令执行之后,果然能愉快的使用 gdb 了。
参考
[1] https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d
[2] https://stackoverflow.com/questions/52699661/macos-mojave-how-to-achieve-codesign-to-enable-debugging-gdb