作者:黄鑫(glacier②unnoo.com)
对于大中型软件来说,资源泄漏问题往往很难全面检测和定位。常见的资源泄漏分为两类:一是打开的文件或资源句柄没有及时关闭,二是动态申请的内存没有及时释放。这两种资源泄漏问题在情况严重时都将导致系统性能严重下降甚至死机。这里总结一下发现和解决这类问题的方法:
一、借助外部工具
使用“Numega Bounds Checker”或“Rational
Purify”等工具,设置源代码路径后加载Debug版本的二进制程序运行,会直接报告出可能存在资源泄漏和非法内存访问的代码位置。这两款检测软件都兼容目前常用的开发工具,如VB、VC、BCB、DELPHI等,操作也很方便,但我的实际使用结果却不太理想。误报现象不算严重,不至于影响自己的分析判断,但在漏报情况下就还得靠其他手段来检测了。
二、使用编译器自带的检测功能
1、BCB编译器中可以通过菜单“Project->Options->
CodeGuard”切换到CodeGuard页,选中“CodeGuard
Validation”中需要检测的项目即可。程序运行结束后BCB会对句柄、内存等资源泄漏情况作出详细报告。
2、VC中检测内存泄漏不像
BCB那么方便,需要通过重载malloc()、free()等函数并增加cl_mem_leak_diagnostics等预定义实现。虽然实现起来比较麻烦,但如果能做得完善一些并形成自己的检测库,在后续项目的使用中就方便多了。细节可以参考http://www.tunesmithy.co.uk/memleakcheck/index.htm中的描述和完整示例。
三、其他
1、编写代码时养成良好的编程习惯,在调用malloc()或new的同时写好free()或delete,然后在中间插入代码。
2、尽量不要在函数内的分支中调用return,以确保在统一的出口前释放临时申请的资源。
3、SQA部门将针对资源泄漏问题的检查列入代码检查表和白盒测试中,尽量不将该问题扩散到单元测试以外。
4、除了上面提到的专用工具和编译器以外,还可以通过一些“土办法”对资源泄漏问题进行检测。比如win2k中的任务管理器提供了对单个进程“内存使用”、“高峰内存使用”、“句柄数”等状态的实时监测功能,测试人员通过一段时间的监视,可以很容易发现较明显的资源泄漏问题。