增强的内存泄漏检测工具-VLD 1.9 d (文档翻译)

/*
最近工作常常遇见内存泄漏的问题,一般这样的问题都够呛,在网上找到了一个工具-VLD.顺便翻译了一下他的部分文档.
内存泄漏检测工具(Visual Leak Detector 1.9d (Beta))
翻译:xRoy
        2008-02-14 ,CD.


关键字:内存泄漏,VLD.
*/

介绍:(未翻译)
Visual C++ provides built-in memory leak detection, but its capabilities are minimal at best. This memory leak detector was created as a free alternative to the built-in memory leak detector provided with Visual C++. Here are some of Visual Leak Detector's features, none of which exist in the built-in detector:

    * Provides a complete stack trace for each leaked block, including source file and line number information when available.
    * Detects most, if not all, types of in-process memory leaks including COM-based leaks, and pure Win32 heap-based leaks.
    * Selected modules (DLLs or even the main EXE) can be excluded from leak detection.
    * Provides complete data dumps (in hex and ASCII) of leaked blocks.
    * Customizable memory leak report: can be saved to a file or sent to the debugger and can include a variable level of detail.

Other after-market leak detectors for Visual C++ are already available. But most of the really popular ones, like Purify and BoundsChecker, are very expensive. A few free alternatives exist, but they're often too intrusive, restrictive, or unreliable. Visual Leak Detector is currently the only freely available memory leak detector for Visual C++ that provides all of the above professional-level features packaged neatly in an easy-to-use library.

Visual Leak Detector is licensed free of charge as a service to the Windows developer community. If you find it to be useful and would like to just say "Thanks!", or you think it stinks and would like to say "This thing sucks!", please feel free to drop me a note. Or, if you'd prefer, you can contribute a small donation. Both are very appreciated.

使用:

 要在你的工程中使用VLD,按照这些步骤:
 1.在你的程序的C/C++源文件中,至少有一个包含了vld.h.到底包含到哪一个源文件中并不重要,同样的,包含此头文件时的与其他包含语句的先后关系也并不重要,当然预编译头文件除外,它要放在最前面.
 2.如果你的工程中有一个或者多个Dll,并且你希望在这些Dll中使用VLD,在每个DLL中,应该满足条件'1';
 3.编译为DEBUG版本
 
 注意:不用于早期版本的VLD,现在,它能允许在多个源文件中被包含,也可以被包含进一个被多次包含的通用头文件中.不管有多少源文件包含了VLD.H,只有一个VLD拷贝会被装载到进程中.
 

无论什么时候运行调试版本,VLD都将在你的程序中探测内存泄漏.当你在VC调试器下运行你的程序时,当你的程序存在内存泄漏的时候在调试器的输出窗口将会显示一个所有探测到的内存泄漏的报告(这个报告也可以是保存到文件的方式,参见配置文件中的ReportFile项). 在错误报告(应该指调试器中的)中双击某个源文件的行号,可以在代码编辑器中跳转到源文件中出错的那一行上.
注意:当你编译发行版本的程序时,VLD将不会被链接到你的可执行程序中,所以,在对于你做发行工作时,是可以安全的抛弃VLD的,这样做不会对你的程序产生任何性能降低或者其他的开销.

配置选项:
这里有一些配置参数,控制着VLD的动作行为.这些配置参数被保存在vld.ini中.默认的情况下,这个文件应该在VLD的安装目录下.然而,这个配置文件也可以拷贝程序的工作目录下,在这种情况下,调试程序的时候起作用的是工作目录下的这个.

------------------------------------------------------------
AggregateDuplicates

一般的,VLD会详细地显示每一个内存泄漏块.将这个选项设置为yes将会使得VLD让所有泄漏聚集在一起,共享相同的大小和调用栈,并在报告中单一的输出.只有第一个泄漏块将会被详述.其他的都不会被显示.替代而来的是一个显示总共泄漏的数字和与之匹配的的大小和调用栈.

----------------------------------------------------------
ForceIncludeModules
 在某些罕见的情况下,可能有必要在泄漏侦测中包含某个模块,但是也许不可能包含vld.h到任何一个源文件中去.在这样情况下,这个操作可以使用强制VLD来包含这些模块到内存侦测中.列出这些模块(DLL)的名字使它们被强制包含到泄漏侦测中.如果你使用了这个选项,你应该把vld.lib链接到你的工程中.
 
注意:当绝对有必要时,才使用这个选项.在某些情况下,使用这个选项会导致不可预知的行为,包括泄漏报告失败或者/和崩溃.最好是不要使用此选项,除非你确定你知道自己在做什么.

----------------------------------------------------------
MaxDataDump

将测参数设置成一个整数来限制在内存泄漏转储中显示的数据大小.当这个数值字节数量的内存已经被转储后,就会停止转储.这适用于任何一个泄漏块太大或者调试器的输出窗口变得十分杂乱.设置此参数为0,表示不转储.

----------------------------------------------------------
MaxTraceFrames

在默认情况下,VLD将尽可能远的跟踪调用栈.在你的调试版程序中每个被跟踪的帧被附加到额外的开销中(既有CPU时间也有内存使用).如果你想限制这些开销,你可以定义这个宏为一个数值.当跟踪的帧达到这个数量,就会停止对栈的跟踪.这个帧计数可能会包含一些"内部"的帧.默认情况下它们不会显示在调试器窗口(见下面的 TraceInternalFrames).某些情况下,在调用栈开始处可能存在3个或者4个"内部"帧
当你使用这个宏的时候,要注意此处.否则的话,你可能不会看见你期望看到的帧.

----------------------------------------------------------
ReportEncoding

当内存泄漏报告保存到文件时,这个报告可以是Unicdoe而不是默认的ASCII编码.这在内存泄漏时包含了Unicode的文字的时候有用.将此参数设置为"unicdoe"来产生一个unicoed编码的报告.

----------------------------------------------------------
ReportFile

使用这个选项来指定目标报告文件的位置和名字.如果不指定这个参数.报告文件将产生在工作目录下,名字为"memory_leak_report.txt" .

----------------------------------------------------------
ReportTo

使用这个参数来指定报告被附加到什么地方.可以是以下参数之一:"debugger"(默认),"file"或者"both".

----------------------------------------------------------
SelfTest

VLD有自己侦测自己是否有泄漏的能力.这个功能总是激活的.任何时间你运行VLD附加进你的程序来检查内存泄漏,它也检查自己.设置这个参数为"on"强制VLD故意泄漏一块内存:一个内容为"Memory Leak Self-Test"的21个字符的块被填进泄漏的块.这确保了一种方法来测试VLD的自检能力.并效验它是否工作正常.这个选项通常在调试VLD自己的时候比较有用.

----------------------------------------------------------
SlowDebuggerDump

如果允许这个参数,将使得VLD比正常情况下更慢一点地写报告到调试器的输出窗口.这个参数是为了兼容某些版本比较老的VS,如果向它(的输出窗口)过快的写内容,会导致丢失信息.如果你注意到一些信息好像从报告中消失了,尝试打开这个参数.

----------------------------------------------------------
StackWalkMethod

选择这个参数可以游走于栈上来获取已申请内存的调用栈.默认的"fast"方法有可能不会每次都成功完全跟踪到所有的栈.在这种情况下,"safe"方式也许能提供更可靠的方式,但是缺点是在调试时它比"fast"慢得多并且很可能导致性能明显下降.大多数情况下将此参数设置为"fast"是没有问题的.

如果你确实要使用"safe"方式,并注意到了明显性能下降.你也许要考虑使用MaxTraceFrames参数来限制帧的数量.这能极大减少花在跟踪栈的时间数量

----------------------------------------------------------
StartDisabled

设置这个选项为"yes"可以在最初禁止内存侦测.这样你在运行时可以有选择地允许内存侦测,而不用重新构建程序.但是应该谨慎使用这个参数,在禁用和允许侦测期间,任何内存泄漏都可能发生.

----------------------------------------------------------
TraceInternalFrames
这个参数声明是否所有调用栈的帧(包含堆中的内部帧)都被追踪.在调用栈上有很多用于判定引起泄漏的帧,它们都是VLD和C/C++以及Win32 Heap APIs的内部帧.一般这些帧在栈追踪期间都被跳过了,这样就稍稍缩小了花在追踪和收集数据以及存储的时间.在追踪栈上包含所有的帧,所有的方式包含VLD自己的代码都能,但是只对调试VLD自己有用.
 
 
 在运行时控制VLD
 使用默认的配置,VLD的内存侦测将在你的程序运行的整个阶段运行.在某些情形下你可能喜欢在某些代码段选择禁止内存侦测.VLD提供简单的API来控制在运行时阶段内存侦测的状态.要使用这些API,在需要使用的源文件中包含vld.h.

VLDDisable


 这个函数禁止内存泄漏侦测.调用这个函数之后,内存泄漏侦测将保持禁止,直到明确的调用VLDEnable来允许.
    void VLDDisable (void);

    参数:

    此函数无需参数.
   
    返回值:

    无(总是成功).
   
    注意:
 这个函数控制内存泄漏侦测是基于每个线程的.换句话说,调用这个函数,仅仅对调用这个函数的线程禁止内存泄漏侦测.对于同一进程的其他的线程仍然保持允许.这将程序员从不得不同步多线程来允许或者禁止VLD中隔离了出来.注意,这也意味着要在进程范围内禁止所有VLD,需要在每个线程中调用此函数.
   
VLDEnable
 这个函数允许内存泄漏侦测如果之前已经被禁止了.调用这个函数后VLD将保持允许检测状态知道明确调用了VLDDisable().
    void VLDEnable (void);

    参数:

    没有参数
    返回值:

    无(总是成功).

 注意:
    相似于VLDDisable,这个函数也是基于线程范围内的.

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值