GDB 基本使用
介绍
GDB是GNU提供的调试工具,是最原始的调试工具。
本章节将简单介绍GDB的使用,满足基本需求。
关于更多内容:
(gdb) help // 查看帮助
生成可调试文件
$ gcc main.c add.c sub.c mul.c div.c -o main -g -Wall // 必须开启 -g, 建议开启 -Wall
``·
* `-g`将建立可调试文件,在可执行文件中嵌入`源代码`与`机器码`映射关系。
* 调试建立发生在`编译环节`,即`预处理代码` $\to$ `汇编代码`环节,也可以对`汇编代码`建立调试,将嵌入`汇编代码`与`机器码`映射关系(即后续调试将是对汇编代码的调试)。可以对不同文件选择性建立调试,再连接成完整文件。
* `-g`建立的可调试文件体积通常大于一般可执行文件。
* 可调试文件与源文件建立了映射关系,调试时需确保源文件在原始位置(绝对路径),未删改。
### 常用命令
#### 启动与结束
``` cpp
$ gdb <file> // 启动 GDB
$ gdb <file> -d <director> // 启动 GDB 并将 director 列入搜索目录
$ gdb <file> -x <config_file> // 启动 GDB 并首先执行 config_file 中命令
(gdb) quit // 或 q // 退出 GDB
显示代码
- 显示代码命令为
list,可以用缩写l代替。 - 显示代码与当前定位相关(如下文第1~3条),首次定位在
main程序第1行。
(gdb) list // 显示代码, 从上次定位继续
(gdb) list <line> // 显示当前文件第 line 行代码上下文
(gdb) list <function> // 显示当前文件 function 函数上下文, 当前文件不存在, 前往其他文件查找
(gdb) list <st>,<ed> // 显示当前文件第 st 至 ed 行代码
(gdb) list <file>:<line> // 显示 file 文件第 line 行代码上下文
(gdb) list <file>:<function> // 显示 file 文件 function 函数上下文
(gdb) list <file>:<st>,<ed> // 显示 file 文件第 st 至 ed 行代码
(gdb) set listsize <size> // 设置一次显示代码行数, 初始 10
(gdb) show listsize // 显示一次显示代码行数
设置断点与监视
- 相关缩写:
break-b,info-i,delete-del-d,enable-en,disable-dis。
(gdb) break [<file>:](<line>|<function>) // 设置断点
(gdb) break <line> if <expression> // 设置条件断点
(gdb) info break // 显示断点属性列表
(gdb) watch <expression> // 设置监视
(gdb) info watch // 显示监视属性列表
(gdb) delete <number> // 删除断点/监视, number 为 info ... 显示的序号
(gdb) disable <number> // 停用断点/监视
(gdb) enable <number> // 启用断点/监视
开始调试
- 相关缩写:
run-r,print-p,continue-c,next-n,step-s,finish-fin。
(gdb) start // 启动程序, 无视断点
(gdb) run // 启动程序, 断点停留
(gdb) print <expression> // 打印值
(gdb) continue // 运行至下一断点
(gdb) next // 运行至下一行, 不进函数
(gdb) step // 运行至下一行, 进入函数
(gdb) finish // 跳出函数, 并立即停留