“请检查 gdb 是不是经过代码签名 - 请参阅 taskgated(8)” - 如何安装带有签名的自制代码的 gdb?

     2023-03-17     65

关键词:

【中文标题】“请检查 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 -&gt; Create certificate -&gt;

选择logingdb-certCode Signing

复制/移动证书到系统钥匙串(输入密码)

    选择证书(gdb-cert) 点击Get info -> Trust Always 禁用startup-with-shell

在控制台输入:set startup-with-shell off

记住配置: echo "set startup-with-shell off" &gt;&gt; ~/. gdbinit

    启用根用户

转到System Preferences -> Users &amp; 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

【讨论】: