122

我在 osx 10.8.4 下并且已经安装了带有自制软件的 gdb 7.5.1(动机是获得一个具有新功能的新 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))

我遵循了各种关于代码签名的建议

所以我做了:

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

当我在 Eclipse 中重新运行调试时,我得到与上面相同的错误“(请检查 gdb 是代码签名的 - 请参阅 taskgated(8))”。

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

有任何解决方案/提示吗?

谢谢

佩尔

4

11 回答 11

150

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

要创建代码签名证书,请打开 Keychain Access 应用程序。选择菜单 Keychain Access -> Certificate Assistant -> Create a Certificate…</p>

为证书选择一个名称(例如,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

于 2015-09-22T21:14:47.430 回答
57

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

注意:如果没有权利,我gdb只能使用sudo.

于 2019-08-07T15:42:26.660 回答
29

我让 gdb 在 OSX 10.9 上工作而没有以这种方式进行代码设计(在此处描述):

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

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

    在第 22 行,第 27 列将选项字符串从 更改-s-sp

  3. 重新启动计算机。

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

alias gdb='ggdb'

然后使用'gdb'命令。

于 2013-11-18T12:55:30.423 回答
28

我在 GDB 上遇到了同样的问题。我在Mac OS X 10.8.5又名山狮下奔跑。我正在使用 GDB 版本7.7.1

我使用以下命令编译了我的测试程序:

g++ -o gdb-sample.out -g gdb-sample.cpp    

如果我输入 command 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。

希望这对其他人有所帮助和工作。如果没有,请回复。

于 2015-01-18T00:05:50.307 回答
9

这些都不适合我,我必须长期坚持。这是我为使其正常工作所采取的步骤的完整列表。

  1. 创建证书以签署 gdb。

不幸的是,系统证书给了我Unknown Error = -2,147,414,007非常有帮助,所以我不得不采取一种解决方法。 KeyChain Assistant -> Create certificate ->

选择login, gdb-cert,Code Signing

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

  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. 如果仍然不起作用,请重新启动。(如果没有其他工作,很可能它已经工作了)

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

于 2018-02-09T10:23:12.633 回答
7

对于使用 Sierra 10.12.6(及更高版本)和 Homebrew 的任何人,它是指向(或任何版本,例如)/usr/local/bin/gdb的符号链接。/usr/local/Cellar/gdb/8.0/bin/gdb8.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))
于 2017-08-31T05:12:25.447 回答
5

这可能不相关。您可以在 macos 上使用 lldb 而不是 gdb。你不需要这个麻烦来安装 gdb。

lldb( http://lldb.llvm.org ) 在 High Sierra 中已经默认安装

于 2018-07-08T06:08:42.563 回答
3

我想知道这里最高投票答案的全球变化是否会产生一些意想不到的后果。

taskgated 并没有启用旧的 Tiger 约定,而是允许运行签名的代码。因此,最好为 gdb 获得签名证书,类似于此处的答案

在此之后,我能够sudo使用 gdb。如果您需要使用不带 sudo 的 gdb,那么也许这个链接会有所帮助,免责声明,我还没有尝试过,因为现在使用sudo是一个好的解决方案`。

于 2014-12-26T19:29:21.993 回答
2

这就是在 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>
'''
于 2021-04-13T23:04:22.140 回答
0

我可以建议遵循这个要点: 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};
于 2020-07-21T21:20:44.260 回答
-1

gdb 8.3;

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

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
于 2019-08-22T07:49:27.273 回答