以下为本文所使用的系统环境与版本:

  • macOS Ventura 13.4.1 (c) - 英特尔芯片
  • GDB 13.2

# 背景

# 安装

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 系统默认禁止一个未授权的进程访问 / 调试其它进程(防止安全问题)。想让内核解除这种限制,最好的方法就是用系统信任的证书对它进行签名。

# 解决方案

# 创建证书

  1. 打开 钥匙串访问.app
  2. 在右上角菜单栏中 钥匙串访问 -> 证书助理 -> 创建证书
  3. 填写信息:
    • 名称:gdb_codesign
    • 身份类型:自签名根证书
    • 证书类型:代码签名
    • 勾选:让我覆盖这些默认值
  4. 使用默认设置,一直点击确定到 指定证书位置 的步骤,选择 系统 后,按提示完成创建
  5. 钥匙串访问.app 中,选择左侧栏的 系统 内的 我的证书 栏目,找到刚刚创建的 gdb_codesign 证书并双击打开 证书信息窗口 ,展开 信任 项,设置 ++ 使用此证书时: ++{.dot} 为始终信任
  6. 关闭 证书信息窗口 时,会再次输入密码。

# 对 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

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Gality 微信支付

微信支付

Gality 支付宝

支付宝