一起talk GDB吧(第三回:GDB断点调试)

各位看官们,大家好,上一回中我们说的是GDB的单步调试功能,并且说了如何使用GDB进行单步调试。

这一回中,我们继续介绍GDB的调试功能:断点调试。当然了,我们也会介绍如何使用GDB进行断点调试。

闲话休提,言归正转。让我们一起talk GDB吧!

看官们,我们先说一下什么是断点。所谓的断点,就是人为地让程序在某个地方停止运行,这个地方就是

我们所说的断点。GDB提供了断点调试功能,断点有位置断点和条件断点两种,下面我们介绍如何使用GDB

来进行断点调试。

位置断点:使用断点命令break(缩写为b)可以在调试过程中添加位置断点。例子:b n/fun。这里的n表示

在程序中第n行设置一个断点。fun是函数名,表示在函数fun开头设置断点。设置完断点后,程序运行到

断点处就会停下来,这时使用命令continue(缩写为c)进行单步调试。注意这里所说的单步调试是指程序会

一直运行直到遇到断点才停止下来,与前面说的单步调试命令next不一样,next是依据程序的执行顺序一

步一步地走。

条件断点:也是使用断点命令b,不过在命令中添加了条件。例子:b n/fun if condition.这里的n表示行号,

fun表示函数名,condition就是条件,它的写法和C语言中的写法一样。该命令表示,如果if后面的条件满足

时在n行或者名为fun的函数开头停下来。注意一下条件断点中的条件不满足时程序是不会停下来的,这和位

置断点不一样,位置断点只要程序运行到断点所在的位置,程序无条件停下来。与条件断点配合使用的调试

命令是run(缩写为r)它有点类似start命令,它会让程序从头开始运行,直到条件断点中的条件满足时,程

序停在条件断点处。对比一下位置断点中的continue命令,也有这样的功能,不同之处在于它不会让程序从

头开始运行。

在调试过程中,可以使用GDB进行断点管理。GBD提供的断点管理功能有:查看断点,关闭断点,启动断点

和删除断点。下面我们分别来说这些功能。

查看断点:使用info命令可以查看调试中所有的断点,例子:i breakpoints.

GDB给断点进行了编号,每个断点都有一个序号。

关闭断点:使用disable breakpoints n可以禁用编号为n的断点。

启用断点:使用enable n可以启动用编号为n的断点。

删除断点:使用命令delete breakpoints n可以删除编号为n的断点。

看官们,在程序中可以依据调试的需要设置一个或者多个断点,断点类型也不受限制。当我们怀疑程序中

某个地方有错误时,可以在这个地方设置一个断点。当程序运行到断点处时就可以停下来,这比使用单步

调用命令一步一步地运行要效率高一些。关于断点的调试方法,我们举例子来说明:

1 #include<stdio.h> 23 void funA() 4 { 5printf("funA is running \n"); 6 } 78 int main() 9 { 10int i =0; 11 12for(i=0; i<5; ++i) 13printf("i= %d",i); 14 15printf("break point test program"); 16 17funA(); 18return 0; 19 }

1.打开vim,输入以上代码,并且保存为m.c文件。

2.使用GCC编译该文件:gcc -g m.c -o m

3.使用GDB调试程序:gdb m

4.设置位置断点:(gdb) b 13,表示在上面程序的第13行设置一个位置断点。运行后程序输出以下结果:

Breakpoint 2 at 0x804847c: file m.c, line 13.

(gdb) b funA 表示在funA函数哪里设置一个位置断点。运行后程序输出以下结果:

Breakpoint 1 at 0x8048453: file m.c, line 5.

5.设置条件断点:(gdb) b 12 if i=3 表示在上面程序的第12行设置一个条件断点。断点停止的条件是

i=3.运行后程序输出以下结果:

Breakpoint 3 at 0x8048472: file m.c, line 12.

6.查看所有断点:(gdb) i breakpoints 运行后程序输出以下结果

Num Type Disp Enb Address What

1 breakpoint keep y 0x0804847c in main at m.c:13

2 breakpoint keep y 0x08048453 in funA at m.c:5

3 breakpoint keep y 0x08048472 in main at m.c:12

stop only if i=3

结果中第一列的数字就是断点号。Enb哪一列,表示这些断点都在启动状态。

7.开始调试:(gdb) start//开始调试的命令为start,运行后程序输出以下结果:

Temporary breakpoint 4 at 0x804846a: file m.c, line 10.

Starting program: xxx/test/s

Temporary breakpoint 4, main () at m.c:10

10 int i =0;

(gdb) n //使用单步调试,运行后程序输出以下结果:

12 for(i=0; i<5; ++i)

(gdb) //这里按下回车键,继续单步调试,运行后程序输出以下结果:

Breakpoint 1, main () at m.c:13 //程序在13行的断点处停止下来

13 printf("i= %d",i);

(gdb) c //这里表示继续进行单步调试,运行后程序输出以下结果:

Continuing.

Breakpoint 1, main () at m.c:13 //程序又一次在13行的断点处停止下来

13 printf("i= %d",i);

(gdb) disable 1 //关闭位于13行的位置断点。启动/删除断点的方法和关闭断点的方法相同

(gdb) n //使用单步调试

12 for(i=0; i<5; ++i)

(gdb) //这里按下回车键,继续单步调试,运行后程序输出以下结果:

13 printf("i= %d",i);

(gdb)

12 for(i=0; i<5; ++i) //单步调试后,程序不会在13行停止,而是反复执行12,13行的内容。

(gdb)

13 printf("i= %d",i);

(gdb)

12 for(i=0; i<5; ++i)

使用stop停止调试,然后来体验一下条件断点。

(gdb) b 12 if i=3 //首先在程序中12行设计一个条件断点

Breakpoint 1 at 0x8048472: file m.c, line 12.

(gdb) i breakpoints

Num Type Disp Enb Address What

1 breakpoint keep y 0x08048472 in main at m.c:12

stop only if i=3

(gdb) run //开始调试,如果满足条件断点中的条件,那么程序停止在断点哪里

Starting program: xxx/test/s

Breakpoint 1, main () at m.c:12 //如我们所愿,程序满足条件后停止下来了

12 for(i=0; i<5; ++i)

看官们,通过这个综合的例子,大家掌握了如何使用GDB进行断点调试了吧。不过有一点需要说明,这里

的断点是为了演示GDB的调试功能而设置的,大家在实际使用中,可以依据程序中的错误来设置断点,,毕

竟调试程序是为了找出程序中的错误,这才是我们主要的目的。

看官们,关于GDB的内容,今天咱们就说到这里。欲知后事如何,且听下回分解!

版权声明:本文为博主原创文章,未经博主允许不得转载。

放手后的微笑,只是用来掩盖疼痛的伤疤…

一起talk GDB吧(第三回:GDB断点调试)

相关文章:

你感兴趣的文章:

标签云: