安装
直接使用brew install gdb 安装, 没有安装brew的需要先安装brew。
问题
安装之后,使用过程中遇到这么一个错误:
Unable to find Mach task port for process-id 33653: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))
这是因为Darwin kernel的权限控制问题,gdb调试需要有启动一个新的进程,并且要有这个进程的权限。解决方式如下:
- 创建根证书
打开钥匙串访问-证书助力-创建证书,创建一个代码签名的自签名根证书例如:gdb-cert。
执行 security find-certificate -c gdb-cert查看创建的证书,创建成功的话输出如下:
keychain: "/Users/vector/Library/Keychains/login.keychain-db"
version: 512
class: 0x80001000
attributes:
"alis"<blob>="xxxx"
"cenc"<uint32>=0x00000003
"ctyp"<uint32>=0x00000001
[...]
确保证书没有过期 security find-certificate -p -c gdb-cert | openssl x509 -checkend 0
- 添加证书信任 创建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.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
<key>com.apple.security.cs.debugger</key>
<true/>
<key>com.apple.security.get-task-allow</key>
<true/>
</dict>
</plist>
</pre>
执行codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)。
执行codesign -vv $(which gdb)查看是否添加成功,输出如下
$: codesign -vv $(which gdb)
/usr/local/bin/gdb: valid on disk
/usr/local/bin/gdb: satisfies its Designated Requirement
- 刷新系统证书和codesign数据
执行sudo killall taskgated,重新运行gdb调试,没有再报错。