今天使用GDB调试C++程序的时候出现了这个错误,
(please check gdb is codesigned - see taskgated(8)),
上网一查发现是签名的问题。
参考一篇文章进行修改:
在OS X Mavericks上安装gdb
安装
brew install gdb
开启调试编译选项
希望gdb调试时输出行号与堆栈等详细信息需要gcc
编译的时候使用-g
选项
gcc -o course_test -g -rdynamic course_test.c
注意 homebrew安装的gnu版本的gcc
在macox上不支持-rdynamic
选项,此处使用的是xcode提供的gcc
。
调试
bash$ gdb course_test
gdb>run
....
The GDB command:
„-exec-run“ returned the error:
„,msg=„Unable to find Mach task port for process-id 62593:
(os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))““
不出意外将会遇到上述错误。这是由于macos的安全策略,homebrew安装的gdb没有签名导致。
签名gdb
- 打开 “钥匙串访问”,位于
/Applications/Utilities/Keychain Access.app
- 打开菜单 /钥匙串访问/证书助理/创建证书…
- 在”创建您的证书”窗口设置如下
- 名称: gdb-cert
- 身份类型: 自签名根证书
- 证书类型: 代码签名
- 勾选”让我覆盖这些默认值”
- 点击”继续”,将”有效期(天数)”设置为: 3650
- 点击若干次”继续”,指导出现”指定用于该证书的位置””
- 钥匙串: 系统
- 点击”创建”,会弹出用户名密码输入框,输入密码,点击”修改钥匙串”
- 在“系统”钥匙串找到刚才创建的”gdbc”证书,右键”显示简介”,在“信任”分类下找到“代码签名”,指定为“总是信任”。(第一次操作的时候忘了选择这个,后来发现在 get info里面有选项,忘掉也没关系,可以修改)
- 退出“钥匙串访问”
要让刚刚添加的证书生效需要重启taskgated
服务或者重启系统(我系统来回重启了好几遍终于搞定,丢三落四的)
sudo killall taskgated
证书准备好了,接下来给gdb签名
sudo codesign -fs gdb-cert $(which gdb)
lldb
即使给签名gdb以后,在执行gdb调试仍然无法显示行号(行号显示为 ??),新版本的macox已经和gdb不兼容了,lldb是gdb的替代者。使用lldb调试可以显示错误发生位置的行号。