关键词:
【中文标题】“请检查 gdb 是不是经过代码签名 - 请参阅 taskgated(8)” - 如何安装带有签名的自制代码的 gdb?【英文标题】:"please check gdb is codesigned - see taskgated(8)" - How to get gdb installed with homebrew code signed?“请检查 gdb 是否经过代码签名 - 请参阅 taskgated(8)” - 如何安装带有签名的自制代码的 gdb? 【发布时间】:2013-08-27 16:52:20 【问题描述】:我在 osx 10.8.4 下并且已经安装了 gdb 7.5.1 和 homebrew(动机是获得一个新的 gdb 以及 --with-python 等新功能......)
当我在一个 c++ Eclipse 项目中运行调试时,长话短说:
Error in final launch sequence
Failed to execute MI command:
-exec-run
Error message from debugger back end:
Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
我遵循了各种关于代码签名的建议
https://sourceware.org/gdb/wiki/BuildingOnDarwin 部分 http://www.noktec.be/archives/1251 进行了各种调整所以我做到了:
-
设置证书
签署 gdb -> codesign -s gdb-cert /usr/local/bin/gdb
当我在 Eclipse 中重新运行调试时,我得到与上面相同的错误“(请检查 gdb 是否经过代码签名 - 请参阅 taskgated(8))”。
如果我将 gdb 设置回旧的 gdb(在 Eclipse 的 gdb 首选项中)/usr/libexec/gdb/gdb-i386-apple-darwin,调试将按预期运行。
有任何解决方案/提示吗?
谢谢
佩尔
【问题讨论】:
这不是“安全功能”吗?换句话说,您的系统配置为只接受已正式签名的软件?如果是这样,希望有办法关闭该功能...... 好的,感谢您的反馈 - 我了解您的安全功能点,但我的问题是如何进行签名...有一个类似的帖子 ***.com/questions/12050257/gdb-fails-on-mountain-lion 还没有为我解决它 【参考方案1】:发生此错误是因为 OSX 实施了 pid 访问策略,该策略需要二进制文件的数字签名才能访问其他进程 pid。要使 gdb 能够访问其他进程,我们必须首先对二进制文件进行代码签名。此签名取决于用户必须创建并在系统中注册的特定证书。
要创建代码签名证书,请打开钥匙串访问应用程序。选择菜单 Keychain Access -> Certificate Assistant -> Create a Certificate…
为证书选择一个名称(例如 gdb-cert),将身份类型设置为自签名根,将证书类型设置为代码签名,然后选择让我覆盖默认值。单击 Continue 几次,直到出现 Specify a Location For The Certificate 屏幕,然后将 Keychain 设置为 System。
双击证书,打开信任部分,然后将代码签名设置为始终信任。退出钥匙串访问应用程序。
重启 taskgated 服务,并签署二进制文件。
$ sudo killall taskgated
$ codesign -fs gdb-cert "$(which gdb)"
来源http://andresabino.com/2015/04/14/codesign-gdb-on-mac-os-x-yosemite-10-10-2/
在 macOS 10.12 (Sierra) 及更高版本上,您还必须
使用 gdb 7.12.1 或更高版本 另外防止 gdb 使用 shell 启动要调试的程序。您可以在 gdb 中为此使用以下命令:
set startup-with-shell off
您也可以将最后一条命令放在主目录中名为 .gdbinit 的文件中,在这种情况下,每次启动 gdb 时都会自动应用它
echo "set startup-with-shell off" >> ~/.gdbinit
来源: https://sourceware.org/gdb/wiki/BuildingOnDarwin
【讨论】:
像魅力一样工作。谢谢。 正如 OP 所指出的,这对他没有用(对我来说也没有)。 它似乎不适用于带有自签名证书的macOS Sierra
。
执行sourceware.org/gdb/wiki/PermissionsDarwin 第 1 节中的所有步骤为我解决了 macOS Catalina(版本 10.15.4)上的问题。
这个答案现在对于新版本的 macOS 已经过时了;您还必须创建 gdb-entitlement.xml 并使用 --entitlements gdb-entitlement.xml 运行 codesign。您能否使用消息“macOS 10.14 及更高版本需要其他步骤,请参阅sourceware.org/gdb/wiki/PermissionsDarwin”更新此答案,或将该页面中有关 gdb-entitlement.xml 的其他信息复制到此答案中?【参考方案2】:
我升级到gdb 8.3
,但无法正常工作。
这对我有帮助:
codesign --entitlements gdb.xml -fs gdb-cert /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.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
<key>com.apple.security.cs.debugger</key>
<true/>
<key>com.apple.security.get-task-allow</key>
<true/>
</dict>
</plist>
我在这里找到了这个解决方案:https://timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/
注意:如果没有授权,我只能使用 sudo
运行 gdb
。
【讨论】:
收到error: The specified item could not be found in the keychain.
怎么办
@SridharSarnobat 首先使用管道这个答案***.com/a/32727069/339146
尝试@maximser 的答案后失败。然后这对我有用。 macOS 10.15.4、gdb 9.2 通过 brew 安装。
@SridharSarnobat:您必须先创建证书***.com/questions/35020236/…
看起来我们需要在每次新构建后重复此命令【参考方案3】:
我让 gdb 在 OSX 10.9 上工作,而没有以这种方式进行代码设计(描述为 here):
使用 macports 安装 gdb。 (也许你可以跳过它)
sudo nano /System/Library/LaunchDaemons/com.apple.taskgated.plist
在第 22 行第 27 列将选项字符串从 -s
更改为 -sp
。
重新启动计算机。
使用 gdb。如果您使用 mac 端口安装它,则必须使用 ggdb
命令。或者在你的配置文件中创建一个别名:
alias gdb='ggdb'
然后使用“gdb”命令。
【讨论】:
我遇到这个问题已经有一段时间了,发现其他方法没有帮助。这就像一个魅力。 @BillDeRose,我也一样。 @nimrodm,你的意思是“sudo gdb”?它应该是带有 macports 的“ggdb” 呃。我不想将gdb
作为sudo
运行。这似乎是一个不必要的安全风险。
不会重新启动计算机。必须有一个命令才能重新启动某些东西!【参考方案4】:
我在使用 GDB 时遇到了同样的问题。
我在Mac OS X 10.8.5
aka Mountain Lion 下奔跑。
我正在使用 GDB 版本7.7.1
。
我使用以下命令编译了我的测试程序:
g++ -o gdb-sample.out -g gdb-sample.cpp
如果我输入命令 gdb sample.out
,我会收到相同的神秘错误消息:
"Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))"
但是,此错误消息是一个红鲱鱼。
我发现对我有用的解决方案是使用超级用户 acct 简单地调用 GDB:
sudo gdb sample.out.
这对我来说很好。
从那时起,我可以在不使用 sudo 的情况下运行 GDB example.out。
希望这对其他人有所帮助和工作。 如果没有,请回复。
【讨论】:
不知道为什么这被否决了。我以 root 身份运行该命令(使用 sudo)并且它有效。【参考方案5】:这些都不适合我,我不得不长期坚持。 以下是我为使其正常工作所采取的步骤的完整列表。
-
创建证书以签署 gdb。
不幸的是,系统证书给了我Unknown Error = -2,147,414,007
,这非常有帮助,所以我不得不采用一种解决方法。
KeyChain Assistant -> Create certificate ->
选择login
、gdb-cert
、Code Signing
复制/移动证书到系统钥匙串(输入密码)
-
选择证书(
gdb-cert
) 点击Get info
-> Trust Always
禁用startup-with-shell
在控制台输入:set startup-with-shell off
记住配置:
echo "set startup-with-shell off" >> ~/. gdbinit
-
启用根用户
转到System Preferences
-> Users & Groups
-> Unlock it
-> Login Options
-> Network Account Server
-> Join
-> Unlock it
-> Edit
(菜单)-> @987654341 @
sudo killall taskgated
最终签署 gdb
codesign -fs gdb-cert "$(which gdb)"
-
禁用 Root 用户(第 4 步)
如果仍然不起作用,请重新启动。 (如果没有其他工作,很可能它已经工作了)
PS。我最终使用了lldb
,因为它可以正常工作 (tutorial)
【讨论】:
【参考方案6】:对于使用 Sierra 10.12.6(及更高版本)和 Homebrew 的任何人,/usr/local/bin/gdb
是指向/usr/local/Cellar/gdb/8.0/bin/gdb
(或任何版本,例如8.0.1
)的符号链接。
您需要对链接和目标进行共同设计:
codesign -fs gdb-cert /usr/local/bin/gdb
codesign -fs gdb-cert "/usr/local/Cellar/gdb/8.0/bin/gdb"
或者,如果您有 greadlink
(通过 brew install coreutils
安装):
codesign -fs gdb-cert $(which gdb)
codesign -fs gdb-cert $(greadlink -f $(which gdb))
【讨论】:
你在 High Sierra 上试过了吗?它在操作系统上对我不起作用:10.13.6【参考方案7】:这可能不相关。您可以在 macos 上使用 lldb 而不是 gdb。安装 gdb 不需要这些麻烦。
lldb(http://lldb.llvm.org) 已经默认安装在 High Sierra 中
【讨论】:
【参考方案8】:我想知道highest voted answer here 的全局变化是否会产生一些意想不到的后果。
taskgated 允许运行已签名的代码,而不是启用旧的 Tiger 约定。所以最好只为 gdb 获得一个签名证书,类似于answer here。
在此之后,我能够sudo
使用 gdb。如果您需要使用不带 sudo 的 gdb,那么可能是 this link will help,但免责声明,我还没有尝试过,因为现在使用 sudo
是一个不错的解决方案`。
【讨论】:
【参考方案9】:这就是在 Big Sur 上对我有用的方法:https://dev.to/jasonelwood/setup-gdb-on-macos-in-2020-489k。其他指南中缺少的关键步骤是用于协同设计的 --entitlements gdb-entitlement.xml 选项:
我在此处复制文件 gdb-entitlement.xml 以供参考,以防链接站点消失: codesign --entitlements gdb-entitlement.xml -fs
其中是证书的名称,是 gdb 可执行文件的路径
<!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.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
<key>com.apple.security.cs.debugger</key>
<true/>
<key>com.apple.security.get-task-allow</key>
<true/>
</dict>
</plist>
'''
【讨论】:
【参考方案10】:我可以建议遵循以下要点: https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md
需要克服的技巧:unknown error = -2,147,414,007
在此处描述的证书创建期间:
https://apple.stackexchange.com/a/309123
注意事项:
安装为homebrew
包的gdb 路径应类似于:/usr/local/Cellar/gdb/9.2/bin/gdb
而csrutil enable --without debug
将引发关于requesting unsupported configuration
的消息,如下所示:
https://totalfinder.binaryage.com/system-integrity-protection
测试:
○ → sw_vers -productVersion
10.13.6
○ → gdb ./a.out
GNU gdb (GDB) 9.2
...
Thread 3 hit Breakpoint 1, main () at main.c:14
14 data_t d = 0;
【讨论】:
【参考方案11】:gdb 8.3;
我的问题和上面那个人一样, 解决了
codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
【讨论】: