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可执行文件进行协调处理来授予这些权限.没有这些权限,调试器将报告错误消息,例如:
Run Code Online (Sandbox Code Playgroud)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"作为示例)
- 将"身份类型"设置为"自签名根"
- 将"证书类型"设置为"代码签名"
- 激活"让我覆盖默认值"选项
- 在"继续"上单击几次,直到出现"指定证书的位置"屏幕,然后将"钥匙串"设置为"系统"
- 单击"继续"直到创建证书
- 最后,在视图中,双击新证书,并将"使用此证书时"设置为"始终信任"
- 退出Keychain Access应用程序并重新启动计算机(不幸的是,这是必需的)
创建证书后,可以按如下方式对调试器进行编码.在终端中,运行以下命令...
Run Code Online (Sandbox Code Playgroud)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
检查证书的信任度,必须信任它才能进行代码签名(在 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,它应该会给你一个签名的应用程序。
看来您需要签署可执行文件。请参阅这些链接以获取更多信息。如果您不打算重新分发该版本的gdb.
或者,您可以在系统上禁用代码签名,尽管这会带来安全风险。为此,请尝试sudo spctl --master-disable在终端中运行。
| 归档时间: |
|
| 查看次数: |
36321 次 |
| 最近记录: |