Debugging macOS Mojave:如何实现协同设计以启用调试(gdb)?
从10.5版开始,围绕macOS的协同设计问题有很多话题。 我想要实现的是,让Geany使用GNU调试器(gdb)。在geany中可以找到调试器,但(已经很清楚)错误消息是: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
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时,调试才会起作用。这没有改变任何事情
最终我得到了:
如果有人能证实这一行为,我将不胜感激,这是一个更有效的解决方案:)我没有修改
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
拖放到系统钥匙链sudo killall taskgated
或可能的ps aux | grep taskgated
然后kill-9
Codesign-fs-gdbcert/usr/local/bin/gdb
csrutil启用--无调试
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