GDB调试器常用命令速查
1. GDB调试基础
在使用GDB进行程序调试前,需要在编译时添加调试符号信息。
1.1 编译带调试信息的程序
使用GCC编译时添加-g选项可生成GDB所需的调试信息:
gcc [其他编译选项] -g 源文件.c -o 可执行文件
1.2 查看源代码
# 启动GDB调试程序
$ gdb 可执行文件名
# 显示源代码(默认向后显示)
(gdb) list
# 向前显示源码
(gdb) list -
# 设置每次显示的源代码行数
(gdb) set listsize 数量
# 查看当前显示行数设置
(gdb) show listsize
2. 常用调试命令
2.1 断点管理
# 添加源码搜索路径
(gdb) dir 代码目录路径
# 在指定位置设置条件断点
(gdb) b 源文件.c:行号 if 变量名>=值
# 禁用指定编号的断点
(gdb) dis 断点编号
# 启用指定编号的断点
(gdb) en 断点编号
# 删除指定编号的断点
(gdb) del 断点编号
# 查看所有断点信息
(gdb) info b
2.2 程序执行控制
# 单步执行(不进入函数)
(gdb) n
# 单步执行(进入函数内部)
(gdb) s
# 监视变量值变化
(gdb) watch 变量名
# 打印变量值
(gdb) print 变量名
# 查看结构体成员
(gdb) print 结构体变量.成员名
# 格式化输出
(gdb) printf "输出格式\n", 变量1, 变量2
# 设置变量值
(gdb) set var 变量名=新值
2.3 窗口操作
# 切换到源码窗口
(gdb) focus src
# 切换到命令窗口
(gdb) focus cmd
# 调整窗口高度
(gdb) winheight CMD +20
2.4 自定义命令
可以通过define关键字定义GDB宏命令:
(gdb) define 自定义命令名
> print 变量1
> print 变量2
> end
2.5 内存操作
# 打印数组片段(从索引10开始打印100个元素)
(gdb) p 数组名[10]@100
# 导出内存数据到文件
(gdb) dump mem 保存文件名 起始地址 结束地址
# 附加到正在运行的进程
(gdb) attach 进程ID
3. 配置文件~/.gdbinit
GDB启动时会自动加载用户主目录下的.gdbinit文件,可在其中设置常用配置和自定义命令:
# 美化结构体输出格式
set print pretty on
# 设置打印元素数量上限
set print elements 200
# 允许设置延迟解析的断点
set breakpoint pending on
# 自定义打印坐标的命令(支持参数)
define pxy
printf "坐标: index=%d x=%.2f y=%.2f\n", index, x, y
p $arg0 * x
p $arg1 * y
end
# 启动时自动设置的断点
b test.cc:125
4. 堆栈调试
4.1 查看调用栈
# 显示堆栈信息(-3表示底部往上3层)
(gdb) bt -3
# 切换到指定栈帧
(gdb) f 帧编号
# 向栈顶方向移动n层
(gdb) up n
# 向栈底方向移动n层
(gdb) down n
4.2 查看栈帧信息
# 查看当前栈帧详细信息
(gdb) info f
# 查看当前函数的参数值
(gdb) info args
# 查看当前函数的局部变量
(gdb) info locals
5. 打印C++标准容器
在.gdbinit中添加Python脚本来支持STL容器打印:
python
import sys
sys.path.insert(0, '/usr/share/gcc-版本号/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers(None)
end
启用后可直接使用print命令查看vector、map、string等容器的内容。
6. 设置程序运行参数
通过set args命令可以指定程序启动时的命令行参数:
(gdb) set args -e "print('hello world')"
(gdb) r
# 输出结果:
> Starting program: /path/to/program -e "print('hello world')"
> hello world