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

cod*_*deG 19 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))
Run Code Online (Sandbox Code Playgroud)

通常有很多限制需要考虑(应该)允许使用gdb,例如gdb 8.0.1可能有效,gdb 8.1根本不起作用 - 请参阅此处,也在Lazarus Wiki中确认.

0)我根据各种说明所涵盖的步骤创建了我的证书"gdb-cert".这里的例子

1)我遵循了对gdb可执行文件(源代码:gdbStackoverflow)进行协同处理的步骤,这在我的情况下是

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

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

$ codesign -vvvv  gdb
Run Code Online (Sandbox Code Playgroud)

在相应的目录中.我的是.

2)确保证书实际分配为有资格进行代码签名 - 这是我的情况.它也是值得信赖的 - 这是必要的.

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

sudo nano /System/Library/LaunchDaemons/com.apple.taskgated.plist
Run Code Online (Sandbox Code Playgroud)

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

4)在某些主题中,我发现调试只有csrutil enable --withouth在恢复中使用命令调试时才有效.这没有改变任何事情.

最终我得到了:

  • 代码签名证书
  • 一个gdb exectuable文件,根据我上面的声明签名
  • 没有填充字符串-sp属性的com.apple.taskgated.plist文件
  • 如果有人能证实这种行为,我会非常感激,这个解决方案更加:)

    小智 37

    这与协同设定权利相关.您必须在签名过程中添加"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>
    
    Run Code Online (Sandbox Code Playgroud)

    • 运作良好!! 你的答案应该是公认的答案. (5认同)
    • @JoshHaberman仅供参考我使用此处的说明更新了https://sourceware.org/gdb/wiki/PermissionsDarwin. (4认同)
    • 即使在此处的所有说明失败后,对我仍然有效:https://sourceware.org/gdb/wiki/BuildingOnDarwin (2认同)
    • 注意使用此答案的其他人,您必须在钥匙串助手中创建一个名为gdbcert的证书 (2认同)
    • @DomQ带有权利的签名步骤不起作用,因为它会尝试通过身份查找证书-通常是电子邮件地址,而不是证书通用名称。我在创建证书时将通用名称和电子邮件的“ gdb-cert”都放在了证书中来解决了这个问题。然后我可以运行`codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)` (2认同)