c++ - "please check gdb is codesigned - see taskgated(8)"- 如何使用签名的 Homebrew 代码安装 gdb?

标签 c++ eclipse macos gdb homebrew

我在 osx 10.8.4 下并且已经安装了带有 Homebrew 软件的 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,调试将按预期运行。

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

谢谢

佩尔

最佳答案

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

要创建代码签名证书,请打开钥匙串(keychain)访问应用程序。选择菜单 Keychain Access -> Certificate Assistant -> Create a Certificate…

为证书选择一个名称(例如 gdb-cert),将身份类型设置为自签名根,将证书类型设置为代码签名,然后选择让我覆盖默认值。单击 Continue 几次,直到出现 Specify a Location For The Certificate 屏幕,然后将 Keychain 设置为 System。

双击证书,打开信任部分,将代码签名设置为始终信任。退出钥匙串(keychain)访问应用程序。

重启 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

关于c++ - "please check gdb is codesigned - see taskgated(8)"- 如何使用签名的 Homebrew 代码安装 gdb?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18423124/

相关文章:

c++ - 链接器问题 : undefined reference

c++ - 继承时找不到类名

eclipse - 如何启用谷歌应用程序引擎、maven 和 eclipse 的热插拔?

macos - OS X 应用程序的沙盒路径

postgresql - 永久设置 PGDATA 环境变量 Mac

c++ - 无法将迭代器的 std::set 中的元素插入到 std::list

c# - 如何在 C# 中编写我自己的包装器?

android - 意外的顶级异常 : Multiple dex files define

java - 在eclipse中获取项目的实际物理路径

.net - dot net core 构建平台/操作系统特定的代码或类文件