C/C++内存问题检查利器—Purify (四)
2008-04-02 11:55
387 查看
七、 Purify的退出码
像UNIX下的软件,一般都会提供和别的应用程序的接口,像上面的生成文本文件,也是给别的应用程序提供接口的一种方式。这里,我们所要讲述的是Purify的退出码,我们知道程序都有退出码,以提供给别的程序或操作系统自己运行的信息。被Purify编译过的程序,你可以通过指定-exit-status参数来告诉Purify是否用Purify的退出码,如果这个参数值为yes,那么表示使用Purify的退出码,如果值为no则表示使用程序内的退出码。 如果我们这样设置:-exit-status=yes,那么Purify的退出码是这样定义的:内存错误种类 | 退出码(按位或) |
内存存取错误 | 0x40 |
内存泄露 | 0x20 |
潜在内存泄露 | 0x10 |
八、 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只显示某一种类的信息,这样方便我们进行问题的查找和排错。 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
unsuppress 其中,suppress和unsuppress中关键字,分别表示过滤或不过滤。指明要操作的消息,可以使用“*”做通配符,表示函数的调用链,调用的函数链用分号分隔,其同样可以使用“*”做通配符,还可以使用“…”来表示无论中间是什么。 还是来看几个示例吧: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会在下面的目录中寻找这个文件:/.purify/.purify.sunos4$HOME/.purify$HOME/.purify.sunos4/.purify/.purify.sunos4$HOME/purify_suppressions
<-上一页 下一页-> (版权所有,转载时请注明作者和出处)
相关文章推荐
- C/C++内存问题检查利器—Purify (三)
- C/C++内存问题检查利器—Purify (三)
- C/C++内存问题检查利器—Purify (五)
- C/C++内存问题检查利器—Purify (一)
- C/C++内存问题检查利器—Purify (四)
- C/C++内存问题检查利器—Purify (一)
- C/C++内存问题检查利器—Purify (四)
- C/C++内存问题检查利器—Purify (三)
- C/C++内存问题检查利器—Purify (一)
- C/C++内存问题检查利器—Purify (五)
- C/C++内存问题检查利器—Purify (四)
- C/C++内存问题检查利器—Purify (四)
- C/C++内存问题检查利器—Purify (三)
- C/C++内存问题检查利器—Purify (一)
- C/C++内存问题检查利器—Purify (四)
- C/C++内存问题检查利器—Purify (二)
- C/C++内存问题检查利器—Purify (三)
- C/C++内存问题检查利器—Purify (二)
- C/C++内存问题检查利器—Purify (五)
- C/C++内存问题检查利器—Purify (四)