各位看官们,大家好,上一回中我们说的是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> 2 3 void funA() 4 { 5 printf("funA is running \n"); 6 } 7 8 int main() 9 { 10 int i =0; 11 12 for(i=0; i<5; ++i) 13 printf("i= %d",i); 14 15 printf("break point test program"); 16 17 funA(); 18 return 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的内容,今天咱们就说到这里。欲知后事如何,且听下回分解!
版权声明:本文为博主原创文章,未经博主允许不得转载。