1、什么是gdb?
gdb,是The GNU Project Debugger 的缩写,它是一款用于Linux下调试代码的调试器。可以调试C与C++代码,它支持单步执行,逐过程执行,打断点(多个断点也是可以滴!),查看函数堆栈等功能。
2、gdb的使用
我们都知道程序的发布方式分为两种,一种是debug版本,一种就是release版本啦。debug版本就是可以用于调试找bug的版本,release版本是经过大量优化,去除bug后的发布版本。
所以我们如果想要用gdb,就肯定得在debug下调试。
有些小伙伴的linux下可能没有gdb,可以直接输入命令sudo yum -y install gdb安装哦!
我们前面已经说了我们想要使用gdb,必须要是debug的。但是很遗憾,gcc编译器默认生成的exe文件是release的。
我们验证一下吧。
这里呢,我先用gcc命令将7_30.c编译为可执行程序,然后使用gdb命令进入调试。
但是我们不管使用什么gdb命令都无法调试,这说明了确实gcc编译后的版本是releas的。
那我们处理这个情况的话只要在命令gcc后面加上-g选项,就可以让可执行程序变成debug的啦。
这是加上后的结果,我用了gdb中的显示代码命令,确实是可以调试的。
接下来来讲一下基本的命令吧。
进入调试状态的话是gdb+可执行文件名(一定是debug的哦)。
1、退出gdb:quit,开始调试:r
2、显示代码:l命令(默认显示10行),l+0从头开始显示,往后再输入l的话就可以再显示下面的10行!
3、加入断点(b+行号),显示断点状态(info+b)和取消断点(d+行号)
加入断点:
显示断点的状态:
其中3 4是断点的编号,最后的 一列表示的是断点所在的行数。中间的Enb列表示断点的是否可以被执行,如果状态是n而不是y的话,我们程序就会跳过这个断点。我们可以通过命令disable+断点编号把这个断点的状态变为n。
这是输入命令后,我们程序r后直接跳过了16行的断点。
取消断点:
这里我输入了命令让编号为3的断点取消,再info b查看断点的信息时候,编号3的断点确实没有了。
有时候我们会有一些特殊的要求,比如说是从一个断点直接跳到下一个断点,那就输入命令c,就可以了,实验的话留给各位读者。
4、单步执行(s)与逐过程执行(n)
我上面写了一个函数,就是为了显示单步执行的情况。 现在我先从函数那一步开始执行,直接打个断点跳到17行
按s单步执行进入函数,
命令bt可以查看调用堆栈的情况,我们可以看一下Add函数是否真的被调用了。
可以看出来Add函数已经被调用了, 根据栈的性质,应该是main函数先被调用,所以它压在了栈底。
5、查看变量
现在我们已经在函数当中啦,函数里有一个循环,如果我们想要查看循环变量和结果变量的情况,可以使用display命令+变量名,在每次单步执行的时候都会显示它们。
如果想要取消显示,使用命令undisplay+变量编号 (在上面的图中可以看到,每次显示的左边都有变量对应的编号,比如res就是2,i是1)。
如果我们现在处于循环当中,想要结束掉循环,一种方式是用finish直接结束函数调用,但是我们仅仅只是想要跳出循环的话,可以使用until+行数的方法,跳到对应的行数。
这里我们直接跳到了第12行return的地方,res的结果也出来了,所以我们确实跳出了循环。
好啦,最基础的 使用方式就是这些,更多的指令大家可以自己挖掘哦,作者在后续的学习会继续为大家介绍gdb的使用!