macOS Mojave:如何实现协同设计以启用调试 (gdb)?

macOS Mojave: How to achieve codesign to enable debugging (gdb)?

从 10.5 开始,有许多主题涉及 macOS 的协同设计问题。 我想要实现的是,让 Geany 与 GNU 调试器 (gdb) 一起工作。在 geany 中找到了调试器,但(已经众所周知的)错误消息是:

Error message from debugger back end:
Unable to find Mach task port for process-id 39847: (os/kern) failure (0x5).\n (please check gdb is codesigned - see taskgated(8))
Unable to find Mach task port for process-id 39847: (os/kern) failure (0x5).\n (please check gdb is codesigned - see taskgated(8))

通常有很多限制需要考虑(应该)允许使用 gdb,例如gdb 8.0.1 可能工作,gdb 8.1 根本不工作 - ,也在 Lazarus Wiki 中确认。

0) 我根据各种说明中涵盖的步骤创建了我的证书 "gdb-cert"。示例 here

1) 我遵循了对 gdb 可执行文件进行代码签名的步骤(来源:gdb, and Whosebug),在我的例子中是

/usr/local/Cellar/gdb/8.0.1/bin/gdb

(再次注意,某些语言的 8.1 存在问题 - Pascal 也是如此)。如果您想确保代码已签名,请转到

$ codesign -vvvv  gdb

在各自的目录中。我的是。

2) 确保实际分配的证书有资格进行代码签名 - 就我而言。它也是可信的——这是必要的。

3) 我还尝试了另一种方法来获取上述 gdb 运行,其中编辑了文件(请注意,必须首先在恢复中禁用 SIP!!!!) 只有在恢复中使用 csrutil disable 时,修改才有效。

sudo nano /System/Library/LaunchDaemons/com.apple.taskgated.plist

毁灭性的事情,在这一步之后,没有代码编辑器会再次启动 (!!),直到撤消此更改(Geany、Atom、文本编辑器、MS Visual Studio - 将 -sp 插入文件后全部损坏)

4) 在某些主题中,我发现只有在恢复中使用命令 csrutil enable --withouth debug 时,调试才会起作用。这并没有改变任何东西。

最终我得到了:

  • 用于代码签名的证书
  • 根据我上面的声明签名的 gdb 可执行文件
  • 一个 com.apple.taskgated.plist 文件没有填充字符串 -sp 属性
  • 如果有人能证实这种行为,我将不胜感激:)

    我没有修改 com.apple.taskgated.plist,所以您列出的任何文本编辑器都没有问题。不幸的是,我正在使用的修复确实需要我 运行 gdbsudo (我不需要我在 High Sierra 上的修复)。不使用 Geany,但这些是我在 Mac Mojave 上用于 gdb 的略微修改的步骤(感谢发布 High Sierra 说明的原作者):

    1. 运行 brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/9ec9fb27a33698fc7636afce5c1c16787e9ce3f3/Formula/gdb.rb.
    2. 跟随brew pin gdb
    3. 打开钥匙串访问
    4. 在菜单中,打开 Keychain Access > Certificate Assistant > Create a Certificate
    5. 给它起个名字(例如gdbcert
    6. 身份类型:自签名根
    7. 证书类型:代码签名
    8. 检查:让我覆盖默认值
    9. 继续使用默认选项,直到
    10. 指定一个位置
    11. 将钥匙串位置设置为系统。如果这会产生以下错误:Certificate Error: Unknown Error =-2,147,414,007 将位置设置为登录,通过单击左上角的锁解锁系统并将证书 gdbcert 拖放到 系统钥匙串 .
    12. 系统钥匙串中找到证书。
    13. 双击证书。
    14. 展开 Trust,将 Code signing 设置为 Always Trust
    15. 在终端重新启动任务:sudo killall taskgated 或可能 ps aux | grep taskgated 然后 kill -9 <pid>
    16. 按照以下步骤启用 root 帐户:
    17. 打开系统偏好设置
    18. 转到用户和组 > 解锁
    19. 登录选项 > 加入(网络帐户服务器旁边)
    20. 单击打开目录实用程序
    21. 转到编辑 > 启用根用户
    22. 使用您的证书对 gdb 进行代码设计:codesign -fs gdbcert /usr/local/bin/gdb 我最终使用了 sudo killall taskgated && codesign -fs gdbcert /usr/local/bin/gdb
    23. Codesign 以 root 用户身份验证
    24. 关闭您的 mac 并以恢复模式重新启动(按住 command-R 直到出现 Apple 徽标)
    25. 打开终端window
    26. 修改系统完整性保护以允许调试:csrutil enable --without debug
    27. 重启你的Mac。使用 gdb 进行调试现在应该可以按预期进行。
    28. 运行 gdbsudo;例如 sudo gdb -q ./a.out

    这与代码设计权利有关。您必须在签名过程中添加 "com.apple.security.cs.debugger" 密钥。

    例如,您必须将 codesign -fs gdbcert /usr/local/bin/gdb 更改为 codesign --entitlements gdb.xml -fs gdbcert /usr/local/bin/gdb

    gdb.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>
    

    log 命令有助于解决代码签名问题。这是我使用的(在 Mojave 上):

    log stream --predicate 'process == "taskgated" OR (process == "kernel" AND eventMessage CONTAINS "macOSTaskPolicy")' --info