目录
一,gdb简介
二,gdb的指令
1.查看gdb是否有下载
2.需要明确的知识点
3.调试指令
1.打开调试代码
2.以某行为起点显示代码
3.打断点,查看断点,删除断点,禁用断点,启用断点
4.逐过程,逐语句,断点与断点之间的跳转。
5,监视变量
6.其它命令
一,gdb简介
gdb其实就是Linux下的调试工具。这个调试工具具有许多的功能。比如说打断点,监视,在debug模式下运行代码等等。
二,gdb的指令
在gdb这个工具里边具有许多的指令,今天我们只学习最简单的几条指令来帮助我们能够上手gdb这个调试工具。
1.查看gdb是否有下载
这条指令是:gdb -- v。如下:
显示了这样的信息就表示你的Linux下已经装载了gdb这个调试工具了。如果显示没有下载这个工具的话便可以使用yum工具进行下载。如下:
因为我是普通账户所以要用到sudo指令来下载这个工具。
2.需要明确的知识点
在这里我们需要明确的便是在Linux下使用gcc编译好的可执行文件的默认模式是release模式。那我们该如何证明呢?其实我们只需要将默认模式下编译好的代码的大小与使用-g选项编译好的代码进行大小比较通过两者的大小便能证明这一点。如,现在我写了以下代码:
#include<stdio.h> 2 int Addtotop(int top) 3 { 4 int sum = 0; 5 int i = 1; 6 for(;i<=top;i++) 7 { 8 sum+=i; 9 } 10 return sum; 11 } 12 13 14 int main() 15 { 16 printf("%d\n",Addtotop(100)); 17 return 0; 18 }
现在再来写一个Makefile文件,该文件如下:
code:gdb_test.c 2 gcc $^ -o $@ 3 .PHONY:clean 4 clean: 5 rm- f code
现在便生成了一个文件叫作code,然后我在指令后面加上选项-g便能生成debug版本的文件,操作如下:
1 code-g:gdb_test.c 2 gcc $^ -o $@ -g//加入指令-g能够生成debug模式的可执行文件 3 .PHONY:clean 4 clean: 5 rm- f code
现在我的列表里便有如下可执行文件,一个是默认生成的code,一个是debug模式下的code-g:
现在使用ll指令查看这两个文件的信息如下:
可以看到在对同一份代码,默认生成的可执行文件code的大小是8392,使用-g选项生成的可执行文件code-g的大小是9568从这里便可以证明code可执行文件明显就是release模式下的可执行文件。
3.调试指令
1.打开调试代码
打开调试代码的指令是gdb+debug模式下的可执行文件。如:
成功打开会显示以下信息:
2.以某行为起点显示代码
这样做的指令是l+行数,比如我要从第零行开始显示:
可以发现这段代码是从第零行开始显示了,但是只显示了十行。如果要全部显示的话多按几下回车键就行了:
3.打断点,查看断点,删除断点,禁用断点,启用断点
这些操作在调试代码时都是必不可少的操作,现在我们来一一对这些操作的指令介绍一番:
1.打断点:b+代码行号,b+文件名+冒号+代码行号,b+函数名,b+文件名+冒号+函数名
打断点如下:
2.查看断点:info+b
在上面打完断点以后我便可以查看这些断点,操作如下:
使用info b选项后便可以查看这些断点的信息。
3.删除断点:d+断点的断点编号
在这里要注意的是我们在删除断点时删除的时d后面加的是断点的编号而不是行号。比如现在我有如下断点:
比如我要删除第四行的断点,我的指令便是d 1 而不是 d 4:
4.禁用断点:disable+断点编号
如我要禁用掉第二个断点:
5.启用断点:enable+断点编号
如我要启用第二个断点:
4.逐过程,逐语句,断点与断点之间的跳转。
在Linux下这两个功能实现的按键便是n与s。n表示逐过程,s表示逐语句。当使用逐过程的方式调试的时候,当遇到函数的时候就会跳过整个函数。当使用逐语句的时候,当遇到函数的时候就会进入到函数中一条一条指令的执行。断点与断点之间跳转的指令是c,表示continue。当执行这个指令时,程序跑起来时就会按照断点与断点之间的代码块一块一块的跑起来。
5,监视变量
要发现程序之中是否有错误,最重要的便是监视变量的值。我们该如何监视呢?这里有三种指令:1.p 2.display 3.undisplay。
1.这里的p+x表示显示变量x的值,但是使用p做不到常显示。使用p只能在这一步执行时显示要显示的值。
2.如果要常显示一个值的话就要使用display+x命令,这样在每一次执行代码时都能够显示x变量的值。
3.undisplay+变量的显示编号表示取消对变量x的常显示。
6.其它命令
在gdb下,除了上面的重要的命令之外。还有些不那么重要的命令。
1.finish:表示将一个函数给执行完。
2.bt:查看调用堆栈。
3.set var +变量名+数值:给变量赋值。