IBM® Rational® Purify® 是一种高级存储错误检测的工具,能够帮助您们精确地找到很难被调试得存储毁坏错误。您需要通过使用 Purify 来测试您的软件,当您运行这个可测量的软件的时候,Purify 就会仔细检查每个存储存取,并在它发生之前报告所有的毁坏错误。
Purify 在软件开发生命周期中是一种非常有用的工具。开发人员可以用它来确保他们已经编写的新代码不会在不防之时导致任何存储毁坏错误或者渗漏。测试工程师可以利用它获取功能验证和系统整合测试期间的存储错误。现场和支持技术工程师可以利用它诊断软件部署完成之后遇到的存储问题。由于在软件开发生命周期早期检测和修复缺陷的成本最低,所以最好在开发和测试阶段获取和修复尽可能多的问题。您可以通过在软件开发生命周期中有条理且系统地使用 Purify,从而达到理想的状态。实现它最好的办法是自动化 Purify 的使用过程,并讲它整合到您的软件开发和测试过程中。
自动化工具的操作可以减少普通开支,并更有效地使用它,同时还会减少将它作为这个过程一部分的采用阻力。因此,自动化操作在流线型过程中是非常关键的。例如,您可以将 Purify 与您的单元或者烟雾测试单元整合在一起,这些单元是开发人员必须在报告任何代码变更前必须运行的单元,并需要它们修复 Purify 所报告的所有新的存储错误。用这种方法,只要发现错误就会马上被报告和尽早修复,因为这个代码变更在开发人员的脑子里仍然十分新鲜。类似的,您可以将 Purify 和您功能性和系统验证测试单元整合在一起,您可能每夜或者每个周都在运行它。测试人员可以分析和现场检测 Purify 所报告的存储错误。这样确保了新的存储错误可以从他们引见的时间的一天或者一周内捕获,这样比释放软件之后捕获要好得多。
在这篇文章中,您可以学习使用 Purify 以及将它整合到您的 makefiles 中:可以在一个渗漏的船舶中导航 C 吗?尝试一下 Purify。如果您已经对 Purify 十分熟悉,您可以跳过或者略过那篇文章。在这篇文章中,您将首先学习如何更改您的构建和测试环境,从而将 Purify 合并予其中,以及学习您可以用来与 Purify 选项整合在一起从而自动化使用 Purify 的转换符号。然后您将看到一个例子,在这个例子中所有性能都是用来自动操作 Web 页面上 Purify 错误概要的报告行为。
将 Purify 整合到您的构建和测试环境中
在将 Purify 整合到您的软件开发和测试过程中的第一步是修改您的构建和测试系统。这个构建系统构建了一个应用软件,而测试系统利用一个测试单元运行了这个应用软件 (现实在图 1中蓝色区域中)。一般情况下,这个构建应用软件和运行测试单元的过程都是自动的安排有序地每夜或者每周运行的工作。
您需要修改您的构建系统在没有任何调试信息(释放字节)的情况下构建 Purify 的应用软件。比如构建一个 Purify 的应用软件,利用调试信息(释放字节)来构建应用软件是合理的(尽管不是必要的),然后对它进行净化。您还需要修改您的测试系统来运行带有 Purify 的应用软件的测试单元,另外还要将它与正常应用软件进行运行。这些附加的构件和测试步骤显示在下面图 1中绿色的区域。做了这些变更之后,添加构建 Purify 的应用软件并利用您的测试单元来运行它,从而每夜或者每周自动操作您的工作。在这篇文章的后面部分, 您将学习各种控制和自动操作这些行为的方法,当 Purify 检测记忆错误或者漏洞的时候就会采取这些行为。
使用转换符号
Purify 提供了各种转换符号,您可以用来确定各种选项的值,比如 -view-file 和 -log-file(这些选项将 Purify 输出分别发送到一个 Purify 视图文件和 ASCII 日志文件分别)。Purify 用意味深长的扩展取代这些符号,并为保存数据计算一个唯一的文件名称。 例如,您可以将这个程序名称和过程 ID 置入这个日志文件的名称中:
$ purify -log-file=./purifyerrors_%v_%p.plog cc -o progname foo.c bar.c这个命令将创建一个可测量的可执行的可命名的 progname。如果您运行它,运行它的过程 ID 是1234,所有 Purify 的错误都将被记录在一个名称为purifyerrors_progname_1234.plog的文件。在这个日志文件名称中,Purify 扩展 %v 为这个程序可执行名称以及 %p 为这个过程 ID。
运行 Purify 之后添加一些操作
在运行您的可测试应用软件之前对已经发生的进行自动化操作是很容易的,因为您可以控制一切。您可以控制和自动操作通过开拓各种能让您添加自定义后置处理任务的 Purify 特性来运行这个应用软件之后所发生的事情。您可以利用这个来报告这个可测试程序退出之后所有错误的概要。这样做,您可以使用 Purify-run-at-exit 运行时选项。例如,如果您的可测试应用软件是 test.pure,您可以利用下面这个选项来打印查询的错误列表:
$ setenv PURIFYOPTIONS '-run-at-exit="if %z ; then \ echo \"%v : %e errors, %l bytes leaked.\" ; fi"'紧跟在 -run-at-exit选项后面的字符串是由这个程序退出后的文件执行的。转换符号替代已经制作,比如如果在这个运行过程中没有 Purify 错误或者渗漏,它将 %z 转变为 false。正因为如此,这个例子中所陈述的 if说:“只有当错误出现时才执行 'echo'。”这个 echo命令,相反利用更多的替代字符串来报告存在错误的数量。在现存的程序之上,Purify 发送了一个与另一个十分相似的消息:
$ test.pure test.pure : 2 errors, 10 bytes leaked这是一个样本案例。然而,您可以将复杂的过程置于一个脚本,或者一个程序中,并且传递各种转换符号作为变量到这个脚本或者程序中。例如:
$ setenv PURIFYOPTIONS '-run-at-exit="postprocess.csh %v %z %e %l "'表格 1和表格2显示了更多转换符号替代字符串的详细情况。