最近写一段C程序作业。代码量不多,所有采用Sublime Text + gcc的方式。遇到了奇怪的segmentation fault
,没有显示具体错误行号,所有需要借助gdb(The GNU Project Debugger 是*nix环境下著名的调试程序)返回更多有效信息和断点调试。
安装
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
- 打开菜单 /钥匙串访问/证书助理/创建证书…
- 在”创建您的证书”窗口设置如下
- 名称: gdbc
- 身份类型: 自签名根证书
- 证书类型: 代码签名
- 勾选”让我覆盖这些默认值”
- 点击”继续”,将”有效期(天数)”设置为: 3650
- 点击若干次”继续”,指导出现”指定用于该证书的位置””
- 点击”创建”,会弹出用户名密码输入框,输入密码,点击”修改钥匙串”
- 在“系统”钥匙串找到刚才创建的”gdbc”证书,右键”显示简介”,在“信任”分类下找到“代码签名”,指定为“总是信任”。
- 退出“钥匙串访问”
要让刚刚添加的证书生效需要重启
taskgated
服务或者重启系统
sudo killall taskgated
证书准备好了,接下来给gdb签名
codesign -fs gdbc /usr/local/bin/gdb
lldb
即使给签名gdb以后,在执行gdb调试仍然无法显示行号(行号显示为 ??),新版本的macox已经和gdb不兼容了,lldb是gdb的替代者。使用lldb调试可以显示错误发生位置的行号。
参考阅读
- Install GDB on OS X Mavericks from source
- GDB on OS X Mavericks and Xcode 5
- How to get a “codesigned” gdb on OSX?