调试器gdb的基本使用方法(2)
接着《调试器gdb的基本使用方法(1)》,继续介绍gdb的基本使用方法。
0x01. 其他断点
硬件断点(hbreak
),适用于ROM空间等无法修改的内存区域中的程序。在有些框架中无法使用。临时断点(tbreak
)和临时硬件断点(thbreak
),与断点相同,都会在运行到该处时暂停,不同之处就是临时断点(临时硬件断点)会在此时被删除,故在只需停止一次时用起来很方便。
0x02. 改变变量的值
可以使用命令set variable
改变运行中程序的变量值。格式: set variable <变量>=<表达式>
1 | (gdb) p options |
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 | 格式: |
程序在指定的断点处暂停后,就会自动执行命令。
0x09. gdb的常用命令及省略形式
命令名称在不与其他命令重复的前提下,可以按照下述方式简写,如下表所示。在命令行模式下使用时,按Tab键,gdb就会自动补全命令。
常见命令和简写形式
命令 | 简写形式 | 说明 |
---|---|---|
backtrace | bt、where | 显示栈帧 |
break | b | 设置断点 |
continue | c、cont | 继续运行 |
clear | 删除断点 | |
delete | d | 删除断点 |
finish | fin | 运行到函数结束 |
info breakpoints | info break | 显示断点信息 |
next | n | 执行下一行,单步步过 |
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 | 汇编级,单步步入 |