Chinaunix首页 | 论坛 | 博客
  • 博客访问: 184887
  • 博文数量: 20
  • 博客积分: 3020
  • 博客等级: 中校
  • 技术积分: 940
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-18 11:01
文章分类

全部博文(20)

文章存档

2011年(2)

2010年(8)

2009年(9)

2008年(1)

我的朋友
最近访客

分类: C/C++

2009-11-11 23:00:38

十、             设置WatchPoint
你可以在你的程序中,对你所想监控的程序设置一些WatchPoint,以方便于你对程序进行调试,或更容易找出问题的原因。就像我前面说,Purify可以找到你的内存泄露,但其不能找到内存泄露的原因,你可以通过设置WatchPoint来跟踪一块内存,以找到在程序执行过程中该内存的访问情况。
 
Purify的WatchPoint可以产生下例消息:
 
l         WPR(被WatchPoint的内存读)
l         WPW(被WatchPoint的内存写)
l         WPM(被WatchPoint的内存分配)
l         WPF(被WatchPoint的内存释放)
l         WPN(来到被WatchPoint的内存的Scope)
l         WPX(离开被WatchPoint的内存的Scope)
 
一旦你设置好了一个WatchPoint,Purify会自动报告上述这些信息,以告诉你内存的存取情况。很方便你调试程序。
 
WatchPoint一般是在调试程序时跟踪一块内存时候使用的,你也可以用其跟踪一些系统级的全局变量,如:errno。一旦errno被写了,马上会报告一个WPW消息,展开后,你能看到函数的堆栈情况,以及是在哪个系统调用后出现了错误。这个使用很方便我们找到一些非内存方面的问题。
 
大家可能会有一种感觉,那就是在一般的调试器中,如GDB中也有WatchPoint的设置(对GDB的使用请参考我的文章《用GDB调试程序》),那么,在调试器中的WatchPoint和Purify的有什么不同?下面是一些GDB中的WatchPoint不足的地方:
 
1)  GDB中的WatchPoint用于单步跟踪中。
2)  GDB中的WatchPoint只能在其内存的Scope中,离开了Scope,WatchPoint会被删除。
3)  在GDB中设置一个4字节的内存WatchPoint,会让程序的运行效率下降1000个数量级。
 
Purify中的WatchPoint有效地克服了这些问题,它在全局范围内监控所有内存的使用,并且,其速度上大大地快于GDB等一系列的调试器。
 
有两种方式可以让我们设置Purify的WatchPoint,一种是在程序中使用WatchPoint的API函数,一种是直接在调试器中使用(如:GDB),下面我介绍一下这两种用法:
 
1、 在程序中使用。
写下这段程序:
 
#include
 
main()
{
    int i;
    printf("Note: errno=0x%x\n", errno);
    purify_watch(&errno);
 
    errno = 0;
 
    close(1000);
 
    exit(0);
}
 
 
   用Purify编译: >sudo purify gcc -g -o watch watch.c
运行后,我们可以看到以下画面:
 
我们可以看到,Purify成功地监控了errno变量。我们还可以看到被监控的变量改变前和改变后的值。
 
 
2、 在GDB中使用。
 
在GDB中,我们可以简单地使用GDB的print命令来达到设置Purify的WatchPoint目的。这正是Purify的强大之处,其对这种技术称为JIT(Just-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")
 
下面来让我们看一看Purify的WatchPoint的API函数,其分成三类:
 
•          设置类
int purify_watch(char *addr) 
对所指定的内存进行监视,char* 表示以单字节为单位。
int purify_watch_ (char *addr)    =1,2,4,8
其中的是一个数字,可以是1,2,4,8表示,监控单字节,双字节,四字节,八字节。函数名为: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类的调试器中使用)。有点像GDB的info 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“
在sh或ksh下:
$ PURIFYOPTIONS="-log-file=new $PURIFYOPTIONS"; export\
   PURIFYOPTIONS
 
3、  在Link程序的命令行中。如:
$ purify -cache-dir=$HOME/pcache -always-use-cache-dir $CC ...
 
 
十二、             使用Purify的API函数
Purify的函数有许多,我也不在这里一一讲解了,其具体细节还请参考使用手册。我这里只讲一下Purify的API函数的使用方法。总的说来,有以下两种方式我们可以使用Purify的API函数。
 
1.         在我们的调试器中调用,如:
gdb) print purify_describe(addr)
(dbx) call purify_what_colors(buf, sizeof(buf))
(xdb) p purify_describe(addr)
注:对于purify_stop_here这个函数,我们可以这样使用。
(gdb) break purify_stop_here
(dbx) stop in purify_stop_here
(xdb) b purify_stop_here
 
2.         在自己的程序中调用。要在程序中调用Purify的API函数,我们需要下面两步:
1)加上头文件:#include
2)把LIB文件放到可被搜索到的路径中。主要是一个动态链接库文件libpurify_stubs.so和一个静态链接库文件libpurify_stubs.a
 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/haoel/archive/2003/12/16/2904.aspx
阅读(514) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~