【IT168 技术文章】
Purify是主要针对开发阶段的白盒测试,是综合性检测运行时错误的工具,并可以和其他复合应用程序(包括多线程和多进程程序)一起工作。Purify检查每一个内存操作,定位错误发生的地点并提供尽可能详细的信息帮助程序员分析错误发生的原因。
它可以发现的主要错误有:(摘自purify在线帮助html/getstarted_pplus/2-purify.html)
· Reading or writing beyond the bounds of an array
数组读写越界
· Using uninitialized memory
使用未初始化的内存
· Reading or writing freed memory
读写未分配的内存
· Reading or writing beyond the stack pointer
栈指针读写越界
· Reading or writing through null pointers
读写空指针
· Leaking memory and file descriptors
内存和文件描述符泄漏
Purify还检查一些其他错误,如调用函数参数错误等。
由于purify对内存的分析和记录是在程序运行完成以后才显示,如果需要在程序运行时观测就很不方便,所以Purify也提供外接API函数帮助在运行时显示内存状况以调试程序。它提供的接口说明请参见我的另一篇关于Purify的文档purify的API和提示信息代号。
Purify的使用及注意事项:
1. 对于编译执行程序,如gcc –g testpurify.c –o tpurify命令,如果需要对testpurify使用purify进行调试,那么只要在命令前加入purify即可。如:purify gcc –g testpurify.c –o tpurify。这样,当运行testpurify程序时,即会自动弹出purify观察器的界面如图1(命令行模式下只是列出purify对程序运行的统计信息):
图1
purify不能用于动态链接库的编译命令。如下用法是错误的:
purify –shared –fpic libtest.c –o libtest.so
注意:如果在安装purify时是指定的purify license server模式进行安装(在安装中输入的是证书服务器的地址,如27000@licenses.com),那么在加入purify命令进行编译程序时,网络必须能连接到指定的证书服务器,否则无法使用purify。
2. 如果程序中调用了共享库,那么,如果修改了共享库后,需要使用purify命令对调用了共享库的程序进行重新编译,才能体现修改。
3. purify能够对发现的错误直接在源文件中进行定位,如图2中在main函数旁边显示的[hello_world.c:25]:
图2
可以在purify中直接对定位的错误进行修改,点击图标或者main下边的铅笔符号即可,弹出如图3的编辑框: 注意:如果错误发生的行号没有在观察器中显示,请检查你在编译时是否指定了-g参数。
图3
4. 注意到图2中有个ABR的字母缩写,它表示数组读错误。Purify有很多描述错误的字母缩写,请参加文档<<purify的API和提示信息代号.doc>>。
5. 现在介绍下purify的工具栏:
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13)
(1)(2)按钮是用于在purify观察器中导航,将最近有或标志的行高亮显示。
按钮(3)用于将有标志的项展开,按钮(4)用于将有标志的项收缩。
按钮(5)是用于打开编辑器。
按钮(6)(7)(8)是使用cleartool工具(没有安装)。
按钮(9)用于设置哪些错误信息不进行展开,以节省视图,关注更重要的错误信息。
按钮(10)是调用帮助。
按钮(11)是下一个内存泄漏提示标记。
按钮(12)是调用PureCovery。
按钮(13)是调用ClearQuest工具。
在项目开发测试中适用purify的领域有:
1. 使用purify提供的API函数,在程序运行的必要环节在观察器中显示需要获得的内存状况或打印消息。
2. 对于运行环境要求简单的程序,如可以在自己虚拟机上运行的单机程序,可以使用purify进行白盒测试,查找内存泄漏等运行时错误。
而对硬件有要求的程序,则不大可能使用purify。比如对嵌入式平台的程序,我们无法使用purify。