Linux gdb 的基本使用

2020/10/24

写 C 或者 C++ 程序时有时候发现出了问题,总是习惯于直接 printf 或者 cout,如果观察的地方比较少,用这种方法还好,但是一旦需要观察的变量多了起来,就非常麻烦。写一大堆累赘的 print 语句很麻烦,而且会让自己的程序变得混乱。

知道 gdb 这个 linux 调试工具是很久之前的事情了,但是那个时候还是 print 流派(或者不想付出学习新事物的时间,觉得 print 还能应付),但是现在因为需求的变化,在慢慢使用 gdb 的过程中,发现确实非常好用,也慢慢开始变得熟练了起来。


gdb 的一些基本命令

注意 = []中是可以省略输入的字母。

  1. 设置断点:b[reak] 行号

  2. 删除断点:delete 断点id

  3. 删除所有断点 = delete

  4. 展示所有断点信息 = i[nfo] b[reakpoints]

  5. 注意想要使用 gdb,在编译的时候需要在最后加上-g选项,以便生成的程序中带有调试信息。

    gcc main.c -o main -g

  6. 运行程序 = r[un]

  7. 查看变量的值 = p[rint] 变量名

  8. 查看变量类型 = ptype 变量名

  9. 单步执行

    1. next
    2. step 两者的区别是 next 遇到函数不会进入函数内部,step 会执行到函数内部。
  10. 查看堆栈内容 = i[nfo] frame

  11. 查看栈帧: backtrace

  12. 查看全局变量和静态变量:info variables

  13. 查看当前 stack frame 局部变量 =info locals

  14. 查看当前 stack frame 参数:info args

  15. 选取待 debug 文件 = file xxx

  16. 有时候 debug 跑过了我们想要的看的信息所在处,这个时候我们想要回退一下,gdb 也有这个回退的功能:

    1. run 之后输入record命令启动记录回放
    2. 接下来就可以使用reverse-next…, 或者直接rn
    3. 关闭进程记录回放 = reverse stop
  17. 执行到下一个断点 = 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

  1. 比 gdbtui 更好的一点是对于源码会有高亮,而且界面更加光滑。

安装 = sudo apt-get install cgdb

使用了 vi 的模式,基本使用方法如下 =

在 gdb 中调试带有scanf语句时如同陷入了死循环,这个时候在 cgdb 中需要 1. 按下esc后按下T,会出现一个新窗口,在这里面输入要输入的东西 2. 然后再esci进入到gdb mode即可。

vim + gdb(best of all)

需要的环境 =

这一篇是安装 gdb-9.2的文章。

这个用着的体验是三个中较好的一个,主要是窗口之间的联动很不错,刷新界面也很顺滑。

可以看到有三个窗口:

学习 gdb 的资源

  1. RMS’s gdb Debugger Tutorial, 这个教程很简洁。