近期想学习下VLD的实现,打算从最简单的V1.0版本看起。以下是V1.0版本自己尝试翻译下,最新的2.x版本似乎强大了很多。

简介

Visual C++提供了内置的内存检测机制,但其充其量只满足了最小定位需求。VLD工具定位为内置内存泄漏的替代,提供了如下特性:

  • 泄漏内存块的全调用栈回溯,包括文件及其行号;
  • 泄漏内存完整转储(hex和ascii格式);
  • 可定制的泄漏报告等级(报告的详细程度可配置)
    相对于Purify和BoundsChecher工具其是免费的,而其他免费工具,往往需要入侵式代码、有严格的使用约束或者根本不可靠。VLD相对于其他免费工具的优点:
  • 简单易用。不需要去编译源代码,仅需要在工程中添加几行代码即可完成集成;
  • 提供泄漏内存调用栈和内存转储;
  • 兼容C\C++(对new/delete和malloc/free都有效)
  • 全代码开源并有良好的帮助文档,易用按需修改以进行工程适配;
 

使用VLD

如果你需要同时检查工程包含的DLL,见"在DLL中检测",步骤:

  1. 拷贝VLD库文件(*.lib)到工程的lib目录下;
  2. 拷贝VLD头文件(vld.h和vldapi.h)到include目录下;
  3. 在程序主入口的源文件中,包含vld.h文件。这样做最好,但不是绝对的,包含语句应在其他包含语句之前但在stdafx.h包含语句之后(紧接#include "stdafx.h"之后);
  4. 如果程序在Windows2000或之前的系统运行,需要拷贝dbghelp.dll到执行文件所在目录;
  5. 编译debug版本的工程;

VLD会自动在debug版本的程序中进行内存泄漏检测,并在程序退出时自动在输出窗口打印出泄漏报告。注意:当编译的为Release版本的程序,VLD不会被链接到程序中。所以将vld.h的文件包含语句留在工程源代码中是安全的。

配置选项

VLD有一些预编译宏可以控制VLD的某些行为:

VLD_AGGREGATE_DUPLICATES 去除重复的内存泄漏信息。

VLD_MAX_TRACE_FRAMES 最大栈回溯深度;

VLD_MAX_DATA_DUMP 最大内存转储大小;

VLD_SELF_TEST 自我诊断,该特性总是激活的,每次运行VLD,VLD自身会故意泄漏21字节的内存,并填充字符串"Memory Leak Self-Test"。该特性用于确定VLD是否正在工作。

VLD_SHOW_USELESS_FRAMES 仅显示有用的栈信息,heap和vld自身的栈默认不显示;

VLD_START_DISABLED 禁止自使能,即手动启动VLD检测,这样可能导致一些检测失效。

VLD运行时

void VLDDisable(void); 禁用VLD;

void VLDEnable(void); 启用VLD;

在DLL中检测内存泄漏

检测DLL中的内存泄漏有些特殊注意事项以保证VLD正常运行:VLD在每个进程应只被一个模块链接;最佳建议是第一个被初始化的模块;详细情况如下:

隐式加载的DLL

隐式加载的DLL在应用程序main函数前就已经完成初始化。因此dll是第一个被初始化的模块,而VLD应该被其链接。一般情况下exe程序会链接多个DLL,只要在第一个需要被检查的模块里链接VLD即可。多个DLL的加载顺序可以通过在调试器里观察得出。

显式加载的DLL

显示加载(LoadLibrary)的DLL初始化在exe程序初始化之后,此时,exe程序应该作为链接VLD的模块;

静态链接CRT的DLL

当DLL使用/ML或者/MT编译器选项,会造成在一个进程中存在多个CRT实例。VLD的泄漏检测不能跨越CRT边界。一个VLD实例只能监视一个CRT实例的内存情况。如果要同时监视多个CRT实例,必须在每一个静态链接CRT的模块中都链接VLD;

已知的限制

VLD 不支持COM或其他和CRT堆无关的内存泄漏检测。简单的说:vld1.0版本只支持通过new或malloc开辟的内存的泄漏检测;

VLD不支持V6.5版本的dbghelp.dll;

已编译的VLD发行包和VS2005不兼容,如果需要支持请在VS2005下自行编译;

VLD 1.0 ReadMe翻译尝试的更多相关文章

  1. PyCharm3.0默认快捷键(翻译的)

    PyCharm3.0默认快捷键(翻译的) PyCharm Default Keymap 1.编辑(Editing) Ctrl + Space    基本的代码完成(类.方法.属性)Ctrl + Alt ...

  2. 关于Gradle2.0的翻译说明

    Gradle1.12的翻译情况 Gradle实际上在4月16日就已经在对应的OmegaT项目上完成了翻译,后因项目繁忙,直到7月20日才完成了Github上Gradledoc项目及七牛站点的更新. 总 ...

  3. AFNetworking2.0 NSHipster翻译

    AFNetworking 是当前 iOS 和 Mac OS X 开发中最广泛使用的开源项目之一.它帮助了成千上万叫好又叫座的应用,也为其它出色的开源库提供了基础.这个项目是社区里最活跃.最有影响力的项 ...

  4. PBAP 1.0协议翻译(Part1)

    添加vCard3.0 Spec的链接- http://tools.ietf.org/html/rfc2425- http://tools.ietf.org/html/rfc2426 寻找最新的Spec ...

  5. android 6.0特性翻译 --渣渣

    所有关于Android 6.0 棉花糖的知识 上下文帮助 1.现在按压:不需要离开你正在运行的app或者访问的网站就可 获取帮助,仅仅触摸和按下Home按钮.(长按Home键,可以在 android ...

  6. 2018-09-13 代码翻译尝试-使用Roaster解析和生成Java源码

    此文是前文使用现有在线翻译服务进行代码翻译的体验的编程语言方面第二点的一个尝试. 参考Which framework to generate source code ? - Cleancode and ...

  7. C# Language Specification 5.0 (翻译)第一章 引言

    C#(念作 See Sharp)是一种简单.现代.面向对象并且类型安全的编程语言.C# 源于 C 语言家族,因此 C.C++ 和 Java 工程师们能迅速上手.ECMA 国际[1](ECMA Inte ...

  8. C# Language Specification 5.0 (翻译)第二章 词法结构

    程序 C# 程序(program)由至少一个源文件(source files)组成,其正式称谓为编译单元(compilation units)[1].每个源文件都是有序的 Unicode 字符序列.源 ...

  9. C# Language Specification 5.0 (翻译)第三章 基本概念

    应用程序启动 拥有进入点(entry point)的程序集称应用程序(application).当运行一应用程序时,将创建一新应用程序域(application domain).同一个应用程序可在同一 ...

随机推荐

  1. php+mysql将大数据sql文件导入数据库

    <?php $file_name = "d:test.sql"; $dbhost = "localhost"; $dbuser = "root& ...

  2. mac下升级ruby环境版本

    在ios开发中会经常使用到cocoapods来管理第三方框架,在安装cocoapods的时候会涉及到ruby环境,有时候会因为版本过低会导致安装失败,本文主要讲一下如何升级ruby环境 安装rvm,r ...

  3. 无法读取配置节 system.serviceModel 因为它缺少节声明的解决方法

    无法读取配置节 system.serviceModel 因为它缺少节声明的解决方法,需要的朋友可以参考下 在Windows Server2008 R2中的IIS7中部署WCF服务时报出如题错误: HT ...

  4. 配置Kestrel 网址Urls

    配置Kestrel 网址Urls ASP.NET Core中如何配置Kestrel Urls呢,大家可能都知道使用UseUrls() 方法来配置. 今天给介绍全面的ASP.NET Core 配置 Ur ...

  5. 【iOS开发】添加子控件方式(懒加载,GCC)

    // // ViewController.m // GCC // // Created by admin on 15/10/7. // Copyright © 2015年 admin. All rig ...

  6. [HDU] 1394 Minimum Inversion Number [线段树求逆序数]

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  7. 《Programming WPF》翻译 第8章 5.创建动画过程

    原文:<Programming WPF>翻译 第8章 5.创建动画过程 所有在这章使用xaml举例说明的技术,都可以在代码中使用,正如你希望的.可是,代码可以使用动画在某种程度上不可能在x ...

  8. Linux服务器挂死案例分析

    问题现象: 在linux服务器上运行一个指定的脚本时,就会出现无数个相同进程的,而且不停的产生,杀也杀不掉,最后系统就陷入死循环,无法登陆,只能人工去按机器的电源键才可以.这够崩溃的吧? 问题分析过程 ...

  9. Web UI 网站用户界面设计命名规范

    Web UI 网站用户界面设计命名规范 WEB UI设计命名规范,也就是网站用户界面设计(网页设计)命名规范. 这套规范并非单纯的CSS.html或JavaScript命名规范,它涉及了很多使用Pho ...

  10. Linux web性能优化

    1,