安装

直接使用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调试,没有再报错。

参考