一、调试前的预备知识
程序发布的方式有两种,debug 模式和 release 模式。
- debug 模式:生成的可执行程序中会包含程序的调试信息,便于程序员进行调试代码。
- release 模式:会剥离或不生成这些调试信息。这使得文件更小,但也意味着调试器几乎无法工作,release 版本程序无法进行调试。
Linux 的 gcc/g++,按照我们之前的写法 gcc -o $@ $^,默认生成的是 release 版本的程序,是无法进行调试的。要在命令后加-g 选项,指定以 debug 方式发布,debug 模式下的程序我们才能进行调试。
gcc -o $@ $^ -g
二、gdb/cgdb 的使用
1. 启动,查看代码
开始使用 gdb/cgdb 调试,首先要确定系统里已安装 gdb/cgdb,其次要调试的程序确定是 debug 版本的。
gdb 文件名
gdb 和 cgdb 中,需要用各种指令完成调试过程的不同操作:
- 退出调试:
Ctrl+D或输入quit回车
使用 gdb,一开始是看不到我们的代码的,要使用 l 相关命令:
- 输入(list)
l:显示源代码,每次显示 10 行 - 输入
l 函数名/文件名:列出指定函数/指定文件的代码 - 输入
l 文件名:行号:列出指定文件以某一行为中的几行代码
实际开发中要靠自己显式出代码,还是很麻烦。因此 cgdb 诞生了,cgdb 是 gdb 的前端界面增强版本,能够直接将代码显示在屏幕上面,除此之外其他命令操作没有区别。
后面我们就在 cgdb 中进行演示了。
2. 基础调试命令
- 命令(run)
r:开始调试,从程序开始执行,调试中途随时可以输入r重头调试 - 命令(break)
b [文件名:]行号:在指定行号设置断点 - 命令
info b:查看当前所有断点的信息 - 命令
d:删除所有断点 - 命令
d 断点序号:删除指定序号的断点
断点会在行号处标明。
每一个断点都有一个序号,通过 info b查看,删除指定断点需要指明这个序号,而不是断点的行号:
- 命令(continue)
c:从当前位置开始连续执行程序,到下一个断点 - 命令(next)
n:单步逐过程执行,遇到函数时不进入函数内部 - 命令(step)
s:单步逐语句执行,遇到函数时进入函数内部 - 命令(finish)
f:执行到当前函数返回时 - 命令
until 行号:执行到指定行号
gdb/cgdb 中,回车自动执行上一条命令
3. 监视变量相关命令
在调试过程中,我们经常需要观察一个变量的值:
- 命令(print)
p 变量/表达式:打印出变量/表达式的值。 - 命令
set var 变量 = 值:修改一个变量的值 - 命令
display 变量:持续显示一个变量的值 - 命令
undisplay 变量序号:取消对指定序号的变量的持续追踪显示


