Visual Leak Detector (VLD)使用

14 篇文章 0 订阅

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类似:

  1. 工程右键属性->C/C++->常规->附加包含目录,把VLD安装目录中的include文件夹添加进来(如:C:\Program Files (x86)\Visual Leak Detector\include),也可把include下的文件拷贝到自己的工程目录下;
  2. 工程右键属性->链接器->常规->附加库目录,把VLD安装目录中的lib文件夹添加进来(如:C:\Program Files (x86)\Visual Leak Detector\lib\Win32),也可把lib下的文件拷贝到自己的工程目录下;
  3. 在需要检测内存泄漏的源文件中添加
    #include “vld.h”

    顺序无所谓,但是一定不能在一些预编译的文件前(如stdafx.h)。我是加在stdafx.h文件最后。

  4. 把安装目录下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 表示泄露的数据块中的数据,小工程比较有用。大工程数据看不来的。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值