调试器gdb的基本使用方法(2)

接着《调试器gdb的基本使用方法(1)》,继续介绍gdb的基本使用方法。

0x01. 其他断点

硬件断点(hbreak),适用于ROM空间等无法修改的内存区域中的程序。在有些框架中无法使用。临时断点(tbreak)和临时硬件断点(thbreak),与断点相同,都会在运行到该处时暂停,不同之处就是临时断点(临时硬件断点)会在此时被删除,故在只需停止一次时用起来很方便。

0x02. 改变变量的值

可以使用命令set variable 改变运行中程序的变量值。格式: set variable <变量>=<表达式>

1
2
3
4
5
(gdb) p options
$7 = 1
(gdb) set variable options = 0
(gdb) p options
$8 = 0

0x03. 生成内核转储文件

使用 generate-core-file可将调试中的进程生成内核转储文件。
例如:(gdb) generate-core-file ====> Saved corefile core.13163
有了内核转储文件和调试对象,以后就能查看生成转储文件时的运行历史(寄存器值、内存值等)。

0x04. attach 到进程

要调试守护进程(damon process)等已经启动的进程,或者调试陷入死循环而无法返回控制台的进程时,可以使用attach命令。
如下格式:attach pid,执行这一命令就可以attach到进程ID为pid的进程上。可以使用ps命令查看进程ID。
需要在gdb和进程分离时使用detach命令。这样调试中的进程就被从gdb的控制下释放出来。进程被detach后会继续运行。
进程信息可以用info proc命令显示。

0x05. 条件断点

有一种断点仅在特定条件下中断。
格式:break 断点 if 条件,该命令将测试给定的条件,如果为真则暂停运行。
另外几种格式:
condition 断点编号 //给指定的断点删除触发条件
condition 断点编号 条件 //给指定的断点添加触发条件

0x06. 反复执行

在编号指定的断点、监视点(watchpoints)或捕获点(catchpoint)忽略指定的次数。格式:ignore 断点编号 次数
continue 命令与ignore命令一样,也可以指定次数,达到指定次数前,执行到断点时不暂停,二者的意义是相同的。

格式 说明
continue N 执行continue N次
step N 执行step N次
stepi N 执行stepi N次
next N 执行next N次
nexti N 执行nexti N次

其他指令,finish命令执行完当前函数后暂停。until命令执行完当前函数等代码块后暂停,如果时循环,则在执行完循环后暂停,常用于跳出循环。

0x07. 删除断点和禁用断点

clear命令删除已定义的断点,用disable命令禁用断点,用enable命令重新启用断点。
clear的使用方法和设置断点的方法类似。

禁用断点:

格式 说明
disable [breakpoints] 禁用所有断点
disable [breakpoints] 断点编号 禁用指定断点
disable display 显示编号 禁用display命令定义的自动显示
disable mem 内存区域 禁用mem命令定义的内存区域

启用断点:

格式 说明
enable [breakpoints] 重新启用所有断点
enable [breakpoints] 断点编号 重新启用指定断点
enable [breakpoints] once 断点编号 重新启用指定断点,仅一次
enable [breakpoints] delete 断点编号 重新启用指定断点,触发后删除该断点
enable display 显示编号 启用display命令定义的自动显示
enable mem 内存区域 启用mem命令定义的内存区域

0x08. 断点命令

断定命令(commands)可以定义在断点中断后自动执行的命令。

1
2
3
4
5
格式:
commands 断点编号
命令
...
end

程序在指定的断点处暂停后,就会自动执行命令。

0x09. gdb的常用命令及省略形式

命令名称在不与其他命令重复的前提下,可以按照下述方式简写,如下表所示。在命令行模式下使用时,按Tab键,gdb就会自动补全命令。

常见命令和简写形式

命令 简写形式 说明
backtrace bt、where 显示栈帧
break b 设置断点
continue c、cont 继续运行
clear 删除断点
delete d 删除断点
finish fin 运行到函数结束
info breakpoints info break 显示断点信息
next n 执行下一行,单步步过
print p 显示表达式
run r 运行程序
step s 一次执行一行,单步步入
x 显示内存内容
until u 执行到指定行
directory dir 插入目录
disable dis 禁用断点
down do 当前调用的栈帧中选择要显示的栈帧
edit e 编辑文件或函数
frame f 选择要显示的栈帧
forward-search fo 向前搜索
generate-core-file gcore 生成内核转储
help h 显示帮助信息
info i 显示信息
list l 显示函数或行
nexti ni 汇编级,单步步过
print-object po 显示目标信息
sharedlibrary share 加载共享库的符号
stepi si 汇编级,单步步入