macOS Mojave:如何实现代码签名以启用调试(gdb)?

时间:2018-10-08 09:51:52

标签: debugging gdb geany macos-mojave

从10.5开始,围绕macOS的代码签名问题有很多话题。 我想要实现的是让Geany与GNU Debugger(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根本不起作用-see here,这在Lazarus Wiki中也得到证实。

0)我根据各种说明中介绍的步骤创建了证书“ gdb-cert”。示例here

1)我遵循了对gdb可执行文件(源:gdbStackoverflow)进行代码签名的步骤,在我的情况下,该文件是

  

/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可执行文件
  • 未填充字符串-sp属性的com.apple.taskgated.plist文件
  • 如果有人能确认这种行为,我将不胜感激,甚至可以解决这个问题:)

    3 个答案:

    答案 0 :(得分:22)

    这与代码签名权利有关。您必须在签名过程中添加“ 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>
    

    答案 1 :(得分:0)

    我没有修改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. 在菜单中,打开“钥匙串访问”>“证书助手”>“创建证书”
    5. 给它起个名字(例如gdbcert
    6. 身份类型:自签名根
    7. 证书类型:代码签名
    8. 检查:让我覆盖默认设置
    9. 继续使用默认选项,直到指定位置
    10. 将“钥匙串”位置设置为“系统”。如果出现以下错误:Certificate Error: Unknown Error =-2,147,414,007将位置设置为登录,请通过单击左上角的锁来解锁系统,并将证书gdbcert拖放到系统钥匙串
    11. 系统钥匙串中找到证书。
    12. 双击证书。
    13. 展开信任,将代码签名设置为始终信任
    14. 重新启动终端机中的任务:sudo killall taskgated或可能依次为ps aux | grep taskgatedkill -9 <pid>
    15. 按照以下步骤启用root帐户:
    16. 打开系统偏好设置
    17. 转到用户和组>解锁
    18. 登录选项>加入(网络帐户服务器旁边)
    19. 点击打开目录实用工具
    20. 转到“编辑”>“启用根用户”
    21. 使用您的证书共同设计gdb:codesign -fs gdbcert /usr/local/bin/gdb我最终使用了sudo killall taskgated && codesign -fs gdbcert /usr/local/bin/gdb
    22. Codesign以root用户身份验证
    23. 关闭Mac并以恢复模式重新启动(按住Command-R直到出现Apple徽标)
    24. 打开终端窗口
    25. 修改系统完整性保护以允许调试:csrutil enable --without debug
    26. 重新启动Mac。现在可以按预期使用gdb进行调试了。
    27. 使用gdb运行sudo;例如sudo gdb -q ./a.out

    答案 2 :(得分:0)

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

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