因为我需要一个支持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
运行起来?
发布于 2012-12-17 20:29:29
看起来您需要对可执行文件进行签名。有关详细信息,请参阅这些链接。如果您不打算重新分发该版本的gdb
,那么您应该能够逃脱自我签名的惩罚。
或者,您可以在系统上禁用代码签名,尽管这会带来安全风险。为此,请尝试在终端中运行sudo spctl --master-disable
。
发布于 2015-09-03 23:39:36
检查证书的可信性,必须信任它才能进行代码签名(在yosemite上,这是密钥链访问中证书视图的信任部分中的倒数第三个)。
起初,证书对于密钥链的协同设计并不为人所知,因为缺少扩展目的"Code Signing“,如果你查看密钥链并双击证书,你可以找到这个:
我解决了这个问题:
然后,在将证书从密钥链拖放到我的桌面后,我将证书添加到受信任的签名证书中,这将创建~/ 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签名的证书并没有过期(好吧,我自己创建的)。还要注意,对于“安全添加信任证书”(-p codeSign)和“安全查找标识”命令(-p代码设计),策略的名称是不同的。然后我继续签署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-11-20 07:16:16
如果使用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
https://stackoverflow.com/questions/13913818
复制相似问题