VLD简要说明及工程配置
VLD:Visual Leak Detector,C/C++内存泄露检测工具,官方下载地址:http://vld.codeplex.com/点击打开链接,傻瓜式安装。
VLD 是专门是用来在 Visual C++ 2008/2010/2012 下开发的 C++ 项目检测内存泄露的一个工具,我觉得它更像一个库。
注意:VLD 只对 Debug 模式有效,对 Release 模式没什么影响。
Visual C++内置内存泄露检测工具,但是功能十分有限。
VLD就相当强大,可以定位文件、行号,可以非常准确地找到内存泄漏的位置,而且还免费、开源!
在使用的时候只要将VLD的头文件和lib文件放在工程文件中即可。
也可以一次设置,新工程就不用重新设置了。只介绍在Visual Studio 2008中的设置方法,VC++ 6.0类似:
- 工程右键属性->C/C++->常规->附加包含目录,把VLD安装目录中的include文件夹添加进来(如:C:\Program Files (x86)\Visual Leak Detector\include),也可把include下的文件拷贝到自己的工程目录下;
- 工程右键属性->链接器->常规->附加库目录,把VLD安装目录中的lib文件夹添加进来(如:C:\Program Files (x86)\Visual Leak Detector\lib\Win32),也可把lib下的文件拷贝到自己的工程目录下;
- 在需要检测内存泄漏的源文件中添加
#include “vld.h”
顺序无所谓,但是一定不能在一些预编译的文件前(如stdafx.h)。我是加在stdafx.h文件最后。
- 把安装目录下dll文件夹中的所有dll文件和Microsoft.DTfW.DHL.manifest文件拷贝到工程Debug目录,也就是Debug版.exe生成的位置。点击Debug –> Start Debugging 调试程序,在OUTPUT窗口中就会显示程序运行过程中的内存泄漏的文件、行号还有内容了。
VLD的配置文件
配置文件在安装目录下(vld.ini),修改配置文件将会影响所有使用到 VLD 的工程。另外一种做法。将 vld.ini 复制到你的工程目录下(VS2008 C++工程Debug目录),然后修改,只会影响你的所在工程配置。
vld.ini 配置有几个选项,我只说一下我感觉很有用的:
-
VLD
:
选择VLD的打开与关闭。在Debug模式下运行,关闭以后会有一行VLD关闭的提示信息。默认为 on。
AggregateDuplicates
:
这个非常有用,设置为 yes 时,相同地方产生内存泄漏只输出一次,但是会统计发生的次数。默认是 no 。
MaxDataDump
:
输出的dump数据个数,默认为 256。
MaxTraceFrames
:
官方文档解释的非常复杂,我的理解就是输出的调用栈的层数。默认是 64。
ReportEncoding :report
文件的编码格式,可选有 ascii, unicode,默认是 ascii 。
ReportFile
:
report 文件的路径。默认是 “.\memory_leak_report.txt”
ReportTo
:
这个也是一个很有用的参数,可选有 debugger, file, both,debugger 表示输出到 debug模式下的输出窗口;file 表示只输出到文件中; both顾名思义,全都都输出。默认是 debugger 。具体用那个参数,看你的内存泄漏出现的多少了,自己衡量吧。
检测结果示例:
---------- Block 55 at 0x016D2B30: 92 bytes ----------
Leak Hash: 0x38BBBD28, Count: 1, Total 92 bytes
Call Stack (TID 6368):
MSVCR90D.dll!malloc_dbg()
mfc90ud.dll!0x0095AED6()
mfc90ud.dll!0x0095A8B8()
mfc90ud.dll!0x00975F6E()
mfc90ud.dll!0x00975FFF()
mfc90ud.dll!0x009B828B()
e:\projects\ybsoft_1\hiip\trunk\jcpt\corecode\bpmiddleware\src\bpmiddleware\bpmiddleware.cpp (103): BPMiddleware.exe!CBPMiddlewareApp::InitInstance() + 0xB bytes
mfc90ud.dll!0x0098F554()
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\appmodul.cpp (34): BPMiddleware.exe!wWinMain()
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (578): BPMiddleware.exe!__tmainCRTStartup() + 0x35 bytes
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (403): BPMiddleware.exe!wWinMainCRTStartup()
kernel32.dll!BaseThreadInitThunk() + 0x12 bytes
ntdll.dll!RtlInitializeExceptionChain() + 0x63 bytes
ntdll.dll!RtlInitializeExceptionChain() + 0x36 bytes
Data:
54 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 T...@... ........
D0 06 98 00 30 B3 9D 00 40 3C 8E 00 00 00 00 00 ....0... @<......
11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
0A 00 00 00 40 3C 8E 00 00 00 00 00 07 00 00 00 ....@<.. ........
00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 ........ ........
98 45 8E 00 20 00 00 00 01 00 00 00 .E...... ........
安装程序中有更详细的使用说明。
Block 那一行说明了泄露大小;
Leak Hash 那一行说明了同样地方出现泄露的次数(vld.ini AggregateDuplicates = no时才会输出);
Call Stack 调用堆栈这一块是最重要的,定位问题出现的模块(位置);
Data 表示泄露的数据块中的数据,小工程比较有用。大工程数据看不来的。