Linux 开发系列笔记 - GDB 基本使用

108 阅读2分钟

GDB 基本使用

介绍

GDBGNU提供的调试工具,是最原始的调试工具。

本章节将简单介绍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 - binfo - idelete - del - denable - endisable - 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 - rprint - pcontinue - cnext - nstep - sfinish - fin
(gdb) start  // 启动程序, 无视断点
(gdb) run  // 启动程序, 断点停留
(gdb) print <expression>  // 打印值
(gdb) continue  // 运行至下一断点
(gdb) next  // 运行至下一行, 不进函数
(gdb) step  // 运行至下一行, 进入函数
(gdb) finish  // 跳出函数, 并立即停留