一起talk GDB吧(七回:GDB监视功能)

各位看官们,大家好,上一回中我们说的是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的内容,今天咱们就说到这里。欲知后事如何,且听下回分解!

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

时间: 2024-10-30 04:10:40

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

第七课 GDB调试 (下)

1序言: 通过前面一节第六课 GDB调试 (下)文章,可以掌握理解了gdb调试:怎么启动.运行,打断点.查看变量.甚至改变变量等的知识,今天来大概讲解下调试bug的类型. 2知识点: 2.1 就像之前所说的没有任何一个程序员敢打包票自己写的代码是没任何bug,bug总会有意无意的出现在我们眼前,当程序运行结果于我们预期结果不一样的时候这时候我们就应该调试,总的来说bug分为:语法错误.逻辑错误.硬件异常: 3原理: 3.1 语法错误:一般情况下出现在编译的时候会有提示编译错误这时候我们就可以马上

JVM【第七回】:【OutOfMemoryError异常之运行时常量池溢出】

如果要向运行时常量池中添加内容,最简单的做法就是使用String.intern()这个Native方法.该方法的作用是:如果池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象:否则将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用.由于常量池分配在方法区内,我们可以通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小,从而间接限制其中产量池的容量:代码如下: package oom; import ja

第七回(二):遇莽夫之见悟文章 听《夕阳之歌》伤名伶

(二)第七回:  遇莽夫之见悟文章    听<夕阳之歌>伤名伶       谁想林二静中生烦恼,忽一日不自在起来.想来这几日未见莉莉,便觉这也不好,那也不好.众人招呼去蹴鞠场,也不理睬.教室出来进去只是闷闷的.这小谢看在眼里,不觉好笑,只是装作不知罢了,静待林二开口. 话说这文会书院分初,高二院,林二当日所见那翘鼻女子,便是初三学生.林二适时虽入高院,不过年长一岁罢了.那日相见,那姑娘便如书上所言:“清扬婉兮”,令林二失魂落魄.当时小谢见林二神色不对劲,不免问起,林二倒也直言,小谢便知一二,心

第七回:遇莽夫之见悟文章 听《夕阳之歌》伤名伶(一)[林大帅作品连载]

第七回:  遇莽夫之见悟文章    听<夕阳之歌>伤名伶  (一)诗曰:   苦心七载枉劳神,旧曲夕阳照愁人.可怜壮志多辜负,当日含情误此身.        却说林二,阿四一行正琢磨如何FQ时,听到建民哨探,书院里刘学监正在巡视花园.众人不禁暗暗叫苦,这刘学监可是书院里一等厉害人物.因其出身行伍,性冷苛刻,多少混混提起便头皮发冷,逞论林二等安分学生?林二探头一瞧,这刘学监正背手,挺着肚子,离这花园墙角不过二十丈之地,生死不过须臾间.见众人脸有惶恐色,只得硬下心来,向阿四说道:“今儿这事如何了局

zabbix-基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案

http://www.zabbix.com/ abbix(音同 z?bix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题. zabbix由2部分构成,zabbix server与可选组件zabbix agent. zabbix server可以通过SNMP,zabbix agent,ping,端口监视等方法提供对远程服务器/网络状态的监视,

GDB调试 (七)

改变程序的执行——————— 一旦使用GDB挂上被调试程序,当程序运行起来后,你可以根据自己的调试思路来动态地在GDB中更改当前被调试程序的运行线路或是其变量的值,这个强大的功能能够让你更好的调试你的程序,比如,你可以在程序的一次运行中走遍程序的所有分支.        一.修改变量值 修改被调试程序运行时的变量值,在GDB中很容易实现,使用GDB的print命令即可完成.如:            (gdb) print x=4        x=4这个表达式是C/C++的语法,意为把变量x的

gdb系列之四 在GDB里运行程序

在你开始在GDB里运行程序前,你需要在编译的时候产生调试信息. 你可以在你选定的环境里带参数(如果有的话)的启动GDB.如果你是在本地调试,你可以重定向输入输出,调试一个已运行 的进程,或者结束一个进程. 4.1 为调试而编译 为了有效的调试程序,你需要在编译的时候产生调试信息.调试信息存储在目标文件里:调试信息描述了数据和函数的类型, 源代码和可执行代码的对应关系. 编译时指定编译器的'-g'选项可以产生调试信息. 在编译给你的客户发布的程序时,可以用'-O'选项指定编译器进行优化.然而,许多

gdb系列之一 一个GDB会话样例

 翻译:shyboysby.spaces.live.com 本翻译遵从GPL.参见: gdb is free software, protected by the gnu General Public License (GPL). The GPL gives you the freedom to copy or adapt a licensed program-but every person getting a copy also gets with it the freedom to m

一起talk C栗子吧(第七回:C语言实例--进制转换)

各位看官们.大家好,从今天開始.我们讲大型章回体科技小说 :C栗子,也就是C语言实例. 闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们.上一回中咱们说的是生成随机数的样例.这一回咱们说的样例是:进制转换.说到进制预计大家 都不陌生.计算机中的进制有二进制.八进制,十进制,十六进制. 今天咱们将要说的是十进制怎样转换成二进制.八进制和十六进制.在这里我把敲代码的步骤和算法思路 写出来供大家參考. 1.获取用户想要转换的数值和想到转换的进制.这里要检查输入是否正确.这是程序健壮性的体现