如何获得OSX上的“signedigned”gdb?

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

 brew tap homebrew/dupes brew install gdb 

我想在Eclipse CDT中使用这个gdb ,在这里我在debugging设置中input了二进制文件的path。 但是,启动debugging程序失败,并显示以下消息:

 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运行?

这似乎你需要签署的可执行文件。 请参阅这些链接了解更多信息。 如果您不打算重新分发该版本的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

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

I.1对debugging器进行编码

Darwin内核要求debugging器在被允许控制其他进程之前拥有特殊的权限。 这些权限通过代码化GDB可执行文件来授予。 如果没有这些权限,debugging器将报告错误消息,如:

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

代码签名需要证书。 以下步骤介绍了如何创build一个:

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

一旦证书被创build,debugging器就可以按如下方式进行编码。 在terminal中,运行以下命令…

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

…其中“gdb-cert”应由上面select的实际证书名称replace,并应由您安装GNAT的位置replace。

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

我做了gdb在OSX 10.9上的工作,没有用这种方式编码( 在这里描述):

  1. 用macports安装gdb。 (可能是你可以跳过它)

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

    在第22行,第27列将选项string从-s更改为-sp

  3. 重新启动计算机。

  4. 使用gdb

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

你必须创build一个自签名的根证书,然后用它来签署gdb可执行文件,但是很多人抱怨说它不适用于他们。 直到我偶然发现这个环节 ,我也没有做。

其他手册中缺less的关键是您必须重新启动计算机以使更改生效。 一旦我这样做,一切都按预期工作。

我希望这会帮助别人。

我最终不得不按照这些方向而不是其他人所build议的方向。

我仍然不确定这是否是killall taskgated的行为,或者是启用root用户的过程。

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

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

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

如果使用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) 

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

检查证书的信任,它必须是信任的代码签名(在钥匙串访问的证书视图的信任部分中的第三个优胜美地)。

起初该证书并不知道对钥匙串进行密码签名,因为缺less扩展目的“代码签名”,如果您查看钥匙串并双击证书,则可以find这个证书:

在这里输入图像说明

我修正了这一点:

在这里输入图像说明

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

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

这有点棘手,因为我被一些互联网post误导,没有看man page。 有人说你应该使用add-trust( https://llvm.org/svn/llvm-project/lldb/trunk/docs/code-signing.txt )。 可怕的是命令成功了,但没有做到“应该”(呃,这是错误的命令,但应该告诉我这是错误的)。

之后,我在可信任证书中find了这样的新证书:

 $ 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的不是(我刚刚创build它自己)。 另请注意,对于“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,并且应该在信任存储器中。 双击钥匙链中的证书,您可以在这里findCN:

在这里输入图像说明

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

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

我必须inputroot密码才能访问钥匙串。

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