GDB 是 Unix 下的调试工具。
假如存在文件 file.c
,
首先,需要编译生成可执行文件:gcc -g file.c -o file
随后,才能对其进行 GDB 调试。
最简单的启动方式:
gdb file
: 启动 GDB 调试file
.
一些命令行参数:
gdb file -tui
: 以多个文本窗口的方式呈现调试。
run
: 简写为r
, 开始执行文件。如果没有断点,则完整执行程序;如果有断点,则执行到第一个可用断点处。next
: 简写为n
, 单步执行,当执行到中断处时,输入n
会继续执行下一条语句。如果下一条语句是一个函数,会直接返回函数的执行结果。ni
: 执行的步长为汇编指令。
step
: 简写为s
, 单步进入,当执行到中断处时,输入s
会继续执行下一条语句。如果下一条语句是一个函数,则会进入到函数内部。si
: 执行的步长为汇编指令。
break
: 简写为b
, 设置断点:b function_name
: 根据函数名来打断点。b *address
: 根据地址来打断点。
clear
: 删除所选环境中的断点;info break
: 简写为i b
, 查看断点信息。
where
: 查看当前所处的地址。whatis
: 查看某个变量的数据类型。info
: 简写为i
, 用于显示各类信息,可用help i
查阅其用法:i registers
: 简写为i r
, 查看当前寄存器内的值(除了浮点数寄存器)。i all-registers
: 查看所有寄存器内的值。i frame
: 简写为i f
, 查看当前堆栈信息。
print
: 简写为p
,p $register
查看某个寄存器内的值。
examine
: 简写为x
, 用来查看内存地址中的值list
: 打印当前行之后的源码list <line>
: 打印 line 行代码list -
: 打印当前行前面的代码
disas
: 显示当前行之后的汇编代码
watch
: 设置观察点:watch var
: 观察一个变量。watch $register
: 观察某个寄存器。
delete
: 清除断点/监控。delete n
: 清除第 n 个断点/监控。
shell clear
: 清屏操作
- 调试状态下,直接回车表示重复执行上一条命令。
watch $pc
后,由于执行单条指令必然改变pc
值,因此可以借此进入执行单条指令的状态。