GDB #
GDB 的主要功能就是监控程序的执行流程,
只有当源程序文件编译为可执行文件并执行时,GDB 才会派上用场。
# -g Generate source-level debug information
$ gcc -g main.c -o main
# 启动时不显示提示信息
# -q, --quiet, --silent
$ gdb -q
# 显示 gdb 版本信息
(gdb) show version
# 查看 gdb 版权相关信息
(gdb) show copying
# 输出信息多时不会暂停输出
(gdb) set pagination off
# 列出函数的名字
(gdb) info functions
(gdb) info functions regex
GDB 常用的调试指令 #
调试指令 | 作 用 |
---|---|
(gdb) break xxx (gdb) b xxx |
在源代码指定的某一行设置断点,其中 xxx 用于指定具体打断点的位置。 |
(gdb) run (gdb) r |
执行被调试的程序,其会自动在第一个断点处暂停执行。 |
(gdb) continue (gdb) c |
当程序在某一断点处停止运行后,使用该指令可以继续执行,直至遇到下一个断点或者程序结束。 |
(gdb) next (gdb) n |
令程序一行代码一行代码的执行。 |
(gdb) print xxx (gdb) p xxx |
打印指定变量的值,其中 xxx 指的就是某一变量名。 |
(gdb) list (gdb) l |
显示源程序代码的内容,包括各行代码所在的行号。 |
(gdb) quit (gdb) q |
终止调试。 |
问题 #
解决 GDB 在 Mac 下不能调试的问题 #
Darwin 内核在你没有特殊权限的情况下,不允许调试其它进程。 调试某个进程,意味着你对这个进程有完全的控制权限,所以为了防止被恶意利用,它是默认禁止的。允许 gdb 控制其它进程最好的方法就是用系统信任的证书对它进行签名。
创建代码签名的证书 #
- 打开 Keychain Access 应用程序(/Applications/Utilities/Keychain Access.app)
- 执行菜单 钥匙串访问 -> 证书助理 -> 创建证书
- 填写如下信息:
- 名称:gdb_codesign
- 身份类型:自签名根证书
- 证书类型:代码签名
- 钩选:让我覆盖这些默认设置
- 一路确定,直到指定证书位置的步骤,选择系统
- 点击 “创建”,会提示用输入系统登录密码,创建完成
- 在钥匙串访问程序中,选择左侧栏的系统和我的证书,找到你刚刚创建的 gdb_codesign 证书并双击打开证书信息窗口,展开 信任项,设置使用此证书时:为始终信任。
- 关闭证书信息窗口,系统会再次要求输入系统登录密码。
签名 #
如果是之前的系统,直接执行:
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>
再执行:
codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)
具体参考这里:https://sourceware.org/gdb/wi…
参考:
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。