46

因为我需要启用 Python 的gdb,所以我通过安装了另一个版本

brew tap homebrew/dupes
brew install gdb

我想将它gdb与 Eclipse CDT 一起使用,我在调试设置中输入了二进制文件的路径。但是,启动调试程序失败并显示以下消息:

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 39847: (os/kern) failure (0x5).\n (please check gdb is codesigned - see taskgated(8))
Unable to find Mach task port for process-id 39847: (os/kern) failure (0x5).\n (please check gdb is codesigned - see taskgated(8))

在这种情况下,“协同设计”是什么意思?我怎样才能让它gdb运行?

4

10 回答 10

97

I.1 对调试器进行代码设计

Darwin Kernel 要求调试器在被允许控制其他进程之前具有特殊权限。这些权限是通过对 GDB 可执行文件进行代码签名来授予的。如果没有这些权限,调试器将报告错误消息,例如:

Starting program: /x/y/foo
Unable to find Mach task port for process-id 28885: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))

代码设计需要证书。以下过程说明了如何创建一个:

  • 启动 Keychain Access 应用程序(在 /Applications/Utilities/Keychain Access.app 中)
  • 选择 Keychain Access -> Certificate Assistant -> Create a Certificate... 菜单
  • 然后:
    • 为新证书选择一个名称(此过程将使用“gdb-cert”作为示例)
    • 将“身份类型”设置为“自签名根”
    • 将“证书类型”设置为“代码签名”
    • 激活“让我覆盖默认值”选项
  • 单击“继续”几次,直到出现“指定证书的位置”屏幕,然后将“钥匙串”设置为“系统”
  • 单击“继续”,直到创建证书
  • 最后,在视图中,双击新建证书,将“使用此证书时”设置为“始终信任”
  • 退出钥匙串访问应用程序并重新启动计算机(不幸的是,这是必需的)

创建证书后,可以对调试器进行代码签名,如下所示。在终端中,运行以下命令...

codesign -f -s  "gdb-cert"  <gnat_install_prefix>/bin/gdb

...其中“gdb-cert”应替换为上面选择的实际证书名称,并应替换为您安装 GNAT 的位置。

来源:https ://gcc.gnu.org/onlinedocs/gcc-4.8.1/gnat_ugn_unw/Codesigning-the-Debugger.html

更新: High-Sierra(证书助理 - 未知错误) https://apple.stackexchange.com/questions/309017/unknown-error-2-147-414-007-on-creating-certificate-with-certificate-assist

于 2014-09-05T04:15:59.417 回答
5

检查证书的信任度,它必须受信任才能进行代码签名(在钥匙串访问中证书视图信任部分的倒数第三个 yosemite 上)。

起初,证书对钥匙串的代码签名并不为人所知,因为缺少扩展目的“代码签名”,如果您查看钥匙串并双击证书,您可以找到它:

在此处输入图像描述

我解决了这个问题:

在此处输入图像描述

然后,在将证书从钥匙串拖放到我的桌面后,我将证书添加到受信任的签名证书中,这创建了 ~/Desktop/gdb-cert.cer:

$ sudo security add-trusted-cert -d -r trustRoot -p codeSign -k /Library/Keychains/System.keychain ~/Desktop/gdb-cert.cer

这有点棘手,因为我被一些互联网帖子误导并且没有查看手册页。有人说你应该使用 add-trust ( https://llvm.org/svn/llvm-project/lldb/trunk/docs/code-signing.txt )。可怕的是命令成功了,但没有做它“应该”做的事情(好吧,这是错误的命令,但它应该告诉我这是错误的)。

之后,我在受信任的证书中找到了新证书,如下所示:

$ security find-identity -p codesigning

Policy: Code Signing
  Matching identities
      1) E7419032D4..... "Mac Developer: FirstName LastName (K2Q869SWUE)"    (CSSMERR_TP_CERT_EXPIRED)
      2) ACD43B6... "gdb-cert"
  2 identities found

  Valid identities only
      1) ACD43... "gdb-cert"
  1 valid identities found

在我的情况下,苹果证书已过期,但我用来签署 gdb 的证书没有过期(好吧,我只是自己创建的)。另请注意,“security add-trusted-cert”(-p codeSign)和“security find-identity”命令(-p codesigning)的策略名称不同。然后我继续签署 gdb,我也总是得到:

$ codesign --sign gdb-cert.cer --keychain ~/Library/Keychains/login.keychain `which gdb`
  gdb-cert.cer: no identity found

因为我的印象是我必须将证书文件的文件名提供给 --sign 选项,但实际上这是我应该提供的证书的 CN,并且应该在信任库中。双击钥匙串中的证书时,您可以在此处找到 CN:

在此处输入图像描述

或在“security find-identity -p codesigning”的上述输出中。然后我继续签名,我必须给它正确的钥匙串:

 codesign -s gdb-cert --keychain /Library/Keychains/System.keychain `which gdb` 

我必须输入 root 密码才能访问钥匙串。

然后给了我一个工作的 gdb,它应该给你一个签名的应用程序。

于 2015-09-03T15:39:36.433 回答
4

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

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

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

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

  3. 重新启动计算机。

  4. 使用 gdb

于 2013-11-18T12:54:05.133 回答
4

看来您需要签署可执行文件。有关更多信息,请参阅这些链接。如果您不打算重新分发该版本的gdb.

https://developer.apple.com/library/mac/#documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html

https://developer.apple.com/library/mac/#documentation/Darwin/Reference/Manpages/man1/codesign.1.html

或者,您可以在系统上禁用代码签名,尽管这会带来安全风险。为此,请尝试sudo spctl --master-disable在终端中运行。

于 2012-12-17T12:29:29.360 回答
4

如果使用gdb不是硬性要求,您也可以将lldb其用作替代方案。它已经在您的系统上,不需要进行代码签名:

$ lldb stddev_bugged
(lldb) target create "stddev_bugged"
Current executable set to 'stddev_bugged' (x86_64).
(lldb) b mean_and_var
Breakpoint 1: where = stddev_bugged`mean_and_var + 17 at stddev_bugged.c:17, address = 0x0000000100000b11
(lldb) r
Process 1621 launched: '/Users/richardschneeman/Documents/projects/21stCentury/02/example-00/stddev_bugged' (x86_64)
Process 1621 stopped
* thread #1: tid = 0xc777, 0x0000000100000b11 stddev_bugged`mean_and_var(data=0x00007fff5fbff590) + 17 at stddev_bugged.c:17, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000b11 stddev_bugged`mean_and_var(data=0x00007fff5fbff590) + 17 at stddev_bugged.c:17
   14   typedef struct meanvar {double mean, var;} meanvar;
   15
   16   meanvar mean_and_var(const double *data){
-> 17       long double avg = 0,
   18             avg2 = 0;
   19       long double ratio;
   20       size_t count= 0;
(lldb)

这是一个转换gdblldb命令的表http://lldb.llvm.org/lldb-gdb.html

于 2015-11-19T23:16:16.057 回答
3

我最终不得不遵循这些指示,而不是其他人建议的指示。

我仍然不确定是否是killall taskgated启用 root 用户的行为或过程有所不同。

有人说重启是必要的。我发现根据上述说明,情况可能并非如此。

我也做了@klm123 推荐的改变,所以这也可能有所贡献。

请注意,我使用的是自制软件,而不是 macports。

于 2014-03-12T18:39:29.667 回答
3

这是一个较老的问题,但似乎没有一个解决方案对我有用(我使用的是 Mojave)。转换为 lldb 不是问题的解决方案 - 它只是一种解决方法。

在尝试了几种解决方案后,我发现可以工作的解决方案位于此处:https ://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#gistcomment-2891198

其中引用了这个网站:https ://sourceware.org/gdb/wiki/PermissionsDarwin#Sign_and_entitle_the_gdb_binary

该解决方案涉及代码签名的略微修改版本。本质上,主要区别是在签署证书时,在共同签名时必须传递权利 XML 文件。下面我从头到尾复制/粘贴了所有步骤的源软件网站的内容。

1.1。在系统钥匙串中创建证书

启动钥匙串访问应用程序(/Applications/Utilities/Keychain Access.app)

打开菜单项/钥匙串访问/证书助手/创建证书...

选择一个名称(示例中为 gdb-cert),将 Identity Type 设置为 Self Signed Root,将 Certificate Type 设置为 Code Signing,然后选择 Let me override defaults。单击 Continue 几次,直到出现 Specify a Location For The Certificate 屏幕,然后将 Keychain 设置为 System。

如果您无法将证书存储在系统钥匙串中:改为在登录钥匙串中创建它,然后将其导出。然后,您可以将其导入系统钥匙串。

最后,退出 Keychain Access 应用程序以刷新证书存储。

控制:在终端类型

security find-certificate -c gdb-cert

这应该显示有关您新铸造的证书的一些详细信息,例如

钥匙串:“/Library/Keychains/System.keychain”版本:256 类:0x80001000 属性:“alis”="gdb-cert" [...]

确保 keychain: 是系统钥匙串,如图所示。

另外,请确保您的证书尚未过期:

security find-certificate -p -c gdb-cert | openssl x509 -checkend 0

如果要检查整个 X509 数据结构,可以键入

security find-certificate -p -c gdb-cert |openssl x509 -noout -text

1.2. 信任用于代码签名的证书

再次启动钥匙串访问。使用证书的上下文菜单,选择获取信息,打开信任项,然后将代码签名设置为始终信任。

最后,再次退出 Keychain Access 应用程序以刷新证书存储。

控制:在终端类型

security dump-trust-settings -d

这应该显示 gdb-cert 证书(可能还有其他)及其信任设置,包括代码签名。

1.3. 签署并授权 gdb 二进制文件

(Mac OS X 10.14 及更高版本)创建包含以下内容的 gdb-entitlement.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.debugger</key>
    <true/>
</dict>
</plist>

如果您在上一节中生成的证书称为 gdb-cert,请使用:

codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)

或在 Mojave (10.14) 之前,只需

codesign -fs gdb-cert $(which gdb)

如果 gdb 二进制文件位于普通用户无法写入的位置,您可能必须在此命令前面加上 sudo。

如果您计划经常构建 gdb,则可以通过传递 --enable-codesign=gdb-cert (再次假设 gdb-cert 是证书的名称)来配置来自动执行此步骤。

控制:在终端类型

codesign -vv $(which gdb)

对于 10.14 (Mojave) 之后的版本,还要检查权利:

codesign -d --entitlements - $(which gdb)

1.4. 刷新系统的证书和代码签名数据

最可靠的方法是重新启动系统。

一种侵入性较小的方法是通过终止当前正在运行的 taskgated 进程来重新启动 taskgated 服务(在进程中的任何时间,但不迟于再次尝试运行 gdb 之前):

sudo killall taskgated

但是,有时 taskgated 服务在杀死它后不会成功重新启动,因此通过检查例如 ps $(pgrep -f taskgated) 确保它在此步骤后处于活动状态。或者只是重新启动您的系统,如上所述。

于 2020-05-03T14:11:10.107 回答
2

这是一个非常古老的话题,但我正在添加一个响应,因为在许多可用的指令中,只有一个包含正确的步骤来使自签名调试器工作。

您必须创建一个自签名根证书,然后用它签署 gdb 可执行文件,但许多人抱怨它对他们不起作用。在我偶然发现这个链接之前,我也没有这样做。

其他手册中缺少的关键点是您必须重新启动计算机才能使更改生效。一旦我这样做了,一切都按预期进行。

我希望,这会对其他人有所帮助。

于 2013-05-30T21:13:08.690 回答
0

我按照说明进行了代码设计,但 gdb 仍然会给我同样的错误。事实证明,当 gdb 以 root (sudo gdb) 运行时,它确实有效。我正在使用 Sierra osx。

于 2019-06-09T16:44:21.237 回答
0

我知道这不是问题的直接答案,但我希望有人在我努力让 gdb 工作之前提到它。

您可以使用 Apple 的免费 IDE Xcode 构建和调试 C++ 代码。(Xcode 类似于“Visual Studio”或“Android Studio”。)。我已经是 Xcode 用户,但我不知道它可以与 c++ 一起使用——因为该选项隐藏得相当好。这个 youtube 视频将引导您完成它:

https://www.youtube.com/watch?v=-H_EyIqBNDA

于 2021-08-12T20:04:50.050 回答