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

来源:互联网 发布:ios程序员工资待遇 编辑:程序博客网 时间:2024/04/27 01:53

本文来自CSDN博客,转载:http://blog.csdn.net/haoel/archive/2003/12/15/2902.aspx

 

五、             文件描述符问题
在上面的内存问题表中,对于大多数的内存问题来说,相信对于熟悉C/C++的程序员,并不陌生。有一些关于Watchpoint和文件描述符的内容,可能会让你看得比较模糊,对于Watchpoint,我会在后面讲述。这一节,我就一个示例说一说文件描述述问题是如何产生的,并由此介绍一下Purify的一些特性。

 
先查看下面这段程序:

 
 

 
在当前目录下建一个test.txt的文件,并设置其内容为-20。使用Purify编译并运行程序:

>  purify gcc -g -o testfd testfd.c

Purify 2003.06.00 Solaris 2 (32-bit) Copyright (C) 1992-2002 Rational Software Corp.  All rights reserved. 

Instrumenting: ccqqF6pY.o  Linking

 
>./testfd

 
出现以下画面:

 

 
由图中,我们可以看到,Purify报告有FIU错误,意思是,我们在程序退出时,没有关闭文件描述符。还有一些算是安全的文件描述符信息,那就是关于0,1,2这三个标准文件描述符的FIU,这些信息是正常的,所以在其前面也就没有小三角符号了。

 
通过这个例子,我们可以看到,Purify不但可以找到内存的操作错误,还可以找到文件描述符的错误。

 
如果你不想让Purify显示FIU信息,你可以设置Purify的 -fds-inuse-at-exit=no 选项,如:
 
>  purify –fds-inuse-at-exit gcc -g -o testfd testfd.c

 
或者使用Purify的API函数 purify_clear_fds_inuse 来阻止显示,你可以在你的程序中调用Purify的API函数。有关Purify的API函数的细节,我会在后面给你讲述。
 
 
六、             控制Purify的输出
1、产生ASCII文本文件
 
在默认情况下,Purify会显示出一个图形窗口来报告信息。当然,如果你的环境所限,你不想Purify出现图形界面,只是生成文本文件来报告,能过设置Purify的参数,你可以很容易做到这一点。

 
在程序编译时,你只需简单的调置Purify的编译参数 –windows=no 即可做到,如:

 
> purify –windows=no gcc –g –o hello hello.c

 
Purify会把其报告信息写到标准错误设备上,在文本方式下,Purify就不报告同种错误出现在个数,而只是报告的信息了。

 
我们可以使用两种方式让Purify的信息输出到文本文件中。

 
第一种是使用操作系统的重定向功能,如:

在csh下: % a.out.pure >& a.out.messages
在sh和ksh下: $ a.out.pure 2> a.out.messages
 
第二种是指定Purify的日志文件参数,如:

-log-file=<filename>.plog
 
下面,是一个Purify生成的ASCII文本文件的样子:

 
  
 
2、产生Purify自己的文件
 
通过查看ASCII文本文件,我们发现其很不容易查看,特别是当错误很多时,而用在文件中没有源代码,看起来就是不如图形界面的好。但是我们为了把Purify的报告信息通过电子邮件传送给别人查看时,文件和图形界面兼得,我们可以使用Purify自己的文件,叫Purify View文件。我们可以使用Purify的图形界面打开这个文件,而来在图形化的窗口下查看。
 
我们可以有两种方式得到这个文件。一种是在Purify的图形界面的菜单中点击“File -> Save as”来生成。第二种方法是使用Purify的 -view-file=<filename>.pv 参数来设置Purify View文件。

 
而要打开这个文件时,要么简单地在Purify的菜单中选取“Open”菜单,要么使用这样的命令:

       % purify –view <filename>.pv

 
3、自动发送邮件
 
使用Purify的-mail-to-user参数可以方便地让Purify自动发送报告邮件。如:

 
% purify -mail-to-user=chris  gcc ...
% purify -mail-to-user=chris,pat  gcc ...
% purify -mail-to-user=devgrp  gcc ...
 
在默认情况下,只要你设置了这个参数,Purify是不会打开图形界面窗口的,如果你要Purify打开图形窗口,那么你就一同使用 –windows=yes 参数。

 
4、输出自己的信息
 
如果你想在Purify中输出自己的信息,你可以在你的程序中使用Purify的API函数:

l         purify_printf(const char *fmt, ...)  使用这个函数可以在Purify的图形界面,文件文件中输出你的自己的信息。
l         purify_logfile_printf(const char *fmt, ...)  使用这个函数可以在Purify的ASCII文本文件中输出你自己的信息。
l         purify_printf_with_call_chain(const char *fmt, ...) 使用这个函数可以在Purify的输出的同时,打印出函数调用栈的信息。这个函数和purify_printf很类似。
注意,以上三个函数和标准C中的printf函数几乎是一样的,不过,这几个函数并不支持像printf函数中的所有%的格式,它仅支持:%d, %u, %n,%s, %c, %e, %f, 和 %g 这几种格式,并且就 %e %f %g 而且,并不支持其精度定义。

 

原创粉丝点击