一起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>
 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的内容,今天咱们就说到这里。欲知后事如何,且听下回分解!

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

时间: 2024-10-06 05:38:32

一起talk GDB吧(第三回:GDB断点调试)的相关文章

GDB中应该知道的几个调试方法

七.八年前写过一篇<用GDB调试程序>,于是,从那以后,很多朋友在MSN上以及给我发邮件询问我关于GDB的问题,一直到今天,还有人在问GDB的相关问题.这么多年来,有一些问题是大家反复在问的,一方面,我觉得我以前的文章可能没有说清楚,另一方面,我觉得大家常问的问题正是最有用的,所以,在这里罗列出来.希望大家补充. 一.多线程调试多线程调试可能是问得最多的.其实,重要就是下面几个命令: info thread 查看当前进程的线程.thread <ID> 切换调试的线程为指定ID的线程

GDB中应该知道的几个调试方法 来自陈皓

GDB中应该知道的几个调试方法 2011年2月10日陈皓发表评论阅读评论62,325 人阅读 七.八年前写过一篇<用GDB调试程序>,于是,从那以后,很多朋友在MSN上以及给我发邮件询问我关于GDB的问题,一直到今天,还有人在问GDB的相关问题.这么多年来,有一些问题是大家反复在问的,一方面,我觉得我以前的文章可能没有说清楚,另一方面,我觉得大家常问的问题正是最有用的,所以,在这里罗列出来.希望大家补充. 一.多线程调试 多线程调试可能是问得最多的.其实,重要就是下面几个命令: info th

Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件

交叉编译gdb和gdbserver 1.下载gdb:下载地址为:http://ftp.gnu.org/gnu/gdb/按照一般的想法,最新版本越好,因此下载7.2这个版本.当然,凡事无绝对.我们以gdb-7.2.tar.bz2 这个文件为例.2.解压缩: $ tar jxvf gdb-7.2.tar.bz2 注:小技巧:Linux下一般压缩文件后缀为.tar.bz2和.tar.gz,它们解压命令有两三个选项是一致的: xf(v),前者再加上j选项,后者再加上z选项. 3.进入该目录 $ cd g

【转】GDB中应该知道的几个调试方法

文章来源:http://coolshell.cn/articles/3643.html GDB中应该知道的几个调试方法 2011年02月10日 陈皓 评论 40 条评论  70,776 人阅读 七.八年前写过一篇<用GDB调试程序>,于是,从那以后,很多朋友在MSN上以及给我发邮件询问我关于GDB的问题,一直到今天,还有人在问GDB的相关问题.这么多年来,有一些问题是大家反复在问的,一方面,我觉得我以前的文章可能没有说清楚,另一方面,我觉得大家常问的问题正是最有用的,所以,在这里罗列出来.希望

第三回:羁旅客忆碌碌旧事 暴雨天里依依惜别[林大帅作品连载]

第三回:羁旅客忆碌碌旧事 暴雨天里依依惜别诗云:众位觊觎自难群,乱战夺魁是孤军 .韶华三载生旧梦,谁道栀花总负春.              却说林二一行粗览书院与南普陀寺之后,兴致不减.其中一头发中分者谓林二道:“见大哥哥你一路话语不多,眉宇间似有忧郁之气,必是个有故事之人.且我等皆出于文会,何不谈谈书院当年旧事?”说罢略觉唐突,故吐舌一扮鬼脸.林二抿了口咖啡,不禁苦笑,心里万分焦虑,此时却不好表露.便理了理思绪,叨起荔城文会旧事.      话说这荔城者,古称兴化,素有“文献名邦”雅号.于宋

缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存

返回目录 再写完缓存篇第一回之后,得到了很多朋友的好评和来信,所以,决定加快步伐,尽快把剩下的文章写完,本篇是第三回,主要介绍使用HttpModule实现的文件级缓存,在看本文之前,大家需要限度HttpModule有一个了解,可以先看我的这篇文章<开发人员应该对IIS理论层的知识了解的多一些~第四讲 HttpModule中的几大事件> 对于文件级缓存来说,我们要知道两点,一为文件的URL,二为文件的 下面是HttpModuleCache的核心代码 /// <summary> ///

gdb调试5--工程项目的断点调试

之前说过断点调试,但是针对的是单文件的断点调试.在实际应用中,一个项目是多目录多文件的 目录结构: $ tree .├── gdbSomeFiles.cpp├── Libs│   ├── add.cpp│   ├── add.h│   └── makefile└── makefile add.h 1 #pragma once 2 3 class CAdd 4 { 5 public: 6 CAdd(void); 7 int add(int &a, int &b); 8 virtual ~CA

Python进阶(三十五)-Fiddler命令行和HTTP断点调试

Python进阶(三十五)-Fiddler命令行和HTTP断点调试 一. Fiddler内置命令 ??上一节(使用Fiddler进行抓包分析)中,介绍到,在web session(与我们通常所说的session不是同一个概念,这里的每条HTTP请求都称为一个session).界面中能够看到Fiddler抓取的全部HTTP请求.而为了更加方便的管理全部的session, Fiddler提供了一系列内置的函数用于筛选和操作这些session(习惯命令行操作Linux的童鞋应该能够感受到这会有多么方便

调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令

调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置 windbg命令分为标准命令.元命令.扩展命令 标准命令提供最基本的调试功能,不区分大小写.如:bp g dt dv k等 元命令提供标准命令没有提供的功能,也内建在调试引擎中,以.开头.如.sympath .reload等 扩展命令用于扩展某一方面的调试功能,实现在动态加载的扩展模块中