GDB的基本使用方法(基础篇)
gdb调试流程
1.带调试选项编译,构建调试对象
2.启动调试器GDB
3.设置断点
4.显示栈帧
5.显示值
6.继续执行
断点
break <函数名、行号、文件名:函数名、文件名:行号、addr> (常用)
break +/-offset 当前暂停位置向后/前offset行
条件断点
b 断点 if 条件
condition 断点编号 删除断点设置的条件
condition 断点编号 条件 给指定的断点增加触发条件
反复执行
ignore 断点编号(断点 监视点 捕获点) 次数 continue + 次数 到达断点不暂停
continue step stepi next nexti
代码内部暂停
finish 执行完当前函数后暂停
until 执行循环的其余部分,出循环后暂停
删除断点和禁用断点
clear 函数名/行号
delete 断点编号
enable/disable 使能/禁用 所有断点
enable/disable 断点编号 …指定编号
enable/disable display 显示编号 禁用display命令定义的自动显示
enable/disable mem 内存区域 禁用mem定义的内存区域
enable once/delete 断点编号 启用断点后运行一次 禁用/删除
断点命令
commands 断点编号
命令
end
栈帧
栈帧
bt 查看当前栈帧(等同于info stack)
up / down 切换到 上/下一个栈帧
frame num 切换到num栈帧
info frame num 查看栈帧详细信息 i f 1(缩写)
gdb 查看进程的内存映射 i proc mappings GDB会打开 /proc//maps
如果分析内核转储 可用 info files info target
bt full (-)n 查看最近/(初)的几个栈帧 详细信息
显示
print命令可以显示变量 简写p
info registers可以显示寄存器 简写i r
在寄存器名称前添加$,即可显示各个寄存器的内容
显示时可使用以下格式
p/格式 变量
显示寄存器可使用的格式
格式 | 说明 |
---|---|
x | 十六进制数 |
d | 十进制数 |
u | 无符号十六进制数 |
t | 二进制数 |
a | 地址 |
c | 字符 |
f | 浮点数 |
s | 字符串 |
i | 机器语言(仅在显示内存的x命令中可用) |
反汇编
disassemble 简写disas
格式
disassemble 反汇编当前函数
disassemble $rip 反汇编程序基数器所在函数
disassemble start_addr end_addr 反汇编一段地址内的代码
单步执行
next(n):执行源代码中下一行的命令;若遇到函数调用,想执行到函数内部,使用step(s)命令。
逐条执行汇编执行对应nexti和stepi
继续运行
continue 简写c
继续运行,遇到断点后暂停。
continue num:忽略num次断点
监视点
watch <表达式> 表达式为常量或变量,发生变化是暂停运行。
查看断点和监视点
info breakpoint 简写 i b
删除断点和监视点
delete num 删除编号为num的断点或监视点
启动调试
gdb file.name (file.name为编译附带调试信息的可执行程序)
gdb attach `pidof cmd` 挂到某个进程上进行调试
info proc可查看当前进程信息
若打算保存调试的日志信息
set logging file debug.logging //设置存储文件名
set logging overwrite //覆盖同名文件
set logging on //开始记录
set logging off //结束记录
介绍了GDB工具的基本用法,后续会针对一些常见Bug进行分析。