0%

关于gdb使用的练习与gdb简介

gdb简介

gdb 是一个文本界面的调试器,功能强大,适合与 gcc/g++ 搭配使用。

一般来说,GDB主要帮助你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

下面是一个 gdb 常见命令的表格

简写 全称 备注
l list 显示指定行号或者指定函数附近的源代码
b break 在指定行号或者指定函数开头处设置断点。如 b main
r run 运行程序,直到程序结束或者遇到断点而停下
c continue 在程序中断后继续执行程序,直到程序结束或者遇到断点而停下。注意在程序开始执行前只能用 r,不能用 c
n next 执行一条语句。如果有函数调用,则把它作为一个整体
s step 执行一条语句。如果有函数调用,则进入函数内部
u until 执行到指定行号或者指定函数的开头
p print 显示变量或表达式的值
disp display 把一个表达式设置为 display,当程序每次停下来时都会显示其值
cl clear 取消断点,和 b 的格式相同。如果该位置有多个断点,将同时取消
i info 显示各种信息。如 i b 显示所有断点,i disp 显示 display,而 i lo 显示所有局部变量

如果希望逐条语句地执行程序,最常用的是 next(n) 与 step(s),其作用都是执行当前行,但如果涉及函数调用,next 会将函数作为一个整体执行完毕,而 step 将进入函数内部。如果需要连续执行 n 或 s,只需第一次输入后连续按 Enter 键,在 gdb 中,如果在提示符下直接按 Enter 键,等价于再次执行上一条指令。

如果想要详细了解某个命令的具体作用,可以在提示符下键入 help + 命令名或其缩写,来获取帮助信息,如 help finish

Execute until selected stack frame returns.
Usage: finish
Upon return, the value returned is printed and put in the value history.

高级应用

关于栈帧的相关命令,最常用的是 bt,用于查看函数堆栈。

关于断点控制的相关命令:

  • commands(comm) 命令可以指定在某个断点处停下来后所执行的 gdb 命令;
  • ignore(ig) 命令可以让断点在前 count 次到达时都不停下来;
  • condition(cond) 命令可以给断点加一个条件;

断点控制的一个例子:


一种特殊的断点:watchpoint

  • watch a : 在 a 修改时停下显示 a 修改前后的值
  • awatch a : 在 a 读写时都停
  • rwatch a : 在 a 被读时停下

在 gdb 中还能自由(不太自由地)调用函数(程序中新定义的函数与库函数),可以用 call、print、condition、display 命令来调用。

这是一个关于gdb使用的简单练习的示例

示例环境为:ubuntu 20.04


注意,若要使用 gdb 调试,用 gcc 编译时应加上 -g 选项,生成调试用的符号表。


参考文献

百度百科:gdb
算法竞赛入门经典/刘汝佳编著. ——2 版. ——北京:清华大学出版社,2014