目录
1.背景
2.指令的使用
2.1gdb的使用和退出
2.2显示源代码
2.3运行程序
2.4调试
1.打断点
2.查断点
3.去断点
4.运行
5.关闭断点
6.启用断点
7.逐过程
8.进入函数
9.显示变量的值
1.背景
众所周知,我们的程序发布有两种,分别是debug模式和release模式,在Linux中我们主要有两种编译器——gcc和g++,一个是编译C语言程序的,一个是编译C++程序的,当我们使用这些编译器进行汇编步骤的时候,会生成一个二进制文件,Linux系统中默认它是release模式的。那如果我们想使用gdb调试器来进行调试的话该怎么做呢?
我们需要在源代码生成二进制程序的时候, 加上 -g 选项。(如图所示)
由上图所示,我们可以看到生成了一个testdebug的二进制文件。
gdb调试器对debug模式的文件才能使用,所以我们才要生成testdebug这个文件。
接下来我就来讲解一些指令要如何去使用。
2.指令的使用
2.1gdb的使用和退出
我们使用gdb直接gdb 文件就行了。
如图所示,这就说明我们的gdb使用成功了。
那么我怎么退出呢?
很简单,直接quit就能退出了。
2.2显示源代码
list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
这是我们简单写的一段代码,接下来我会用它来进行举例说明。
如图所示,我们使用list/l时一次显示10行,我们再按回车就会再打印10行,打印完了就会停下,我们再来看看list/l + 行号:
我们发现list/l + 行号不是从你输入的行号开始往后显示10行,而是以你输入的为中间值,显示上下文,总共为10行。如果没有下文它就不显示下文嘛(没有上文同理),如图所示:
我们也可以加函数名来进行显示:
如上图所示,我们使用list/l + 函数名的方式也是查函数名的上下文总共为10个。
2.3运行程序
r或run:运行程序。
第一行表示的是我们开始运行的项目还有这个项目的位置,第二行exited normally表示的是程序正常运行结束。
2.4调试
1.打断点
我们可以b + 行号/函数名。
第二行的意思就是打了一个序号为1的断点,后面的十六进制就是它的地址,test.c就是文件名,行数在第十行。
2.查断点
info break :查看断点信息。(也可以简写成i b)
由此我们就可以看到它的断点个数、序号,Disp我们先不管,Enb表达的是它的使能,就是说这个断点是开启的状态(y)还是关闭的状态(n),后面的信息就是它的地址,还有在哪个文件.
3.去断点
delete breakpoints n:删除序号为n的断点(d 序号)
4.运行
我们在第十五行的时候打了一个断点,所以运行在第十五行的位置停了下来。
5.关闭断点
disable breakpoints:禁用断点
如图所示,我们保留了序号为二的断电且禁用了它。
6.启用断点
disable breakpoints:禁用断点
如图所示,使能又变回了y。
7.逐过程
n 或 next:单条执行。
我们在run运行后自动到了我们的断点位置,接下来我们输入n/next就可以逐过程调试了,由于Linux的gdb会自动记录上一次的指令,所以我们直接一直回车就可以了。
8.进入函数
s或step:进入函数调用
没遇到函数前我们还是继续n,到函数的时候我们输入s/step,就进入到我们的函数中了。
9.显示变量的值
p/print 变量:打印变量值。
如图所示,我们a,b加起来是2,所以我们的c=a+b就是2,$后面的数字表示查询了几次。
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
这里记住输入的不是变量名,而是它前面的序号。