C/C++内存问题检查利器——Purify(3)

 

十、             设置WatchPoint

你可以在你的程序中,对你所想监控的程序设置一些WatchPoint,以方便于你对程序进行调试,或更容易找出问题的原因。就像我前面说,Purify可以找到你的内存泄露,但其不能找到内存泄露的原因,你可以通过设置WatchPoint来跟踪一块内存,以找到在程序执行过程中该内存的访问情况。 数据挖掘研究院

  数据挖掘论坛

PurifyWatchPoint可以产生下例消息:

 

数据挖掘实验室

l         WPR(被WatchPoint的内存读)

数据挖掘论坛

l         WPW(被WatchPoint的内存写)

数据挖掘实验室

l         WPM(被WatchPoint的内存分配)

数据挖掘研究院

l         WPF(被WatchPoint的内存释放) 数据挖掘工具

l         WPN(来到被WatchPoint的内存的Scope 数据挖掘交友

l         WPX(离开被WatchPoint的内存的Scope

数据挖掘交友

  数据挖掘实验室

一旦你设置好了一个WatchPointPurify会自动报告上述这些信息,以告诉你内存的存取情况。很方便你调试程序。 数据挖掘交友

  数据挖掘工具

WatchPoint一般是在调试程序时跟踪一块内存时候使用的,你也可以用其跟踪一些系统级的全局变量,如:errno。一旦errno被写了,马上会报告一个WPW消息,展开后,你能看到函数的堆栈情况,以及是在哪个系统调用后出现了错误。这个使用很方便我们找到一些非内存方面的问题。 数据挖掘交友

 

数据挖掘工具

大家可能会有一种感觉,那就是在一般的调试器中,如GDB中也有WatchPoint的设置(对GDB的使用请参考我的文章《GDB调试程序》),那么,在调试器中的WatchPointPurify的有什么不同?下面是一些GDB中的WatchPoint不足的地方:

  数据挖掘实验室

1)  GDB中的WatchPoint用于单步跟踪中。

2)  GDB中的WatchPoint只能在其内存的Scope中,离开了ScopeWatchPoint会被删除。 数据挖掘实验室

3)  GDB中设置一个4字节的内存WatchPoint,会让程序的运行效率下降1000个数量级。

数据挖掘论坛

 

数据挖掘交友

Purify中的WatchPoint有效地克服了这些问题,它在全局范围内监控所有内存的使用,并且,其速度上大大地快于GDB等一系列的调试器。

数据挖掘交友

  数据挖掘工具

有两种方式可以让我们设置PurifyWatchPoint,一种是在程序中使用WatchPointAPI函数,一种是直接在调试器中使用(如:GDB),下面我介绍一下这两种用法:

 

1、 在程序中使用。
写下这段程序:

#include <errno.h> 数据挖掘交友

 

数据挖掘研究院

main()

数据挖掘论坛

{ 数据挖掘实验室

    int i; 数据挖掘研究院

    printf("Note: errno=0x%x ", errno);

    purify_watch(&errno); 数据挖掘交友

 

数据挖掘工具

    errno = 0;

数据挖掘论坛

  数据挖掘交友

    close(1000);

  数据挖掘论坛

    exit(0); 数据挖掘研究院

} 数据挖掘研究院

 

数据挖掘工具

   Purify编译: >sudo purify gcc -g -o watch watch.c
运行后,我们可以看到以下画面:


数据挖掘论坛

我们可以看到,Purify成功地监控了errno变量。我们还可以看到被监控的变量改变前和改变后的值。 数据挖掘论坛

 

数据挖掘研究院

 

数据挖掘实验室

2、 GDB中使用。

数据挖掘研究院

  数据挖掘论坛

GDB中,我们可以简单地使用GDBprint命令来达到设置PurifyWatchPoint目的。这正是Purify的强大之处,其对这种技术称为JITJust-In-Time)。 数据挖掘实验室

  数据挖掘实验室

示例: 数据挖掘交友

gdb) print purify_watch(&my_str)

数据挖掘工具

(gdb) print purify_watch_1(&my_char) 数据挖掘实验室

(gdb) print purify_watch_n(buf, sizeof(buf), "rw") 数据挖掘研究院

(dbx) print purify_watch_n(write_only_buf,100,"w")

数据挖掘论坛

  数据挖掘交友

下面来让我们看一看PurifyWatchPointAPI函数,其分成三类:

数据挖掘工具

 

          设置类
int purify_watch(char *addr)  
对所指定的内存进行监视,char* 表示以单字节为单位。

数据挖掘研究院



int purify_watch_<num> (char *addr)    <num>=1,2,4,8
其中的<num>是一个数字,可以是1248表示,监控单字节,双字节,四字节,八字节。函数名为:purify_watch_1()purify_watch_2()purify_watch_4()purify_watch_8

数据挖掘论坛



int purify_watch_n(char *addr, unsigned int size, char *type)
                                     (type = “r”, “w” or “rw”)
监控特定长度的内存,type取值为“r”,“w”“rw”,意为监控内存的读还是写。

数据挖掘论坛



          查询类
int purify_watch_info().
打印目前设置的WatchPoint的情况(一般在GDB类的调试器中使用)。有点像GDBinfo watch命令。 数据挖掘实验室

数据挖掘论坛

 

数据挖掘工具

          删除类
Int purify_watch_remove(int watchno)
删除指定的WatchPoint,其watchno为设置WatchPoint的函数的返回值。

数据挖掘论坛



int purify_watch_remove_all()
删除所有的WatchPoint

数据挖掘交友

  数据挖掘交友

 

十一、             使用Purify的参数

Purify的参数很多,具体的参数我就不多说了,还请你参考其使用手册。在这里,我简单地讲一讲其参数的使用规则和方式。

  数据挖掘实验室

Purify的参数使用的规则如下:

1、  必须以连字符开始,也就是减号。

2、  在等号(=)的两端不能有空格。 数据挖掘实验室

3、  忽略参数名和变量的大小写。 数据挖掘研究院

4、  其参数中的连接符可以是减号,下划线,或是干脆就没有。如:
-leaks-at-exit
-LEAKS_AT_EXIT –LeaksAtExit是一回事。

5、  在参数中,如果你要指多个路径,可以用冒号或空格分开。使用空格时请使用引号。如:
% purify -user-path=’/usr/home/program /usr/home/program1’
% purify -user-path=/usr/home/program:/usr/home/program1
数据挖掘研究院

6、  指写多个邮件用户时,用逗号分隔。千万不要回空格。如:
% purify -mail-to-user=chris,pat,kam
数据挖掘研究院

7、  可以使用通配符或转义字串。如:
program* 
    -log-file=./%v.plog

  数据挖掘交友

Purify参数的类型有三种——布尔、字符串和整数,如:

数据挖掘实验室

-leaks-at-exit=yes 布尔型 数据挖掘论坛

-log-file=./pureout 字符串型 数据挖掘实验室

-chain-length=10 整数型

  数据挖掘实验室

  数据挖掘实验室

设置参数的方法有三种:

1、  在图形窗口中,通过点击“Options -> Runtime”菜单,在对话框中设置。

数据挖掘交友

2、  通过两个环境变量设置——PURIFYOPTIONS PUREOPTIONS,如:


csh下:
% setenv PURIFYOPTIONS "-log-file=new $PURIFYOPTIONS“

shksh下:
数据挖掘实验室
$ PURIFYOPTIONS="-log-file=new $PURIFYOPTIONS"; export
   PURIFYOPTIONS

数据挖掘论坛

3、  Link程序的命令行中。如:
$ purify -cache-dir=$HOME/pcache -always-use-cache-dir $CC ...

数据挖掘实验室

  数据挖掘研究院

  数据挖掘论坛

十二、             使用PurifyAPI函数

Purify

[数据挖掘专家] [数据挖掘研究院] [数据挖掘论坛] [数据挖掘实验室]
上一篇:C/C++内存问题检查利器——Purify(2)
下一篇:细说框架风云 JSF能否拯救WEB江湖(1)
最新评论共有 0 位网友发表了评论 , 查看所有评论
发表评论( 不能超过250字,需审核,请自觉遵守互联网相关政策法规。 )
匿名?
数据挖掘网站导航 数据挖掘论坛导航
  • 数据挖掘工具
  • 数据挖掘论坛
  • DataCruncher - Cognos
  • MineSet - MathSoft
  • Intelligent Miner - GainSmarts
  • Sqlserver - SAS - Clementine
  • CART - Weka - WizSoft
  • NeuroShell - ModelQuest
  • data mining tools - Darwin
  • 数据挖掘交友
  • 数据挖掘博客
  • 数据挖掘工具
  • 数据挖掘资源
  • 数据挖掘技术算法
  • 数据挖掘相关期刊、会议
  • 研究院联盟合作专区
  • 数据挖掘基础与相关技术
  • 数据挖掘厂商与就业
  • 数据挖掘研究者乐园
  • 知名厂商数据挖掘工具资料
  • 国内数据挖掘实验室
  • Foreign Data Mining Lab
  • 热点关注
  • C/C++内存问题检查利器——Purify(1)
  • Hibernate用法:查询,更新,删除!(1)
  • 细说框架风云 JSF能否拯救WEB江湖(2)
  • C/C++内存问题检查利器——Purify(3)
  • 细说框架风云 JSF能否拯救WEB江湖(1)
  • STL实践指南
  • 细说框架风云 JSF能否拯救WEB江湖(3)
  • C/C++内存问题检查利器——Purify(2)
  • XML和Java 是敌还是友?
  • Ado 实现C++对象的存取
  • 论坛最新话题
  • Foundations of Statistical Natural Langu
  • Game Theory meet Data Mining: A Recent P
  • System Building: How does it help or hin
  • 数据挖掘与Clementine培训
  • 新手报到
  • 求 SASEM 客户流失预测分析
  • 数据挖掘工程师/搜索研究院—北京——无线
  • 数据挖掘入门介绍(如何着手数据挖掘)
  • Information Overload Survey Results
  • The INEX 2005 Workshop on Element Retrie
  • 相关资讯
  • C/C++内存问题检查利器——Purify(3)
  • C/C++内存问题检查利器——Purify(2)
  • C/C++内存问题检查利器——Purify(1)
  • Log4Net使用指南
  • STL实践指南
  • STL之父访谈录
  • 与大虾对话: 领悟设计模式
  • C++之父B.Stroustrup近期言论
  • Ado 实现C++对象的存取
  • 非议MFC(二)逻辑上的不完备
  • 数据挖掘实验室资料
  • 数据挖掘博客地址
  • 数据挖掘实验室网站地址
  • Prepare for Medicare audits by using dat
  • 注册成为SAS用户与爱好者俱乐部会员
  • 水南梅
  • 明日烟
  • 新人报道
  • 下载
  • 厦门服务器托管,450元/月—0592-5177319 高
  • 买空间送域名--0592-5177319 高静