如何在 OS X Mojave 上协同设计 gdb?

cam*_*rcu 7 mac gdb code-signing macos-mojave

从自制软件(通过$ brew install gdb)安装 gdb 后,我按照这些说明授予 gdb 附加到进程的权限。

当我到达运行命令的步骤时:

$ codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误,退出代码为 1:

/usr/local/bin/gdb: errSecInternalComponent
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚出了什么问题,因此无法继续安装 gdb 的工作版本。有什么帮助吗?

额外信息:

  • Mac OS X 版本 10.14.4

  • GDB 8.3 版(通过自制软件)

  • 将我的用户添加到_developer组中;没有帮助

  • 尝试重新启动我的机器sudo killall taskgated但无济于事

  • 尝试安装早期版本的 GDB (8.0.1),但得到相同的结果

cam*_*rcu 9

我发现如果我在尝试完成gdb 签名说明之前首先按照这些说明创建证书,我能够让它工作。唯一的例外是我必须将证书保存在系统钥匙串中,而不是将其移回登录。

这是一组合并的步骤:

创建具有正确权限的证书

  1. 启动 /Applications/Utilities/Keychain Access.app
  2. 在钥匙串访问中,在窗口左上角的“钥匙串”列表中选择“登录”钥匙串。
  3. 选择以下菜单项:
    • 钥匙串访问->证书助手->创建证书...
  4. 设置以下设置:
    • 名称 = "gdb-cert"
    • 身份类型 = 自签名根
    • 证书类型 = 代码签名
    • 点击创建
    • 可自定义有效期(3650天=10年)
    • 点击继续
    • 点击完成
  5. 点击“我的证书”
  6. 双击您的新“gdb-cert”证书
  7. 关闭“信任”披露三角形,滚动到“代码签名”信任下拉菜单并选择“始终信任”并根据需要使用您的用户名和密码进行身份验证。
  8. 将新的“gdb-cert”代码签名证书(不是同名的公钥或私钥)从“登录”钥匙串拖到主钥匙串访问窗口左侧钥匙串窗格中的“系统”钥匙串. 这会将此证书移动到“系统”钥匙串。您必须再授权几次,并在询问时将其设置为“始终受信任”。
  9. 在钥匙串访问 GUI 中,单击“系统”钥匙串中的“gdb-cert”并将其拖到桌面上。拖动将创建一个“~/Desktop/gdb-cert.cer”文件,用于下一步。
  10. 切换到终端,然后运行以下命令:
    1. sudo security add-trust -d -r trustRoot -p basic -p codeSign -k /Library/Keychains/System.keychain ~/Desktop/gdb-cert.cer
    2. rm -f ~/Desktop/gdb-cert.cer
  11. 将“gdb-cert”证书从“系统”钥匙串拖回到“登录”钥匙串中(也许又回来了......?)编辑:显然没有必要,根据评论
  12. 退出钥匙串访问
  13. 重启

检查证书:

  1. security find-certificate -c gdb-cert -> 应该显示有关证书的一些详细信息,如果可以找到的话
  2. security find-certificate -p -c gdb-cert | openssl x509 -checkend 0 -> 应该说证书不会过期
  3. security dump-trust-settings -d -> 应该显示此证书启用了代码签名信任设置(可能会显示其他证书/权限)

创建“entitlements.xml”文件:

复制下面的文本并将其保存在当前目录中的“entitlements.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>
Run Code Online (Sandbox Code Playgroud)

签署调试器二进制文件

在终端中运行以下命令:

  1. codesign --entitlements entitlements.xml -fs gdb-cert $(which gdb) -> 具有权利的协同设计
  2. codesign -vv $(which gdb) -> 验证协同设计
  3. codesign -d --entitlements - $(which gdb) -> 显示代码签名的详细信息

刷新系统证书

重启机器