gdb 命令记录
1. 执行 gdb 脚本
- 在命令行中指定 -x gdbscript
- 进入 gdb 后执行 gdb 脚本,可以使用 source 与 command 命令
2. print 的输出格式
print /x /o 以十六进制或八进制格式输出数据
3. 设置变量的值,设置寄存器的值
set variable assignment statement
4. gdb 向后执行
gdb 向后执行是一个不太常用的功能,能否使用这个功能依赖于目标环境。使用向后执行的方式,可以在程序执行异常之后回溯执行,这样可以更快的定位到问题。尽管回溯执行有这样的优点,它也有一些缺点。
主要缺点如下:
- 只有部分环境支持使用 gdb 回溯执行
- 回溯执行的代码长度有限制,一些与设备 IO 相关的代码无法回溯
使用方法详见 gdb reverse debugging。
5. rbreak 对正则表达式匹配行打断点
rbreak 可以通过正则表达式匹配来匹配断点的位置,用户只需要提供模糊的匹配信息就可以打断点,常用于对断点位置不太清楚的情况。
6. break file:line
当目标程序由许多源文件编译生成时,可以通过这个语法来对指定源文件中的行打断点。
7. frames 相关操作
- info frames 查看栈帧结构
- backtrace 查看当前栈帧
- frame frameid 切换栈帧
8. info regs
查看 cpu 通用寄存器的值,调试汇编的时候经常会用到这个指令。
9. 调试一个正在执行的进程
对于 linux 中 cpu 占用率过高的进程,可能需要对其进行调试以发现导致 cpu 占用率过高的代码。普通调试中我们一般都是在 gdb 中运行一个进程来调试,上面的方式却是使用 gdb 来调试一个正在执行的进程。
具体的操作如下:
- attach process pid
- 定位问题
- dettach process pid
10. 调试 core dump 文件
一般步骤如下:
- 设置 ulimit -c 的资源限制
- 重新执行异常程序,生成 core dump 文件
- 执行 gdb program core
program 为异常程序,core 为生成的 core dump 文件,执行第三步的命令后进入 gdb 便会打印出最后一行执行代码的位置,进一步的调试可以通过查看栈帧来完成。