MAC上使用gdb(完美解决)

  • Post author:
  • Post category:其他


由于要在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了。



版权声明:本文为github_33873969原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。