本文讲述如何在mac book中安装和调试gdb。由于自己在mac book上安装gdb的过程中遇到的一些问题,通过本文把这些问题总结一下,并提供解决之道。
uname -a
输出如下:
17.7.0 Darwin Kernel Version 17.7.0: Thu Jun 21 22:53:14 PDT 2018; root:xnu-4570.71.2~1/RELEASE_X86_64 x86_64
我的mac book的版本如上面的输出所示,在该版本的mac系统若直接安装,与之配套的gdb的版本是:8.1.1。该版本的gdb安装完成后没法使用,会报以下错误:
Starting program: ./src/redis-server
Unable to find Mach task port for process-id 12520: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
所以,只能把gdb的版本降到较低的版本,并通过源码编译gdb来进行安装。
# 卸载老的gdb
brew uninstall gdb
wget https://ftp.gnu.org/gnu/gdb/gdb-8.0.1.tar.xz
tar xvf gdb-8.0.1.tar.xz
cd gdb-8.0.1
./configure --prefix=/usr/local
make
make -C gdb install
启动/Applications/Utilities/Keychain Access.app
按以下顺序操作:
钥匙串访问->证书助理->创建证书
进入创建证书页面。
(1)给证书随笔取一个名字gdb-cert,身份类型“自签名根证书”,证书类型“代码签名”,勾选“让我覆盖…”。
(2)一路确定,到“指定用于该证书的位置”,选择“系统”。创建,然后就成功了。
注意:(2)中选择“系统”可能会出现未知错误,此时这一步需要选择“登录”,然后会创建成功,在把该证书拖到左边的“系统”菜单中,然后把原来的证书删除掉。这样,就可以解决证书创建时,产生的未知错误。
# 查看一下gdb的绝对路径
$ which gdb
/usr/local/bin/gdb
# 对gdb进行签名
codesign -fs gdb-cert /usr/local/bin/gdb
echo "set startup-with-shell off" >> ~/.gdbinit
当以上步骤都完成后,
sudo reboot
测试使用
#include
int main()
{
printf("hello\n");
}
gcc -g a.c -o a
gdb ./a
(gdb) b main
Breakpoint 1 at 0x100000f6f: file a.c, line 5.
(gdb) r
Starting program: /Users/hover/opensrc/redis-4.0.9/a
[New Thread 0x1803 of process 700]
warning: unhandled dyld version (15)
Thread 2 hit Breakpoint 1, main () at a.c:5
5 printf("hello\n");
(gdb) n
hello
6 }
$ gdb ./src/redis-server
(gdb) b main
Breakpoint 1 at 0x10000fff5: file server.c, line 3736.
(gdb) n
The program is not being run.
(gdb) r
Starting program: /Users/hover/opensrc/redis-4.0.9/src/redis-server
[New Thread 0x2603 of process 1709]
warning: unhandled dyld version (15)
Thread 2 hit Breakpoint 1, main (argc=1, argv=0x7ffeefbff8e8) at server.c:3736
3736 spt_init(argc, argv);
(gdb) n
3738 setlocale(LC_COLLATE,"");
(gdb) n
3739 zmalloc_set_oom_handler(redisOutOfMemoryHandler);
(gdb) n
3740 srand(time(NULL)^getpid()); //设置随机数种子
(gdb) n
3741 gettimeofday(&tv,NULL); //获取当前时间
(gdb) n
3743 getRandomHexChars(hashseed,sizeof(hashseed));
(gdb)
好了,gdb安装完成,可以通过gdb来调试c/c++代码了。