1.5 GDB 基本使用
1.5.1 介绍
GDB
是GNU
提供的调试工具,是最原始的调试工具。
本章节将简单介绍GDB
的使用,满足基本需求。
关于更多内容:
(gdb) help // 查看帮助
1.5.2 生成可调试文件
$ gcc main.c add.c sub.c mul.c div.c -o main -g -Wall // 必须开启 -g, 建议开启 -Wall
-g
将建立可调试文件,在可执行文件中嵌入源代码
与机器码
映射关系。- 调试建立发生在
编译环节
,即预处理代码
→ \to →汇编代码
环节,也可以对汇编代码
建立调试,将嵌入汇编代码
与机器码
映射关系(即后续调试将是对汇编代码的调试)。可以对不同文件选择性建立调试,再连接成完整文件。 -g
建立的可调试文件体积通常大于一般可执行文件。- 可调试文件与源文件建立了映射关系,调试时需确保源文件在原始位置(绝对路径),未删改。
1.5.3 常用命令
启动与结束
$ 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 // 跳出函数, 并立即停留