Mac使用gdb调试出现see taskgated(8)异常的解决办法

it2025-07-08  8

想在mac上使用gdb调试程序,调用后出现“ (please check gdb is codesigned - see taskgated(8))”无法调试,搜索引擎上找到的解决办法几乎都是的适用Mac10.14(mojava)之前的,不起作用。以下内容给出该问题在Mac OS X 10.14+之后版本的处理办法。

场景

运行gdb调试程序退出,显示以下错误消息:

Starting program: /x/y/foo Unable to find Mach task port for process-id 28885: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))

因为没有特殊权限,Darwin内核将拒绝允许gdb调试另一个进程,因为调试一个进程意味着完全控制该进程。默认情况下不允许这样做,因为这种操作可能是恶意软件利用程序做一些非法操作。

解决办法

找到“钥匙串访问”(/Applications/Utilities/Keychain Access.app),一般在“启动台”-“其他”里面可以找到。

打开后依次访问“钥匙串访问”-“证书助理”-“创建证书”。

证书名称以“gdb-cert”为例,证书类型选择“代码签名”,勾选“让我覆盖这些默认值”,一路默认“继续”,最后在“钥匙串”的地方选择“系统”。

双击穿件好的证书gdb-cert,打开信任选卡,设置其中“代码签名”的信任为“始终信任”。

创建一个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> 切换root用户,执行下面命令给证书设置xml中的内容。 codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb) 重启系统或通过重启taskgated服务刷新证书和签名数据。 sudo killall taskgated

其他

如果创建系统证书报错无法创建,需要如下操作: 先在“钥匙串”的地方选择“登录”,创建登录证书,然后进行证书导出,最后切换到系统的钥匙串,将导出的证书再导入进来即可。旧系统不支持较新版本的GDB,可以选择给GDB降级。确保文件的权限,尤其是执行权限。

英文文档: https://sourceware.org/gdb/wiki/PermissionsDarwin

最新回复(0)