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

Debugging macOS Mojave:如何实现协同设计以启用调试(gdb)?,debugging,gdb,geany,macos-mojave,Debugging,Gdb,Geany,Macos Mojave,从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 taskgat

从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 80.1可以工作,GDB 8.1根本不能工作,也在Lazarus Wiki中确认。 0)我根据各种说明中包含的步骤创建了我的证书“gdb cert”。范例

1) 我遵循了对gdb可执行文件(源代码:,和)进行代码签名的步骤,在本例中,该文件位于

/usr/local/Cell/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-visualstudio-在插入-sp到文件后全部损坏)

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

最终我得到了:
  • 代码签名证书
  • 一个gdb可执行文件,根据我上面的声明签名
  • com.apple.taskgated.plist文件未填充字符串-sp属性

  • 如果有人能证实这一行为,我将不胜感激,这是一个更有效的解决方案:)

    我没有修改
    com.apple.taskgated.plist
    ,因此您列出的任何文本编辑器都没有问题。不幸的是,我正在使用的修复程序确实需要我用
    sudo
    运行
    gdb
    (我在High Sierra上的修复程序不需要)。不使用Geany,但这些是我在Mac Mojave上为
    gdb
    使用的稍加修改的步骤(感谢发表High Sierra说明的原作者):

  • 运行
    brew安装https://raw.githubusercontent.com/Homebrew/homebrew-core/9ec9fb27a33698fc7636afce5c1c16787e9ce3f3/Formula/gdb.rb
  • 跟随
    brew pin gdb
  • 开放式钥匙链访问
  • 在菜单中,打开钥匙链访问>证书助手>创建证书
  • 给它一个名称(例如,
    gdbcert
  • 标识类型:自签名根
  • 证书类型:代码签名
  • 检查:让我覆盖默认值
  • 继续使用默认选项,直到为指定位置为止
  • 将钥匙链位置设置为系统。如果这产生以下错误:
    证书错误:未知错误=-2147414007
    设置登录位置,单击左上角的锁解锁系统,然后将证书
    gdbcert
    拖放到系统钥匙链
  • 在系统密钥链中查找证书
  • 双击证书
  • 展开信任,将代码签名设置为“始终信任”
  • 重新启动终端中的taskgated:
    sudo killall taskgated
    或可能的
    ps aux | grep taskgated
    然后
    kill-9
  • 通过以下步骤启用根帐户:
  • 开放系统首选项
  • 转到用户组>解锁(&G)
  • 登录选项>加入(网络帐户服务器旁)
  • 单击打开目录实用程序
  • 转到编辑>启用根用户
  • 使用您的证书对gdb进行代码设计:
    Codesign-fs-gdbcert/usr/local/bin/gdb
  • 代码设计作为根用户进行身份验证
  • 关闭mac并在恢复模式下重新启动(按住command-R直到出现Apple徽标)
  • 打开终端窗口
  • 修改系统完整性保护以允许调试:
    csrutil启用--无调试
  • 重新启动你的Mac。使用
    gdb
    进行调试现在应该可以正常工作了
  • 使用
    sudo
    运行
    gdb
    ;例如
    sudo gdb-q./a.out

  • 这与共同设计权利有关。您必须在签名过程中添加“com.apple.security.cs.debugger”密钥

    例如,您必须将
    codesign-fs-gdbcert/usr/local/bin/gdb
    更改为
    codesign-entications-gdb.xml-fs-gdbcert/usr/local/bin/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>
    
    
    com.apple.security.cs.debugger
    
    使用
    log
    命令有助于解决代码签名问题。以下是我(在莫哈韦)使用的:

    日志流--谓词“进程==“任务门控”或(进程==“内核”且事件消息包含“macOSTaskPolicy”)--信息
    

    对我不起作用:它运行得很好!!你的答案应该是被接受的。即使这里的所有说明都失败了,对我也有效:@JoshHaberman FYI我更新了这里的说明。请注意使用此答案的其他人,您必须在keychain中创建名为gdbcert的证书assistant@DomQ带有授权的签名步骤不起作用,因为它试图通过身份(通常是电子邮件地址,而不是证书通用名)查找证书。当我创建证书时,我在证书中同时为普通名称和电子邮件添加了“gdb证书”,从而绕过了这个问题。然后我可以运行
    codesign--authentications-gdb-authentication.xml-fs