gdb basic usage and some useful gdb ui
写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
执行到下一个断点:
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, 这个教程很简洁。