七、             Purify的退出码

像UNIX下的软件,一般都会提供和别的应用程序的接口,像上面的生成文本文件,也是给别的应用程序提供接口的一种方式。这里,我们所要讲述的是Purify的退出码,我们知道程序都有退出码,以提供给别的程序或操作系统自己运行的信息。被Purify编译过的程序,你可以通过指定-exit-status参数来告诉Purify是否用Purify的退出码,如果这个参数值为yes,那么表示使用Purify的退出码,如果值为no则表示使用程序内的退出码。

如果我们这样设置:-exit-status=yes,那么Purify的退出码是这样定义的:

内存错误种类

退出码(按位或)

内存存取错误

0x40

内存泄露

0x20

潜在内存泄露

0x10

通过上表,我们可以知道,当-exit-status参数被打开后,程序的退出码被Purify完全接管,如果程序中有内存错误,那么退出码所对应的位就会被置为1,这样,我们可以用别的程序来调用Purify所编译出来的程序,并根据其退出码作相应的处理。

八、             Purify和Shell的集成

你可以在UNIX的Shell环境中使用Purify的一些参数和信息,Purify为Shell提供了一些通配符之类的东西,只要你使用 –run-at-exit参数。例如你有一个Shell程序想把Purify生的文件拷贝到别的目录中,或是你想根据Purify的报告中是否有内存错误进行下一步的行动。

下面有两个表格,说明了一些Purify和Shell交互的参数:

有关内存出错的信息:

通配字符串

含义

%z

指明是否有内存错误或内存泄露。其值是“true”或“false”

%x

程序的退出状态(如果是0,表示程序没有调用exit函数)

%e

程序中内存访问错误的个数。

%E

程序中错误总数。

%l

内存泄露的字节数。

%L

潜在内存泄露的字节数。

有关程序运行的信息:

通配字符串

含义

%V

运行程序的全路径(“/”被替换成了“_”)

%v

程序的名称

%p

程序的进行ID

在使用Purify过程中,有两种方法可以传递Purify的参数,一种就是在命令行上指明。另外一种是设置一个和Purify相关的环境变量:PURIFYOPTIONS。现在,我通过这个环境变量要举一个例子,以说明上面表格中的参数在使用中的情况:

例如,如果我们这样这置环境变量:(在C-Shell中)

setenv PURIFYOPTIONS '-run-at-exit="if %z ; then /

echo /"%v: %e errors, %l+%L bytes leaked./" ; fi"'

当我们运行被Purify编译过的程序后,会出现以下结果:

hello: 2 errors, 1+10 bytes leaked.

我们可以看到,由于hello程序出错了,所以%z为“true”,所以Purify执行echo命令,其中,%v表示了程序名(hello),%e表示了错误的个数(2),%l表示了内存泄露的字节数(1),%L表示了程序中有潜在可能的内存泄露字节数(12)。

让我们再来看两个例子:

示例一:

指定Purify的参数为: -log-file=./%v.plog

示例二:

指定Purify的参数为: -view-file=/home/hchen/%V.pv

总这,这些有“%”的变量,都是Purify提供给操作系统Shell的,以供Shell编程使用的。

九、             过滤Purify的报告信息

如果你的程序比较大,模块也比较多,有时候出现的信息非常的多,你程序中很可能有某段代码产生了若干个内存错误,所以,我们可以使用Purify的过滤器来让Purify只显示某一种类的信息,这样方便我们进行问题的查找和排错。

1、  在Purify的X-Window中设置信息过滤,点击图形界面中的菜单“Options” -–> “Suppressions”,将出现“Suppressions”对话框,如下所示:

我们可以看到在上面的对话框中,如果过滤Purify的报告信息。当我们点击“Where to suppress”只要,我们会看到有如下的五个选项:

l         In Call Chain:表示在某个函数调用链中信息。

l         In File:表示只报告在某个文件中的信息。

l         In Library:表示只报告在某个LIB文件中的信息。

l         In Class:这是C++的,表示报告某个类的信息。

l         Everywhere:表示全部范围内的信息。

但是图形界面中,Purify并没有给我们提供一个选取文件或LIB或类的对话框,我们只能通过其文本语法来描述,接下来就让我们来看一看,过滤Purify报告信息的文本语法。

2、  我们可以使用Purify的过滤语法来要求Purify的过滤信息。并把其存于.purify文件中,这样当我们的Purify起动后载入这个文件,就可以达到过滤信息的目的了。通过文本语法来设置过滤信息比图形界有更为强大的地方。下面还是来看看suppress的语法:

语法:

suppress <message-type> <function-call-chain>
unsuppress <message-type> <function-call-chain>

其中,suppress和unsuppress中关键字,分别表示过滤或不过滤。<message-type>指明要操作的消息,可以使用“*”做通配符,<function-call-chain>表示函数的调用链,调用的函数链用分号分隔,其同样可以使用“*”做通配符,还可以使用“…”来表示无论中间是什么。

还是来看几个示例吧:

1)  suppress AB* 
表示过滤ABR和ABW错误。

2)  suppress *W  
表示过滤ABW、FMW、IPW、NPW、SBW、WPW和ZPW错误。

3)  suppress ABR “libc*”
表示在所有以libc打头的LIB文件中过滤ABR信息。

4)  suppress ABR sortFunction; sort*; qsort; “libc*”
其表示,过滤ABR错误。过滤范围是在sortFunction中,并且是在以libc开头的函数库文件中,其调用链是qsort -> sort* -> sortFunction。换言之,只要有“libc*”文件中的函数调用了qsort,并且qsort调用了开头为sort*的函数,并且这些函数调用了sortFunction,那么,在这一个函数链中,不显示ABR错误信息。

5)  suppress UMR tzsetWall;…; main
其表示,在tzsetWall函数中过滤URM信息,只要tzsetWall函数是被main函数间接调用的,无论有多远,都不显示UMR信息。

6)  suppress FNH Test: :Test
这是C++中使用的语法,表示在类Test所有的构造函数中过滤FNH信息。如果要指明特定的函数,请加上其参数类型,如:suppress FNH Test::Test(const char*)。

注意,“…”语法表示调用链无论有多远。当然,如果你设置了参数“-chain-length=6”,那么,“…”只能到6层函数调用,7层的就不管了。

在启动Purify时,我们可以这样来读取.purify文件:

% purify -suppression-file-names=".purify,.purify.sunos4,/

$HOME/purify_suppressions"

Purify会在下面的目录中寻找这个文件:

<purifyhome>/.purify

<purifyhome>/.purify.sunos4

$HOME/.purify

$HOME/.purify.sunos4

<progdir>/.purify

<progdir>/.purify.sunos4

$HOME/purify_suppressions

<-上一页  下一页->

(版权所有,转载时请注明作者和出处)

转载于:https://my.oschina.net/abcijkxyz/blog/722478

C/C++内存问题检查利器—Purify (四)相关推荐

  1. C/C++内存问题检查利器——Purify

    C/C++内存问题检查利器--Purify 一.           引言 我们都知道软件的测试(在以产品为主的软件公司中叫做QA-Quality Assessment)占了整个软件工程的30% -5 ...

  2. 内存问题检查利器——Purify

    内存问题检查利器--Purify https://www.cnblogs.com/Leo_wl/p/7699489.html 一.           引言 我们都知道软件的测试(在以产品为主的软件公 ...

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

    C/C++内存问题检查利器--Purify 陈皓 一.           引言 我们都知道软件的测试(在以产品为主的软件公司中叫做QA-Quality Assessment)占了整个软件工程的30% ...

  4. C/C++内存问题检查利器—Purify

    文章转自:http://blog.csdn.net/haoel/article/details/2900 一.           引言 我们都知道软件的测试(在以产品为主的软件公司中叫做QA-Qua ...

  5. C/C++内存问题检查利器—Purify (二)

    三.           示例 假设我们现在有这样一段程序:hello.c #include <stdio.h> #include <malloc.h>   static ch ...

  6. C/C++内存问题检查利器—Purify (五)

    十.             设置WatchPoint 你可以在你的程序中,对你所想监控的程序设置一些WatchPoint,以方便于你对程序进行调试,或更容易找出问题的原因.就像我前面说,Purify ...

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

    五.             文件描述符问题 在上面的内存问题表中,对于大多数的内存问题来说,相信对于熟悉C/C++的程序员,并不陌生.有一些关于Watchpoint和文件描述符的内容,可能会让你看得 ...

  8. 检查内存泄露的利器--VLD使用指南

    1. VLD简介 Visual Leak Detector是一个免费的,强大的,开源的,可视化C ++内存泄漏检测工具. VLD容易使用.安装后,只需告诉Visual C ++在哪里可以找到包含的头文 ...

  9. 基于逆向工程的内存真值检查来保卫网络物理系统

    基于逆向工程的内存真值检查来保卫网络物理系统 原文 Defending Cyber-physical Systems through Reverse Engineering Based Memory ...

最新文章

  1. 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并
  2. python 公钥解密
  3. 高邮机器人_仲尼:省机器人项目荣获一等奖!高邮小学生是如何做到的?
  4. boost::get_deleter相关的测试程序
  5. oracle rollup 小计,Oracle Group By 用法之 —— Rollup (小计功能)
  6. mysql003操作表DDL
  7. Ubuntu16.04 开启多个终端,一个终端多个小窗口
  8. 服务器系统无法共享打印机驱动程序,windows-server-2003 – windows服务器共享打印机,为什么本地机器需要驱动程序?...
  9. 计算机视觉测试数据集
  10. vue基础知识点思维导图
  11. 【安卓项目】期末大作业——“记账宝”APP开发案例
  12. Android Studio 报错:Incompatible types
  13. Kotlinx.serialization VS Gson
  14. mysql plus多表关联_结合mybatis-plus 实现实体操作多表关联查询
  15. 目前网络环境介绍目前网络环境
  16. 水气表下行通信规约 188 V1.0 版协议
  17. proe服务器高速缓存位置,一招搞定Proe低版本打开高版本的问题 | 我爱分享网
  18. selenium 模拟 填问卷 问卷星
  19. 拆除联想一体机M7131z无线网卡
  20. linux分屏显示两个文件内容,在linux中,如何分屏显示一个文件(如.txt)的内容?指令或快捷键...

热门文章

  1. 计算机语言中call,call
  2. jQuery.show()详解
  3. CHM文件无法打开问题解决办法
  4. 三维实景地图,挺酷的
  5. js根据字符串时分秒获取总秒数和分割时分秒
  6. 51单片机 (十四)DS1302
  7. 利用systemd实现ssl证书的自动续期
  8. 谷歌首款自家品牌手机Pixel“养成记”:专注细节和蓝色
  9. css居中大全(文字居中、块居中、水平居中、垂直居中)
  10. 再见邓肯!再见石佛!