调试器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 | 汇编级,单步步入 |