macOS Mojave:如何实现协同设计以启用调试 (gdb)?
macOS Mojave: How to achieve codesign to enable debugging (gdb)?
从 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 8.0.1 可能工作,gdb 8.1 根本不工作 - ,也在 Lazarus Wiki 中确认。
0) 我根据各种说明中涵盖的步骤创建了我的证书 "gdb-cert"。示例 here
1) 我遵循了对 gdb 可执行文件进行代码签名的步骤(来源:gdb, and Whosebug),在我的例子中是
/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 可执行文件
一个 com.apple.taskgated.plist 文件没有填充字符串 -sp 属性
如果有人能证实这种行为,我将不胜感激:)
我没有修改 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
- 打开钥匙串访问
- 在菜单中,打开 Keychain Access > Certificate Assistant > Create a Certificate
- 给它起个名字(例如
gdbcert
)
- 身份类型:自签名根
- 证书类型:代码签名
- 检查:让我覆盖默认值
- 继续使用默认选项,直到为
指定一个位置
- 将钥匙串位置设置为系统。如果这会产生以下错误:
Certificate Error: Unknown Error =-2,147,414,007
将位置设置为登录,通过单击左上角的锁解锁系统并将证书 gdbcert
拖放到 系统钥匙串 .
- 在系统钥匙串中找到证书。
- 双击证书。
- 展开 Trust,将 Code signing 设置为 Always Trust
- 在终端重新启动任务:
sudo killall taskgated
或可能 ps aux | grep taskgated
然后 kill -9 <pid>
- 按照以下步骤启用 root 帐户:
- 打开系统偏好设置
- 转到用户和组 > 解锁
- 登录选项 > 加入(网络帐户服务器旁边)
- 单击打开目录实用程序
- 转到编辑 > 启用根用户
- 使用您的证书对 gdb 进行代码设计:
codesign -fs gdbcert /usr/local/bin/gdb
我最终使用了 sudo killall taskgated && codesign -fs gdbcert /usr/local/bin/gdb
- Codesign 以 root 用户身份验证
- 关闭您的 mac 并以恢复模式重新启动(按住 command-R 直到出现 Apple 徽标)
- 打开终端window
- 修改系统完整性保护以允许调试:
csrutil enable --without debug
- 重启你的Mac。使用
gdb
进行调试现在应该可以按预期进行。
- 运行
gdb
和 sudo
;例如 sudo gdb -q ./a.out
这与代码设计权利有关。您必须在签名过程中添加 "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>
log
命令有助于解决代码签名问题。这是我使用的(在 Mojave 上):
log stream --predicate 'process == "taskgated" OR (process == "kernel" AND eventMessage CONTAINS "macOSTaskPolicy")' --info
从 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 8.0.1 可能工作,gdb 8.1 根本不工作 -
0) 我根据各种说明中涵盖的步骤创建了我的证书 "gdb-cert"。示例 here
1) 我遵循了对 gdb 可执行文件进行代码签名的步骤(来源:gdb, and Whosebug),在我的例子中是
/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 时,调试才会起作用。这并没有改变任何东西。
最终我得到了:
如果有人能证实这种行为,我将不胜感激:)
我没有修改 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
- 打开钥匙串访问
- 在菜单中,打开 Keychain Access > Certificate Assistant > Create a Certificate
- 给它起个名字(例如
gdbcert
) - 身份类型:自签名根
- 证书类型:代码签名
- 检查:让我覆盖默认值
- 继续使用默认选项,直到为 指定一个位置
- 将钥匙串位置设置为系统。如果这会产生以下错误:
Certificate Error: Unknown Error =-2,147,414,007
将位置设置为登录,通过单击左上角的锁解锁系统并将证书gdbcert
拖放到 系统钥匙串 . - 在系统钥匙串中找到证书。
- 双击证书。
- 展开 Trust,将 Code signing 设置为 Always Trust
- 在终端重新启动任务:
sudo killall taskgated
或可能ps aux | grep taskgated
然后kill -9 <pid>
- 按照以下步骤启用 root 帐户:
- 打开系统偏好设置
- 转到用户和组 > 解锁
- 登录选项 > 加入(网络帐户服务器旁边)
- 单击打开目录实用程序
- 转到编辑 > 启用根用户
- 使用您的证书对 gdb 进行代码设计:
codesign -fs gdbcert /usr/local/bin/gdb
我最终使用了sudo killall taskgated && codesign -fs gdbcert /usr/local/bin/gdb
- Codesign 以 root 用户身份验证
- 关闭您的 mac 并以恢复模式重新启动(按住 command-R 直到出现 Apple 徽标)
- 打开终端window
- 修改系统完整性保护以允许调试:
csrutil enable --without debug
- 重启你的Mac。使用
gdb
进行调试现在应该可以按预期进行。 - 运行
gdb
和sudo
;例如sudo gdb -q ./a.out
这与代码设计权利有关。您必须在签名过程中添加 "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>
log
命令有助于解决代码签名问题。这是我使用的(在 Mojave 上):
log stream --predicate 'process == "taskgated" OR (process == "kernel" AND eventMessage CONTAINS "macOSTaskPolicy")' --info