1、安装homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2、安装gdb
brew install gdb
gdb --version //使用这个命令查看版本信息,若能查到则证明安装成功了
3、使用gdb
//在某个目录下用c语言写hello world程序,保存为hello.cpp
gcc -g hello.c -o hello
gdb hello
gdb -q hello //不打印gdb版本信息 与上一行两者选一执行即可
4、使用gdb时会遇到的问题
4.1初次使用gdb可能会遇到的错误
(gdb) run
Starting program: /usr/local/bin/fabnacci
Unable to find Mach task port for process-id 23330: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
这是因为 Darwin 内核在你没有特殊权限的情况下,不允许调试其它进程。调试某个进程,意味着你对这个进程有完全的控制权限,所以为了防止被恶意利用,它是默认禁止的。允许 gdb 控制其它进程最好的方法就是用系统信任的证书对它进行签名。
解决方案:
1、用聚焦(cmd+空格)搜索钥匙串访问,选择打开
2、光标移到左上角的 钥匙串访问->证书助理->创建证书
3、如下填写:
名称:gdb_codesign
身份类型:自签名根证书
证书类型:代码签名
钩选:让我覆盖这些默认设置
4、一路确定,直到指定证书位置的步骤,选择系统
5、点击“创建”,会提示用输入系统登录密码,创建完成
6、在钥匙串访问程序中,选择左侧栏上半部分的系统和左侧栏下半部分的我的证书,找到你刚刚创建的gdb_codesign证书并双击打开证书信息窗口,展开信任项,设置使用此证书时:为始终信任。
7、关闭证书信息窗口,系统会再次要求输入系统登录密码
8、对gdb签名
如果是之前的系统,直接执行
codesign -fs gdb-cert $(which gdb)
如果是Mojave(10.14)之后的系统
先创建一个文件 gdb-entitlement.xml 内容为:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.debugger</key>
<true/>
</dict>
</plist>
</pre>
在该xml文件所在目录下执行
codesign --entitlements gdb-entitlement.xml -fs gdb_codesign $(which gdb)
没有报错就是签名成功了
9、在第8部按照不同系统版本完成对gdb签名之后,一定要重启系统!!!
4.2 在gdb内使用run时程序没有结果
使用run命令执行程序,但并没有输出预期结果“Hello World”
像死循环一样了
或者输出了如下的信息:
Starting program: /Users/dongcl/code/acm/hello
[New Thread 0x2703 of process 706]
[New Thread 0x2603 of process 706]
During startup program terminated with signal SIGTRAP, Trace/breakpoint trap.
解决办法:
在每次启动gdb启动的时候,执行命令
set startup-with-shell off
或者一劳永逸的办法:
echo "set startup-with-shell off" >> ~/.gdbinit
4.3更换到gdb v8.0.1
$ brew uninstall gdb
$ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/c3128a5c335bd2fa75ffba9d721e9910134e4644/Formula/gdb.rb