各位看官们。大家好。上一回中我们说的是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. [CSS] CSS Transitions: Delays and Multiple Properties

    <!DOCTYPE html> <html> <head> <script src="https://code.jquery.com/jquery- ...

  2. 一道movfuscator混淆过的简单逆向

        月赛中出了道经过movfuscator混淆的逆向题目,记录一下过程.跑起来发现需要用户输入长度为20的字符串,我尝试着输入了几次都是直接退出了,没有任何提示.用IDA打开,题目里面几乎全是mo ...

  3. Linux UGO和ACL权限管理

    自主访问控制(Discretionary Access Control, DAC)是指对象(比如程序.文件.进程)的拥有者可以任意修改或者授予此对象相应的权限.Linux的UGO(User, Grou ...

  4. PIL库 (Pillow)

    PIL基础 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important ...

  5. Jquery根据字段内容设置字段宽度

    来博客园很久了,初次写文章,新手,请大牛见谅! 前段时间遇到的问题,通过gridview后台动态生成table,列和行数量未知,要求根据每个单元格内容的多少,设置宽度,每一列选择本列最大的宽度. ta ...

  6. 看到的一些js小知识

    向数组结尾添加元素高效方法: var arr = [1,2,3]; arr[arr.length] = 4 头部: var a = [1,2,3]; a.concat(4,5); // 1,2,3,4 ...

  7. CppCon - Modern Template Metaprogramming 杂记

    2014年底才看到github和channel9上有CppCon2014的视频和资料,顿时激动不已.最近小生也一直在研习CppCon2014中令人兴奋的内容.这篇鄙文就是小生学习了<Modern ...

  8. (原创) mac 10.9.2 eclipse 的 CDT 的 异常的修复

    测试平台:macbook air 2012 , os x 10.9.2 , eclipse 4.3   在升级了 10.9 之后,eclipse 的CDT 无法正常使用了   异常表现:   1. 文 ...

  9. python笔记之ZipFile模块

    python笔记之ZipFile模块 zipfile模块用来做zip格式编码的压缩和解压缩的,zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝大多数的情况下, ...

  10. HDU 4939 Stupid Tower Defense

    dp:枚举red,dp前i 个塔中有j 个蓝塔的最大伤害. 机智的地方:dp前i 个塔的时候可以同时处理n-i 个红塔,这样就少了个循环...(枚举红塔的循环) #include <iostre ...