各位看官们。大家好。上一回中我们说的是GDB改动程序执行环境的功能。而且说了怎样使用GDB改动变量

的值。这一回中。我们继续介绍GDB的调试功能:监视功能。当然了,我们也会介绍怎样使用GDB的监视功

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

我们说的监视类似像电影中描写叙述的哪种监视。仅仅只是电影中的被监视对象一般是一些犯罪嫌疑人,而我们

的监视对象是执行着的程序,更详细点说。是程序中的存储单元地址。GDB提供了监视功能,首先设置一个

监视点,GDB会自己主动监视该监视点上的变化了,假设监视点发生了变化,GDB就会在监视点哪里停下来,这

时候,我们就能看到是谁让监视点发生了变化。我来总结一下详细的步骤:

1.设置一个监视点。样例:watch giVal 该样例表示在giVal所在的存储单元哪里设置一个监视点。

2.先使用start命令開始调试。当有程序改动监视点的存储单元时它就会停下来。

3.使用c命令会再次执行程序,直到有程序操作观察点监视的存储单元时再次停下来。

光说不练,不是我们的风格,接下来,我们用详细的样例来说明怎样使用监视功能。

#include<stdio.h>

int g;

void fun()
{
g = 3;
} int main()
{
int a,b;
a = 3;
b = 5;
g = a+b; printf("a+b = %d \n",g);
fun();
printf("a+b = %d \n",g); return 0;
}

1.编敲代码。打开VIM,输入上面的程序,而且保存到m.c文件里

2.编译程序。

在终端中输入:gcc -g m.c -o s

3.执行程序。在终端中输入:./s ,得到下面执行结果:

./s

a+b = 8

a+b = 3

大家能够看到程序中a=3,b=5,a+b=8这是小学生也会的数字呀。但是程序第一次输出运算结果时还正确,

第二次输出运算结果时就不对了,这是怎么回事?看官莫急,我们使用GDB的监视功能来调试一下。非常

快就能知道。

谁改动了这个全局变量。

在终端中输入:gdb s   //使用GDB调试程序

(gdb) watch g            
//设置一个监视点。监视全局变量g

Hardware watchpoint 1: g

(gdb) start               //開始调试

Temporary breakpoint 2 at 0x8048435: file m.c, line 13.

Starting program: xxx/s

Temporary breakpoint 2, main () at m.c:13

13        a = 3;

(gdb) c                 
//继续调试程序,直到监视点g发生变化

Continuing.

Hardware watchpoint 1: g

Old value = 0            //这里显示监视点发生了变化,而且列出了变化前后的值

New value = 8            //这时的运算结果是正确的

main () at m.c:17

17        printf("a+b = %d \n",g);

(gdb) c                
//运算结果正确。继续调试程序,直到监视点g发生变化

Continuing.

a+b = 8

Hardware watchpoint 1: g

Old value = 8          //这里显示监视点发生了变化,而且列出了变化前后的值

New value = 3          //g的值从8变成了3

fun () at m.c:8       
//提示程序中第8行

8    }

(gdb) list 8          //观看程序中第8行的内容

3    int g;

4

5    void fun()

6    {

7        g = 3;        
//大家看到了吧,原来是fun函数改动了g的值。

8    }

9

10    int main()

11    {

12        int a,b;

(gdb) stop          //结束调试

我们通过这个样例说明了怎样在调试过程中使用监视功能来调试程序,而且找出了错误发生的原因。只是

该样例比較简单,我们细致观察一下程序就能发现是fun函数改动了运算结果。

在实际的程序中,就不会

像样例中这么简单了。希望看官们可以举一反三。灵活使用监视功能调试程序。

监视功能也是GDB中一个十分强大的功能,在调试全局变量被改动,或者数组越界错误很实用。

会C语言

的看官们都知道,全局变量是C程序中一个十分让人头疼的东西,在有些程序中甚至不同意使用全局变量。

使用GDB的监视功能能够监视全局变量的一举一动,仅仅要全局变量发生了变化,它就会停止下来。因此可

以把监视功能看作是全局变量的克星。

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

一起talk GDB吧(第七回:GDB监视功能)的更多相关文章

  1. 用GDB调试程序(七)

    改变程序的执行——————— 一旦使用GDB挂上被调试程序,当程序运行起来后,你可以根据自己的调试思路来动态地在GDB中更改当前被调试程序的运行线路或是其变量的值,这个强大的功能能够让你更好的调试你的 ...

  2. GDB学习之道:GDB调试精粹及使用实例

    一:列文件清单  1. List  (gdb) list line1,line2 二:执行程序  要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出 ...

  3. [skill][debug][gdb] 使用core dump 进行GDB

    core dump 扫盲:https://wiki.archlinux.org/index.php/Core_dump 1.  人为制作 core dump 1.1  实时在线生成core dump. ...

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

    交叉编译gdb和gdbserver 1.下载gdb:下载地址为:http://ftp.gnu.org/gnu/gdb/按照一般的想法,最新版本越好,因此下载7.2这个版本.当然,凡事无绝对.我们以gd ...

  5. GDB调试系列之了解GDB

    想要熟练利用GDB进行程序调试,首先要了解什么是GDB. 1. 什么是GDB GDB (the GNU Project Debugger) 是一个可以运行在大多数常见的UNIX架构.Windows.M ...

  6. Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身

    Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身 Bing Maps Silverlight Control所提供的功能导航是非常强大的,在设计上对扩展的支持非常好,提供了许多用 ...

  7. 第七课 GDB调试 (下)

    1序言: 通过前面一节第六课 GDB调试 (下)文章,可以掌握理解了gdb调试:怎么启动.运行,打断点.查看变量.甚至改变变量等的知识,今天来大概讲解下调试bug的类型. 2知识点: 2.1 就像之前 ...

  8. gdb常用命令及使用gdb调试多进程多线程程序

    一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...

  9. 缓存篇~第七回 Redis实现基于方法签名的数据集缓存(可控更新,分布式数据缓存)

    返回目录 本篇文章可以说是第六回 Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存(可控更新,WEB端数据缓存)的续篇,事实上,有 ...

随机推荐

  1. Nexus 刷机

    @echo offfastboot flash bootloader bootloader-hammerhead-hhz12k.imgfastboot flash radio radio-hammer ...

  2. 飘逸的python - 解决一个有限制的组合需求

    假设有一个团队技能的需求. 这类技能是要集齐所有指定的人就能激活. 但是因为同一个人又2种身份存在,比如杨戬/神杨戬,于是便产生了组合. 这种组合跟普通组合不一样,普通组合可以随意组合.而这种组合是每 ...

  3. IOS基于新浪微博开放平台微博APP

    1.基于新浪微博开放平台APP源码 2.gitHub源代码下载地址 https://github.com/whzhaochao/SinaWeiBoOpen 3.用到的第三放开源库 3.1  RTLab ...

  4. 微信jssdk获取当前位置,以及打开微信地图

    $(function() { var url = window.location.href; var userId = $("#userId").val(); // var ope ...

  5. Java内存区域和GC机制篇

    Java内存区域和GC机制一.目录 1.Java垃圾回收概括 2.Java内存区域 3.Java对象的访问方式 4.Java内存访问机制 5.Java GC 机制 6.Java垃圾收集器 二.Java ...

  6. 移动开发(webapp)过程中的小细节总结

    1.阻止旋转屏幕时自动调整字体大小 html, body, form, fieldset, p, div, h1, h2, h3, h4, h5, h6 { -webkit-text-size-adj ...

  7. Windows - 远程桌面无证书

    可以从命令行启动远程桌面,输入:mstsc /v:地址:端口 /admin

  8. Ext树控件第一次勾选父节点子节点没选中

    项目中同事提出了这样一个bug 问题: 第一次勾选父节点子节点竟然没选中,逆天了啊 初步分析: 可能是之前代码的逻辑错误造成的,随进入调试阶段... 调试中发现该参数为空(原来写代码的也太没素质了), ...

  9. React-Native OpenGL体验一

    昨天初体验了一把SVG一个并不是多么复杂的动画,我在iOS模拟器上体验的是流畅的,但是在Android真机上体验,还是比较卡的. 下面来介绍一个OpenGL的第三方库: 下面是我运行的里面Demo的效 ...

  10. ubuntu 16.04 下载源

    修改适当的更新源 可以使得aptget安装的速度变得快很多 ubuntu的更新源在 /etc/apt/sources.list 修改更新源 sudo vi /etc/apt/sources.list ...