建站提交历史文章,原文写作时间 2023 年 2 月前后。

GDB 基本使用

介绍

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

本章节将简单介绍GDB的使用,满足基本需求。

关于更多内容:

1
(gdb) help  // 查看帮助

生成可调试文件

1
$ gcc main.c add.c sub.c mul.c div.c -o main -g -Wall  // 必须开启 -g, 建议开启 -Wall
  • -g将建立可调试文件,在可执行文件中嵌入源代码机器码映射关系。
  • 调试建立发生在编译环节,即预处理代码 \to 汇编代码环节,也可以对汇编代码建立调试,将嵌入汇编代码机器码映射关系(即后续调试将是对汇编代码的调试)。可以对不同文件选择性建立调试,再连接成完整文件。
  • -g建立的可调试文件体积通常大于一般可执行文件。
  • 可调试文件与源文件建立了映射关系,调试时需确保源文件在原始位置(绝对路径),未删改。

常用命令

启动与结束

1
2
3
4
$ 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行。
1
2
3
4
5
6
7
8
9
10
11
12
(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
1
2
3
4
5
6
7
8
9
10
(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
1
2
3
4
5
6
7
(gdb) start  // 启动程序, 无视断点
(gdb) run // 启动程序, 断点停留
(gdb) print <expression> // 打印值
(gdb) continue // 运行至下一断点
(gdb) next // 运行至下一行, 不进函数
(gdb) step // 运行至下一行, 进入函数
(gdb) finish // 跳出函数, 并立即停留