由于要在mac上制作自己的malloc动态存储分配器,要使用gdb进行调试,之前一直在centos上用gdb调试,转到mac上竟然发现有这么多坑,还好一一解决了,其原因大多数因为mac上非常关注程序安全性的问题。
主要会碰到的问题主要有如下问题,如果大家发现如下的问题就可以接着看下去:
1.
-bash: gdb: command not found
2. `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))
3.
The specified item could not be found in the keychain.
4.
During startup program terminated with signal SIG113, Real-time event 113`
我们一个个来解决。
1.
-bash: gdb: command not found
这个原因在于你的mac上根本没有下载gdb这个调试工具。那么,解决办法也很简单,把gdb下载下来。
使用mac自带的brew管理工具。当然,要先更新一下homebrew的软件库。
brew update
然后检查一下homebrew软件库里面有没有gdb
brew search gdb
如果有的话,就会有如下图片展示:
有的话,进行安装
brew install gdb
如果要权限的话就加个sudo。
安装成功之后,键入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))
这个原因是mac不允许没有给予许可的进程来调试其它进程,那解决办法自然就想到了root,来个根权限。但是,这个会影响到万一gdb调试了重要内核程序后果不是我们想要的,没有安全证书,我们就自己添加一个安全证书:
首先打开钥匙串访问
下面关键要修改的东西如下:
注意一定钥匙代码签名,英文名是codesign,上面的名称随意,这个跟你后面的命令行键入的名称有关,接下来,一直往下
把这个钥匙串改成system,然后创建由于我已经创建过了,这里就不显示出来了。
双击,将信任改成始终信任:
中间要输入密码之类的,输入就是了。
OK,只差最后一步
重启电脑。
然后在命令行上输入:
codesign -s gdb-cert-hekewen /usr/local/bin/gdb
这个gdb-cert-hekewen,要改成你的证书名,后面就是gdb位置。
没有报错就是成功了。
3.
The specified item could not be found in the keychain.
这个就是在钥匙串里面没有找到该签名,这个错误往前面看你的安全证书是否按照上面的步骤解决,特别注意证书名字,证书类型,信任,系统,这些有没设置成功。
4.
During startup program terminated with signal SIG113, Real-time event 113
这个错误好像只有在高版本的OSX系统上才出现,解决办法就是在gdb启动的时候,键入命令
set startup-with-shell off
就解决了
当然,如果这样,你每次在调试的时候都要键入,这时候你就可以添加到.gdbinit,每次运行gdb的时候都执行一次。
关于.gdbinit,就是在你每次用gdb调整程序的时候,如果程序文件中有.gdbinit,就会自动读取里面的命令,全部执行一遍。
于是乎,我们只要用vim在程序文件里面创建一个.gdbinit,并在里面写上
set startyup-with-shell off
就解决了。
终于,我们可以开心的在mac上使用gdb了。