VLD(Visual LeakDetector)内存泄露工具的使用

VLD(Visual Leak Detector)是一款用于VisualC++的免费内存泄漏检查工具。功能:

    1)  可以得到内存泄漏点的调用堆栈,还可以得到其所在的文件及行号;

    2)  可以得到泄漏内存的完整数据;

    3)  恶意设置内存泄漏报告的级别;

    4)  它以动态库的形式提供,无需编译源代码,只需要很小的改动程序;

    5)  源代码使用GNU许可发布,并有详细的文档及其注释。

VLD网址:http://vld.codeplex.com/

 

一,使用方法:

1,直接从codeplex上面下载vld库的安装程序exe,双击安装后,程序会将vld的所包含的头文件和lib路径添加到vc的全局设置中,即Visual C++ IDE的"工具"→"选项"→"项目和解决方案"→"VC++ 目录"等设置,方便自己的工程上方便引用!

  使用过程中,在自己的工程中任意的源文件中包含<vld.h>即可,编译完的可执行程序并带有VLD内在检测功能。

2,从codeplex上面下载VLD的源码,自行进行编译,生成VLD的LIB库,然后添加到自己的工程中。

  使用方法同上,在任意的源文件中包含vld.h即可。

 

二,关于VLD的配置文件:

 Vld的库会检查程序所运行的当前目录是否存在vld.ini的配置文件,如果有,则加载里头的配置进行内存检测运行,如果没有取默认的配置参数运行,我们可以手动将vld.ini的文件拷贝到程序的运行目录中即可。

关于vld.ini的几个注意的参数:

  1,VLD = on   总开关,是否启用VLD功能,默认为yes

  2,MaxDataDump = 256  用来显示检测到的内在泄露的块的地址大小,默认256,其实就是显示多少个byte的内容。

  3,MaxTraceFrames = 64  设置VLD检测到堆栈的最大层极,也就是frame的深度

  4,ReportFile = xxx  设置VLD生成报告的位置和报告的文件名,默认为:.\memory_leak_report.txt,程序当前运行目录中。

  5,ReportTo = debugger 设置VLD生成报告的方式,debugger为在控制台输出VLD的报告信息,file在指定目录下生成报告文件,both为即输出也生成报告。如果你的程序为带窗体的程序,需要设置为file或both.

其它参数略!

 

三,示例:

 

#include "stdafx.h"
#include <vld.h>
#include <iostream>

#include <boost/thread.hpp>

void func()
{
    char *temp = new char[32];
}

int _tmain(int argc, _TCHAR* argv[])
{

    char *cha = new char[128];
    cha[0] = 'a';

    boost::thread thr(&func);
    
    std::cout << " hello " << std::endl;

    return 0;
}

运行结果:

Visual Leak Detector Version 2.4RC2 installed.
 hello
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 3 at 0x00AFE308: 128 bytes ----------
  Leak Hash: 0xF303E32F, Count: 1, Total 128 bytes
  Call Stack (TID 6336):
    f:\dd\vctools\crt_bld\self_x86\crt\src\newaop.cpp (7): memoryDeteck(VLD).exe!operator new[] + 0x9 bytes
    c:\users\pipilu\documents\visual studio 2008\projects\memorydeteck(vld)\memorydeteck(vld).cpp (15): memoryDeteck(VLD).exe!wmain + 0xA bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (583): memoryDeteck(VLD).exe!__tmainCRTStartup + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (403): memoryDeteck(VLD).exe!wmainCRTStartup
    0x767CED6C (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
    0x76E7399B (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0xEF bytes
    0x76E7396E (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0xC2 bytes
  Data:
    61 CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     a....... ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........




---------- Block 5 at 0x00AFE3B8: 32 bytes ----------
  Leak Hash: 0x22A6898C, Count: 1, Total 32 bytes
  Call Stack (TID 4716):
    f:\dd\vctools\crt_bld\self_x86\crt\src\newaop.cpp (7): memoryDeteck(VLD).exe!operator new[] + 0x9 bytes
    c:\users\pipilu\documents\visual studio 2008\projects\memorydeteck(vld)\memorydeteck(vld).cpp (9): memoryDeteck(VLD).exe!func + 0x7 bytes
    d:\3rdlibs\include\boost\thread\detail\thread.hpp (61): memoryDeteck(VLD).exe!boost::detail::thread_data<void (__cdecl*)(void)>::run + 0xA bytes
    0x100016B0 (File and line number not available): boost_thread-vc90-mt-gd-1_46_1.dll!boost::thread::operator!= + 0x3C0 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c (348): MSVCR90D.dll!_callthreadstartex + 0xF bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c (331): MSVCR90D.dll!_threadstartex
    0x767CED6C (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
    0x76E7399B (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0xEF bytes
    0x76E7396E (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0xC2 bytes
  Data:
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........




Visual Leak Detector detected 2 memory leaks (232 bytes).
Largest number used: 392 bytes.
Total allocations: 392 bytes.
Visual Leak Detector is now exiting.
请按任意键继续. . .


代码中二处内存泄露的行号已检测到,并行显示二个泄露的内存块的内容和堆栈调用情况!


四,备注

 1,vld只在debug的程序中才可使用,release无法使用。

 2,如果自己的工程中包含有stdafx.h,vld.h包含的位置必须放在stdafx.h

之后。


Visual Leak Detector是一款用于Visual C++的免费的内存泄露检测工具。相比较其它的内存泄露检测工具,它在检测到内存泄漏的同时,还具有如下特点: 1、 可以得到内存泄漏点的调用堆栈,如果可以的话,还可以得到其所在文件及行号; 2、 可以得到泄露内存的完整数据; 3、 可以设置内存泄露报告的级别; 4、 它是一个已经打包的lib,使用时无须编译它的源代码。而对于使用者自己的代码,也只需要做很小的改动; 5、 他的源代码使用GNU许可发布,并有详尽的文档及注释。对于想深入了解堆内存管理的读者,是一个不错的选择。 可见,从使用角度来讲,Visual Leak Detector简单易用,对于使用者自己的代码,唯一的修改是#include Visual Leak Detector的头文件后正常运行自己的程序,就可以发现内存问题。从研究的角度来讲,如果深入Visual Leak Detector源代码,可以学习到堆内存分配与释放的原理、内存泄漏检测的原理及内存操作的常用技巧等。 下面让我们来介绍如何使用这个小巧的工具。 首先解压得到vld.h, vldapi.h, vld.lib, vldmt.lib, vldmtdl l.lib, dbghelp.dll等文件。将.h文件拷贝到Visual C++的默认include目录下,将.lib文件拷贝到Visual C++的默认lib目录下,便安装完成了。因为版本问题,如果使用windows 2000或者以前的版本,需要将dbghelp.dll拷贝到你的程序的运行目录下,或其他可以引用到的目录。 接下来需要将其加入到自己的代码中。方法很简单,只要在包含入口函数的.cpp文件中包含vld.h就可以。如果这个cpp文件包含了stdafx.h,则将包含vld.h的语句放在stdafx.h的包含语句之后,否则放在最前面。如下是一个示例程序: #include
vld是一款非常有用的内存检测工具,它可以帮助程序员在开发过程中及时发现和解决内存泄漏的问题。 首先,我们需要在自己的项目中集成VLD。在下载并安装VLD后,我们可以将其作为一个静态库添加到项目中,或者使用命令行方式进行集成。 一旦集成成功,我们可以在程序运行过程中启动VLD进行内存检测。我们可以通过设置不同的环境变量来控制VLD的行为。比如,我们可以指定要检测的代码模块、要忽略的代码模块等。 当程序运行时,VLD会跟踪所有的内存分配和释放操作,并将涉及到的地址、大小和操作类型记录下来。如果存在内存泄漏,VLD会将泄漏的内存地址、大小和泄漏次数进行输出。 通过分析VLD输出的信息,我们可以根据内存泄漏的地址和大小去定位问题所在。比如,通过检查内存分配和释放操作之间的关系,我们可以找到造成内存泄漏的具体代码位置。然后,我们可以对泄漏的内存进行释放,修复问题。 除了检测内存泄漏外,VLD还可以检测其他内存错误,如内存访问越界、双重释放等。这些错误同样会导致程序的崩溃或者不可预料的行为,所以检测并修复它们也非常重要。 总之,VLD是一款非常实用的内存检测工具,它可以帮助我们在开发过程中更早地发现和解决内存泄漏和其他内存错误问题,提高程序的稳定性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值