有关内存泄漏方面的规则主要是“内存管理”方面的,举几个简单的,如下
×用malloc或new申请内存之后,立即检查指针是否为NULL(防止使用指针为NULL的内存)
×动态内存的申请与释放是否配对(防止内存泄漏)
×malloc语句是否正确无误?例如字节数是否正确?类型转换是否正确
×是否出现野指针,例如用free或delete释放了内存之后,忘记将指针设置为NULL
... ...
第二步:积极主动检测“内存泄漏”
严遵循好的编程规则,可以让程序员在代码中尽量少的引入bug,但一旦不小心引入了,怎么办?这就要求我们在单元测试和集成测试中严把关。
在这个阶段,单靠程序员或者测试员通过“代码走查”的方式检查内存泄漏,客户的实践和我的经验告诉我,这将是“不切实际”的,无论效率还是时间。如果能够借助于一些的工具的话,情况可能就不一样了。
如果你的程序是用VisualC 6.0开发,那么Numega的BoundsChecker将是你检测“内存泄漏”最好的选择,如果是VisualC.NET,可以试一下Compuware的DevPartner。
如果你的程序基于Unix或者Linux平台,使用C或者C,可以考虑一下开源的工具valgrind,我的朋友跟我说,它在一定程度上比Rational的Purify更出色。
上面的工具都要求程序能够动态运行起来,而且测试用例需要你自己准备。
如果你正处于单元测试或集成测试阶段,程序代码量已经足够大,而且还不能够动态运行,要尽早检测代码中的“内存泄漏”问题,该怎么办?此时你可以试用一下目前最新的静态分析技术:
×它不要求代码能够动态运行
×也不需要你来编写测试用例
×只需要代码能够正常编译,就可以发现代码只有在执行过程中才出现的错误,当然也包括内存泄漏。
这方面的工具有Klocwork的K7,Coverity的SQS,以及Ctest中的BugDetective,其中最“物美价廉”的就是ctest的BugDetective。
2 如何发现客户端软件的“内存泄漏”?
如果开发过程中已经按照我上面提到的去做,相信发布后的程序存在“内存泄漏”的可能性几乎为零。
如果开发过程已经到了后期,系统测试已经开始做了,还要发现内存泄漏,这个时候我希望你能够拿到源代码。如果有源代码,你还可以考虑1中的第二步,借助于的工具协助,虽然可能效果不一定特别理想,但总比下面我提到的方法更好一些。
当然作为测试人员,我当然也理解事情总没有想像那么完美。下列关于alpha测试的描述我们通常会碰到“需要在系统测试阶段检测是否有内存泄漏,而且没有源代码”的难题。我曾经也遇到过。
记得那还是2002年的事情了。当时我承接的项目是一个电力行业的自动化系统,分为server端和client端,典型的c/s模式,老板要求在测试功能的同时顺便检查内存泄漏的问题,因为这个client端在客户那里可能是长时间不间断运行的,虽然客户很少操作。我当时很为难,因为没有源代码,我甚至无法做“代码走查”。在做功能测试的同时,我一直在琢磨...... 采用什么手段呢?
最后,借助于WinRunner,我出色的完成了任务,起码我的老板相信我的测试是可信的。我的方法是这样的。
×首先咨询开发方,了解到关于内存操作频繁的功能点和模块
×从我的功能测试用例中挑选出和这些功能点和模块相关的测试用例
×找到一个“纯净”的机器,上面除了操作系统和被测的client端外,没有任何其他应用,这样做是为了排除其他应用可能存在的干扰。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-25086-6.html
卡死机两次了
雷不丝