如何在OSX上获得"codesigned"gdb?

cls*_*udt 43 c++ debugging macos gdb code-signing

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

brew tap homebrew/dupes
brew install gdb
Run Code Online (Sandbox Code Playgroud)

我想在gdbEclipse 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))
Run Code Online (Sandbox Code Playgroud)

"编码签名"在这种情况下意味着什么?我该如何gdb运行?

Zak*_*Zak 94

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))
Run Code Online (Sandbox Code Playgroud)

协同设计需要证书.以下过程说明如何创建一个:

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

创建证书后,可以按如下方式对调试器进行编码.在终端中,运行以下命令...

codesign -f -s  "gdb-cert"  <gnat_install_prefix>/bin/gdb
Run Code Online (Sandbox Code Playgroud)

...其中"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

  • 我不知道GNAT是什么,但它可以用`\`替换`<gnat_install_prefix>/bin/gdb`,其中gdb \`` (11认同)
  • 而不是重新启动,"sudo killall taskgated"就足够了. (10认同)
  • 这个说明确实有效,但前4次我跟着他们他们没有为我工作,b/c我错过了获取证书信息的步骤,扩展了"信任"部分,并将"代码签名"更改为"永远信任". (4认同)
  • 我按照 MacOS Mojave 10.14.5 上的所有说明进行操作,但我仍然收到相同的代码设计消息 (4认同)
  • 如果这一切都不起作用,请尝试“sudo gdb hello”。这对我有用。 (2认同)

klm*_*123 5

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

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

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

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

  3. 重启电脑.

  4. 使用gdb


use*_*338 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
Run Code Online (Sandbox Code Playgroud)

这有点棘手,因为我被一些互联网帖子误导并且没有查看手册页。有人说你应该使用 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
Run Code Online (Sandbox Code Playgroud)

就我而言,苹果证书已过期,但我用来签署 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
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

 codesign -s gdb-cert --keychain /Library/Keychains/System.keychain `which gdb` 
Run Code Online (Sandbox Code Playgroud)

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

然后我就得到了一个可以工作的 gdb,它应该会给你一个签名的应用程序。


Mat*_*att 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在终端中运行。