# 背景
# 安装
Mac 下安装 gdb
非常简单,直接使用 homebrew
安装即可:
brew install gdb |
# 问题
直接使用 gdb
运行调试运行其他程序会出现以下报错:
(gdb) r | |
Starting program: /Users/gality/project/v8/out/xcode.debug/d8 | |
Unable to find Mach task port for process-id 13210: (os/kern) failure (0x5). | |
(please check gdb is codesigned - see taskgated(8)) |
此处错误的原因是 Mac 系统默认禁止一个未授权的进程访问 / 调试其它进程(防止安全问题)。想让内核解除这种限制,最好的方法就是用系统信任的证书对它进行签名。
# 解决方案
# 创建证书
- 打开 钥匙串访问.app
- 在右上角菜单栏中 钥匙串访问 -> 证书助理 -> 创建证书
- 填写信息:
- 名称:gdb_codesign
- 身份类型:自签名根证书
- 证书类型:代码签名
- 勾选:让我覆盖这些默认值
- 使用默认设置,一直点击确定到 指定证书位置 的步骤,选择 系统 后,按提示完成创建
- 在 钥匙串访问.app 中,选择左侧栏的 系统 内的 我的证书 栏目,找到刚刚创建的 gdb_codesign 证书并双击打开 证书信息窗口 ,展开 信任 项,设置 ++ 使用此证书时: ++{.dot} 为始终信任。
- 关闭 证书信息窗口 时,会再次输入密码。
# 对 GDB 签名
先在 家目录下
创建一个 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> | |
</pre> |
接着在 家目录
下执行以下命令,用我们刚刚创建的证书对 gdb 进行签名:
sudo codesign --entitlements gdb-entitlement.xml -fs gdb_codesign /usr/local/bin/gdb |
「如果你是用 brew install gdb
安装的 gdb
的话,那么其默认路径应该在 /usr/local/bin/gdb
,否则,可以使用 whereis gdb
命令来找到 gdb
的安装路径」
此时,再次尝试使用 GDB 去调试别的应用,就可以正常调试啦!🎉🎉🎉
# 已知 Bug
如果出现如下情况:
(gdb) r | |
Starting program: /Users/gality/project/V8/v8/out/xcode.debug/d8 | |
[New Thread 0x2303 of process 16191] |
然后卡住不动,可以使用快捷键 Ctrl + C 来中断,然后就可以正常调试了。
这个 Bug 经常出现于首次使用 gdb
调试时,中断后正常进入调试程序,且一般再次调试时就不会触发这个 Bug 了。
# 参考
- https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d
- https://blog.csdn.net/unonoi/article/details/128630330