从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可执行文件(源:gdb和Stackoverflow)进行代码签名的步骤,在我的情况下,该文件是
/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时,调试才能起作用。这什么都没改变。
最终我最终遇到了
如果有人能确认这种行为,我将不胜感激,甚至可以解决这个问题:)
答案 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
,因此您列出的任何文本编辑器都没有问题。不幸的是,我正在使用的修复程序确实需要我将gdb
与sudo
一起运行(对于High Sierra的修复程序,我不需要此操作)。没有使用Geany,但是这些是我在Mac Mojave上用于gdb
的略微修改的步骤(感谢原始作者发表了有关High Sierra的说明)
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/9ec9fb27a33698fc7636afce5c1c16787e9ce3f3/Formula/gdb.rb
。brew pin gdb
gdbcert
)Certificate Error: Unknown Error =-2,147,414,007
将位置设置为登录,请通过单击左上角的锁来解锁系统,并将证书gdbcert
拖放到系统钥匙串。sudo killall taskgated
或可能依次为ps aux | grep taskgated
和kill -9 <pid>
codesign -fs gdbcert /usr/local/bin/gdb
我最终使用了sudo killall taskgated && codesign -fs gdbcert /usr/local/bin/gdb
csrutil enable --without debug
gdb
进行调试了。gdb
运行sudo
;例如sudo gdb -q ./a.out
答案 2 :(得分:0)
log
命令有助于解决代码签名问题。这是我使用的(在Mojave上):
log stream --predicate 'process == "taskgated" OR (process == "kernel" AND eventMessage CONTAINS "macOSTaskPolicy")' --info