如何发现客户端软件中的内存泄露?

发表于:2012-3-19 10:17

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  如何发现客户端软件中的内存泄露?我的看法是:检测内存泄漏的问题应该尽早进行,它绝不应该是系统测试时的主要目标。也就是说,检查是否存在内存泄漏,应该从编码时就要考虑,单元测试和集成测试时要重点检查。如果前期没有考虑,等到了系统测试才想起检查或者才发现泄漏,为时已晚,此时再去定位泄漏的位置,太难太难了,它可能会让你的交付日期delay不确定的时间。 最近看了一些自动错误预防(AEP)的理论,我深受启发。作为测试人员的我们,从“发现错误”转变到“帮助开发人员预防错误”,这将是一个巨大的转变。所以说,下面我的答案中的第一点,我先说如何预防内存泄漏的问题,然后再讲如何发现。

  1、如何在开发过程中有效预防内存泄漏?

  第一步:遵循“好”的编程规则

  “好”的编程规则是各位前辈经验和教训的集合,好的编程规则堪称开发者的“圣经”。遵循统一的编程规则,可以让开发新手少走好多弯路,可以让项目整体的质量维持一个起码的“质量底线”。

  有关内存泄漏方面的规则主要是“内存管理”方面的,举几个简单的,如下

  ● 用malloc或new申请内存之后,立即检查指针值是否为NULL(防止使用指针值为NULL的内存)

  ● 动态内存的申请与释放是否配对(防止内存泄漏)

  ● malloc语句是否正确无误?例如字节数是否正确?类型转换是否正确

  ● 是否出现野指针,例如用free或delete释放了内存之后,忘记将指针设置为NULL

  ... ...

  第二步:积极主动检测“内存泄漏”

  严格遵循好的编程规则,可以让程序员在代码中尽量少的引入bug,但一旦不小心引入了,怎么办?这就要求我们在单元测试和集成测试中严格把关。

  在这个阶段,单靠程序员或者测试员通过“代码走查”的方式检查内存泄漏,客户的实践和我的经验告诉我,这将是“不切实际”的,无论效率还是时间。如果能够借助于一些专业的工具的话,情况可能就不一样了。

  如果你的程序是用Visual C++ 6.0开发,那么Numega的BoundsChecker将是你检测“内存泄漏”最好的选择,如果是Visual C++.NET,可以试一下Compuware的DevPartner。

  如果你的程序基于Unix或者Linux平台,使用C或者C++,可以考虑一下开源的工具valgrind,我的朋友跟我说,它在一定程度上比Rational的Purify更出色。

  上面的工具都要求程序能够动态运行起来,而且测试用例需要你自己准备。

  如果你正处于单元测试或集成测试阶段,程序代码量已经足够大,而且还不能够动态运行,要尽早检测代码中的“内存泄漏”问题,该怎么办?此时你可以试用一下目前最新的静态分析技术:

  ● 它不要求代码能够动态运行

  ● 也不需要你来编写测试用例

  ● 只需要代码能够正常编译,就可以发现代码只有在执行过程中才出现的错误,当然也包括内存泄漏。

  这方面的工具有Klocwork的K7,Coverity的SQS,以及C++test中的BugDetective,其中最“物美价廉”的就是c++test的BugDetective。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号