如何在OSX上获得“codesigned”gdb?

时间:2012-12-17 12:03:02

标签: c++ macos debugging gdb code-signing

因为我需要启用Python的gdb,所以我通过

安装了另一个版本
brew tap homebrew/dupes
brew install gdb

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

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

9 个答案:

答案 0 :(得分:90)

  

I.1协调调试器

     

Darwin内核要求调试器具有特殊权限   在允许控制其他进程之前。这些权限是   通过协调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中)
  •   
  • 选择钥匙串   访问 - >证书助理 - >创建证书...菜单
  •   
  • 然后:      
        
    • 选择新证书的名称(此过程将使用   " GDB证书"作为一个例子)
    •   
    • 设置"身份类型" to" Self Signed Root"
    •   
    • 设置"证书类型"到"代码签名"
    •   
    • 激活"让我覆盖默认值"选项
    •   
  •   
  • 点击几次"继续"直到"指定   证书的位置"屏幕出现,然后设置" Keychain"到"系统"
  •   
  • 点击"继续"直到证书创建
  •   
  • 最后,在视图中,双击新证书,然后设置"使用时   这个证书"到"永远信任"
  •   
  • 退出Keychain Access应用程序并重启计算机(不幸的是需要这样做)
  •   
     

创建证书后,可以将调试器编码为   跟随。在终端中,运行以下命令...

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

...其中&#34; gdb-cert&#34;应该用实际的证书名称替换   选择上面,应该被替换   您安装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

答案 1 :(得分:5)

我让gdb在OSX 10.9上工作,没有这种方式的编码(描述here):

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

  2.   

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

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

  3. 重新启动计算机。

  4. 使用gdb

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

您必须创建一个自签名的根证书,然后使用它签署gdb可执行文件,但很多人抱怨它不适用于它们。在我偶然发现this link之前,我都没有这样做。

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

我希望,这会有所帮助。

答案 4 :(得分:3)

我最终不得不关注these directions而不是其他人建议的方向。

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

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

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

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

答案 5 :(得分:3)

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

起初,证书不知道是否与钥匙串协商,因为存在扩展目的&#34;代码签名&#34;如果你查看钥匙串并双击证书,你可以找到这个:

enter image description here

我修正了:

enter image description here

然后我将证书添加到受信任的签名证书中,之后我将证书从钥匙串拖放到我的桌面,创建了〜/ 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)。可怕的是,命令成功,但没有做到它应该&#34;应该&#34; (好吧,这是错误的命令,但应该告诉我这是错误的。)

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

$ 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

在我的情况下,apple证书已过期,但我用来签署gdb的那个证书不是(嗯,我自己就是创建了它)。另请注意,对于&#34; security add-trusted-cert&#34;( - p codeSign)和&#34; security find-identity&#34;,该策略的命名方式不同。命令(-p codesigning)。然后我继续签署gdb,我也总是得到:

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

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

enter image description here

或在&#34;安全性查找 - 身份-p codesigning&#34;的上述输出中。然后我继续签名,我必须给它正确的钥匙串:

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

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

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

答案 6 :(得分:2)

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

的表格

答案 7 :(得分:1)

这是一个比较老的问题,但是所有解决方案似乎都不适合我(我使用的是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 签名根目录,将“证书类型”设置为“代码签名”,然后选择“让” 我覆盖默认值。在“继续”上单击几次,直到到达 指定证书的位置屏幕,然后设置钥匙串 进入系统。

?如果无法将证书存储在系统钥匙串中,请创建 而是将其放在登录钥匙串中,然后将其导出。然后可以导入 它进入系统钥匙串。

最后,退出“钥匙串访问”应用程序以刷新 证书存储。

控制:在终端类型中

security find-certificate -c gdb-cert

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

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

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

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

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。信任用于代码签名的证书

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

最后,再次退出“钥匙串访问”应用程序以刷新 证书存储。

控制:在终端类型中

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>
</pre>

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

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

或在莫哈韦(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。刷新系统的证书和代码签名数据

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

一种侵入性较小的方法是通过杀死 当前运行的任务处理流程(该流程中的任何时间,但没有 比尝试再次运行gdb之前要晚):

sudo killall taskgated

但是,有时任务化服务将无法成功重启 杀死它之后,请确保在此步骤之后它还活着 检查ps $(pgrep -f taskgated)。或者只是重新启动系统, 上面提到过。

答案 8 :(得分:0)

我按照说明进行了代码签名,但是gdb仍然会给我同样的错误。原来,当gdb以root身份运行(sudo gdb)时,它确实起作用。我正在使用Sierra osx。