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

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

由于C/C++语言没有所谓的垃圾收集器,内存的分配和释放都需要程序员自己来控制,这会给C/C++程序员带来一定的困难。当您的程序越来越复杂时,它的内存管理也会变得越来越困难。内存泄漏、内存越界是最常见的内存问题之一。

内存泄漏如果不是很严重的话,在短时间内对程序不会造成太大的影响,而且在进程终止的时候,所有分配的内存都会释放掉。但是对于长时间运行的程序,其破坏力是惊人的,从性能下降到内存耗尽,甚至会影响到其它程序的正常运行。

此外,内存问题存在一个共同的特点,它本身并不会有很明显的现象,当有异常出现时就很难检查问题的原因所在,这给调试内存问题带来了很大的难度。

VLD是一款用于VisualC++的免费内存泄漏检查工具。可以在codeproject.com网站上找到,相比其它的内存泄漏工具,它在检查内存泄漏的同时,还具有如下特点:

  1. 可以得到内存泄漏点的调用堆栈,如果可以的话,还可以得到其所在的文件及行号;
  2. 可以得到泄漏内存的完整数据;
  3. 恶意设置内存泄漏报告的级别;
  4. 它以动态库的形式提供,无需编译源代码,只需要很小的改动程序;
  5. 源代码使用GNU许可发布,并有详细的文档及其注释。

从使用的角度讲,VLD简单易用,对于使用者自己的代码中唯一需要修改的地方是#include VLD.h的头文件后正常运行自己的程序就可以发现内存问题。从研究角度上讲,如果输入到VLD源代码,可以学习到堆内存分片与释放的原理、内存检查的原理机器内存操作的常用技巧等。

VLD网址:https://kinddragon.github.io/vld/

VLD的使用方法

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

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

2. codeplex上面下载VLD的源码,自行进行编译,生成VLDLIB库,然后添加到自己的工程中。使用方法同上,在任意的源文件中包含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为即输出也生成报告。如果你的程序为带窗体的程序,需要设置为fileboth

其它参数略!

VLD的示例程序

#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.hvld.h包含的位置必须放在stdafx.h之后。

【转载】https://blog.csdn.net/limingmcu/article/details/78687449

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值