写 C 或者 C++ 程序时有时候发现出了问题,总是习惯于直接 printf 或者 cout,如果观察的地方比较少,用这种方法还好,但是一旦需要观察的变量多了起来,就非常麻烦。写一大堆累赘的 print 语句很麻烦,而且会让自己的程序变得混乱。
知道 gdb 这个 linux 调试工具是很久之前的事情了,但是那个时候还是 print 流派(或者不想付出学习新事物的时间,觉得 print 还能应付),但是现在因为需求的变化,在慢慢使用 gdb 的过程中,发现确实非常好用,也慢慢开始变得熟练了起来。
gdb 的一些基本命令
注意 = []
中是可以省略输入的字母。
设置断点:
b[reak] 行号
删除断点:
delete 断点id
删除所有断点 =
delete
展示所有断点信息 =
i[nfo] b[reakpoints]
注意想要使用 gdb,在编译的时候需要在最后加上
-g
选项,以便生成的程序中带有调试信息。gcc main.c -o main -g
运行程序 =
r[un]
查看变量的值 =
p[rint] 变量名
查看变量类型 =
ptype 变量名
单步执行
next
step
两者的区别是 next 遇到函数不会进入函数内部,step 会执行到函数内部。
查看堆栈内容 =
i[nfo] frame
查看栈帧:
backtrace
查看全局变量和静态变量:
info variables
查看当前 stack frame 局部变量 =
info locals
查看当前 stack frame 参数:
info args
选取待 debug 文件 =
file xxx
有时候 debug 跑过了我们想要的看的信息所在处,这个时候我们想要回退一下,gdb 也有这个回退的功能:
- run 之后输入
record
命令启动记录回放 - 接下来就可以使用
reverse-next
…, 或者直接rn
- 关闭进程记录回放 =
reverse stop
- run 之后输入
执行到下一个断点 =
continue
: resume execution and continue until a breakpoint is hit.
gdb 图形化界面
gdbtui
gdbtui 是 gdb 自带的命令行界面。
界面开启 = gdbtui -q 程序名
默认情况下,GDB TUI 模式会显示 command 窗口和 source 窗口,如上图所示,还有其他窗口,如下列举的四个常用的窗口:
(cmd)command 命令窗口,可以输入调试命令 (src)source 源代码窗口,显示当前行、断点等信息 (asm)assembly 汇编代码窗口 (reg)register 寄存器窗口
cgdb
- 比 gdbtui 更好的一点是对于源码会有高亮,而且界面更加光滑。
安装 = sudo apt-get install cgdb
使用了 vi 的模式,基本使用方法如下 =
esc
进入 cgdb modei
进入 gdb mode- 在代码处窗口使用
空格
设置或取消断点 - 调整窗口大小` =set winsplit=‘style’
- 退出
quit
<ctrl-d>
在 gdb 中调试带有scanf
语句时如同陷入了死循环,这个时候在 cgdb 中需要
1. 按下esc
后按下T
,会出现一个新窗口,在这里面输入要输入的东西
2. 然后再esc
后i
进入到gdb mode
即可。
vim + gdb(best of all)
需要的环境 =
- vim(v8.1+)
- gdb(v7.2+)
这一篇是安装 gdb-9.2的文章。
这个用着的体验是三个中较好的一个,主要是窗口之间的联动很不错,刷新界面也很顺滑。

可以看到有三个窗口:
- 源码窗口 = 可以在源码窗口对应位置输入
:Break
打断点 - Debug 窗口 = 这里输入 gdb 命令进行各种查看
- I/O 窗口 = 当源码中有输入语句时,在这里进行输入
学习 gdb 的资源
- RMS’s gdb Debugger Tutorial, 这个教程很简洁。