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.

其它参数略!

 

三,示例:

 

[cpp]  view plain  copy
  1. #include "stdafx.h"  
  2. #include <vld.h>  
  3. #include <iostream>  
  4.   
  5. #include <boost/thread.hpp>  
  6.   
  7. void func()  
  8. {  
  9.     char *temp = new char[32];  
  10. }  
  11.   
  12. int _tmain(int argc, _TCHAR* argv[])  
  13. {  
  14.   
  15.     char *cha = new char[128];  
  16.     cha[0] = 'a';  
  17.   
  18.     boost::thread thr(&func);  
  19.       
  20.     std::cout << " hello " << std::endl;  
  21.   
  22.     return 0;  
  23. }  

运行结果:

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

之后。

相关推荐
<p> <span style="font-size:14px;color:#E53333;">限时福利1:</span><span style="font-size:14px;">购课进答疑群专享柳峰(刘运强)老师答疑服务</span> </p> <p> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;"></span> </p> <p> <span style="font-size:14px;color:#337FE5;"><strong>为什么需要掌握高性能MySQL实战?</strong></span> </p> <p> <span><span style="font-size:14px;"><br /> </span></span> <span style="font-size:14px;">由于互联网产品用户量大、高并发请求场景多,因此对MySQL性能、可用性、扩展性都提出了很高要求。使用MySQL解决大量数据以及高并发请求已经是程序员必备技能,也是衡量一个程序员能力和薪资标准之一。</span> </p> <p> <br /> </p> <p> <span style="font-size:14px;">为了让大家快速系统了解高性能MySQL核心知识全貌,我为你总结了</span><span style="font-size:14px;">「高性能 MySQL 知识框架图」</span><span style="font-size:14px;">,帮你梳理学习重点,建议收藏!</span> </p> <p> <br /> </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202006031401338860.png" /> </p> <p> <br /> </p> <p> <span style="font-size:14px;color:#337FE5;"><strong>【课程设计】</strong></span> </p> <p> <span style="font-size:14px;"><br /> </span> </p> <p> <span style="font-size:14px;">课程分为四大篇章,将为你建立完整 MySQL 知识体系,同时将重点讲解 MySQL 底层运行原理、数据库性能调优、高并发、海量业务处理、面试解析等。</span> </p> <p> <span style="font-size:14px;"><br /> </span> </p> <p> <span style="font-size:14px;"></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>一、性能优化篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括经典 MySQL 问题剖析、索引底层原理和事务与锁机制。通过深入理解 MySQL 索引结构 B+Tree ,学员能够从根本上弄懂为什么有些 SQL 走索引、有些不走索引,从而彻底掌握索引使用和优化技巧,能够避开很多实战中遇到&ldquo;坑”。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>二、MySQL 8.0新特性篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括窗口函数和通用表表达式。企业中许多报表统计需求,如果不采用窗口函数,用普通 SQL 语句是很难实现。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>三、高性能架构篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括主从复制和读写分离。在企业生产环境中,很少采用单台MySQL节点情况,因为一旦单个节点发生故障,整个系统都不可用,后果往往不堪设想,因此掌握高可用架构实现是非常有必要。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>四、面试篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">程序员获得工作第一步,就是高效准备面试,面试篇主要从知识点回顾总结角度出发,结合程序员面试高频MySQL问题精讲精练,帮助程序员吊打面试官,获得心仪工作机会。</span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页