VLD是开源的,遵循LGPL协议(http://vld.codeplex.com/)
一、VLD的能力
1、对于每一个泄漏块都提供包含文件名、行数等信息的全部堆栈(需要PDB支持)
2、可以发现包括COM和Windows堆在内的绝大部分进程内(in-process)内存泄漏
3、可以排除检查指定的模块甚至EXE本身
4、支持以十六进制和ASCII形式转储泄漏块的全部数据
5、可以自定义内存泄漏报告,包括形式和方式
二、如何使用VLD
在正式使用VLD之前,必须设置VC++的include和library查找路径( Tools ->Options -> Projects and Solutions-> VC++ Directories),要在程序中使用VLD:
1、 需要有至少一个C/C++文件包含 vld.h
2、 若程序包含多个dll,则每个dll都需要有至少一个C/C++文件包含 vld.h
3、 使用Debug选项编译
若程序由VC++调试启动,则进程退出时VLD会在输出窗口显示内存泄漏报告,双击报告内的栈,可以跳转到相应的源码文件。
三、一些有用的选项
VLD提供了一些配置项,可以通过vld.ini设置,默认情况将使用安装目录下的vld.ini,也可以将vld.ini拷贝到程序运行目录,这样仅当运行该程序时生效。
MaxTraceFrames:输出的堆栈级数限制
AggregateDuplicates:若为"yes",则只在报告中输出特定泄漏位置的第一次泄漏
MaxDataDump:转储数据大小限制
ReportTo:内存泄漏报告的输出形式,可以使用"debugger"、 "file"或者 "both"
ReportFile:内存泄漏报告的文件名,默认"memoryleakreport.txt"
四、VLD实现原理
Vld通过修改IAT表将crt的调用替换为自己的实现,并记录分配时的调用堆栈,相比通过宏替换new/delete、malloc/free,具有以下好处:
1、无需编译时对每个c/c++文件都包含指定头文件
2、可以运行时控制内存泄漏检查策略
3、具有很好的扩展性,例如支持vc11引入的_aligned_malloc
以上思路可用于检查其他泄漏,例如用户对象泄漏、GDI泄漏、句柄泄漏等