“请检查 gdb 是共同设计的-见任务门(8)”-如何让 gdb 安装自制代码签名?

我在 osx10.8.4下安装了自制的 gdb7.5.1(动机使用新特性获得一个新的 gdb,比如—— with-python 等等... ...)。. )

长话短说,当我在 c + + Eclipse 项目中运行 debug 时,我得到:

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))

对于代码签名,我采纳了各种建议

所以我照做了:

  1. 设置证书
  2. 签名 gdb-> codesign-s gdb-cert/usr/local/bin/gdb

当我在 Eclipse 中重新运行调试时,我得到了与上面相同的错误“(请检查 gdb 是否是协同设计的-参见 taskgate (8))”。

如果我将 gdb 设置回较早的 gdb (在 Eclipse 的 gdb 首选项中)/usr/libexec/gdb/gdb-i386-apple-darwin,调试将按预期运行。

有什么解决办法或提示吗?

谢谢

Pelle

71943 次浏览

我让 gdb 在 OSX 10.9上工作,而没有以这种方式进行协同设计(对 给你进行了描述) :

  1. 使用 macports 安装 gdb (也许可以跳过它)

  2. sudo nano /System/Library/LaunchDaemons/com.apple.taskgated.plist

    在第22行 col27处将选项字符串从 -s更改为 -sp

  3. 重启电脑。

  4. 使用 gdb。如果您使用 mac 端口安装它,那么您必须使用 ggdb命令。或在配置文件中创建别名:

alias gdb='ggdb'

然后使用“ gdb”命令。

我想知道,美国商业银行0指数的全球变化是否有一些意外后果。

与启用旧的 Tiger 约定不同,taskgate 允许运行带签名的代码。因此,最好只获得 gdb 的签名证书,类似于 回答我

在此之后,我能够 sudo使用 gdb。如果您需要使用 gdb w/o sudo,那么可能使用 这个链接会有帮助,免责声明,我还没有试过它,因为目前使用 sudo是一个 OK 的解决方案。

我在广发银行遇到过同样的问题。 我跑下 Mac OS X 10.8.5又名山狮。 我使用的是 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))"

然而,这个错误消息是一条红鲱鱼。

我发现对我有效的解决方案是使用超级用户帐户简单地调用 GDB:

sudo gdb sample.out.

我没意见。

从那时起,我就可以在不使用 sudo 的情况下运行 GDB example.out。

希望这对其他人也有帮助。 如果不行就回复。

发生此错误是因为 OSX 实现了一个 pid 访问策略,该策略要求二进制文件具有数字签名才能访问其他进程 pid。要启用 gdb 对其他进程的访问,我们必须首先对二进制进程进行代码签名。此签名依赖于特定的证书,用户必须创建该证书并在系统中注册。

若要创建代码签名证书,请打开 Keychain Access 应用程序。选择菜单 Keychain Access-> 证书助理-> 创建证书..。

为证书选择一个名称(例如,gdb-cert) ,将 Identity Type 设置为 Self Signed Root,将 Securities Type 设置为 Code Signing,并选择 Let me 覆盖默认值。在“继续”上单击多次,直到到达“为证书指定位置”屏幕,然后将 Keychain 设置为 System。

双击证书,打开“信任”部分,并将代码签名设置为“始终信任”。退出 Keychain Access 应用程序。

重新启动任务门服务,并对二进制文件进行签名。

$ 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

对于任何使用 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))

这些对我来说都不管用,我必须长期坚持下去。 下面是我为了让它工作所做的一系列步骤。

  1. 创建用于签名 gdb 的证书。

不幸的是,系统证书给了我 Unknown Error = -2,147,414,007,这是非常有用的,所以我不得不采取变通办法。 Keychain Access -> Create certificate ->

选择 logingdb-certCode Signing

将证书复制/移动到 System keychain (输入密码)

  1. 选择凭证(gdb-cert)单击 Get info-> Trust Always
  2. 关闭 startup-with-shell

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

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

  1. 启用根用户

转到 System Preferences-> Users & Groups-> Unlock it-> Login Options-> Network Account Server-> Join-> Unlock it-> Edit(菜单)-> Enable Root User

  1. sudo killall taskgated
  2. 最后签下 gdb

codesign -fs gdb-cert "$(which gdb)"

  1. 禁用根用户(步骤4)
  2. 重新启动如果仍然不工作。(如果没有其他工作,很可能它已经工作)

另外,我最终使用了 lldb,因为它可以正常工作(教程)

这可能没什么关系。您可以在 macos 上使用 lldb 而不是 gdb。安装 gdb 不需要这么麻烦。

缺省情况下,在 High Sierra 中已经安装了 lldb (http://lldb.llvm.org)

我升级到 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

Gdb 8.3;

我的问题和上面那个人一样, 解决了

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb

我可以建议遵循以下要点: 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};

这就是我在《大苏尔: https://dev.to/jasonelwood/setup-gdb-on-macos-in-2020-489k》中的成功之处。其他指南中缺少的关键步骤是用于协同设计的—— entiments gdb-entitlement.xml 选项:

我在这里复制了文件 gdb-entitlement.xml,以备链接站点消失时参考: Codesign ——权利 gdb-entitlement.xml-fs

其中 <gdb-cert>是证书的名称并且是 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>