mac book上安装和使用gdb

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zg_hover/article/details/82453862

概述

本文讲述如何在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-8.0.1源码

# 卸载老的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

对gdb进行签名

  1. 先创建一个证书

启动/Applications/Utilities/Keychain Access.app

按以下顺序操作:

  • 在菜单栏中按以下顺序依次选择:
钥匙串访问->证书助理->创建证书

进入创建证书页面。

(1)给证书随笔取一个名字gdb-cert,身份类型“自签名根证书”,证书类型“代码签名”,勾选“让我覆盖…”。
(2)一路确定,到“指定用于该证书的位置”,选择“系统”。创建,然后就成功了。

注意:(2)中选择“系统”可能会出现未知错误,此时这一步需要选择“登录”,然后会创建成功,在把该证书拖到左边的“系统”菜单中,然后把原来的证书删除掉。这样,就可以解决证书创建时,产生的未知错误。

  1. 为gdb进行签名
# 查看一下gdb的绝对路径
$ which gdb
/usr/local/bin/gdb

# 对gdb进行签名
codesign -fs gdb-cert /usr/local/bin/gdb
  1. 设置gdb启动选项
echo "set startup-with-shell off" >> ~/.gdbinit
  1. 重启系统

当以上步骤都完成后,

sudo reboot
  1. 测试使用

    • 编写一个最简单的c代码:a.c:
#include <stdio.h>

int main()
{
    printf("hello\n");
}
  • 编译代码:
gcc -g a.c -o a
  • 使用gdb来调试程序
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来调试redis
$ 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++代码了。

猜你喜欢

转载自blog.csdn.net/zg_hover/article/details/82453862