[√]vld的安装和使用

简介: [√]vld的安装和使用

vld

Visual Leak Detector是一款用于Visual C++的免费的内存泄露检测工具,Github显示该仓库已经停止维护了,它还有自己的github.io主页

vld安装

注意安装目录不能有空格、中文,后续加入头文件目录有这个限制。

安装完成后的目录结构,可以看到它是区分32、64位的

image.png

vld.ini

vld是有自己的配置文件vld.ini, 方便用户自定义化,虽然暴露的配置项不是太多。

当vld被项目加载时会打印log:

Visual Leak Detector read settings from: xxxxx

仓库的vld.cpp中有获取ini的逻辑,大致总结下查找vld.ini的顺序:

  • 从当前模块所在的目录查找
  • 从当前exe的运行目录查找
  • vld.dll所在的目录查找
  • 从注册表中查找(使用安装版本的vld有修改注册表) image.png

如果以上目录都没有找到,就会使用默认的配置。

在项目中使用

  1. 项目中引入lib、头文件所在的目录,如果你的程序是win32的,需要使用win32相关的lib,不能混用
  2. 在程序main入口文件引入文件 #include "vld.h"
  3. 运行程序,当程序退出后,vld就会自动打印内存泄露的详细信息,大致如下: ---------- Block 118694 at 0x001BAEB0: 8 bytes ---------- Leak Hash: 0x3A03EC15, Count: 1, Total 8 bytes Call Stack (TID 23792): ucrtbased.dll!malloc() D:\new_scalar.cpp (35): editor.exe!operator new() + 0x9 bytes C:\xmemory (79): editor.exe!std::_Default_allocate_traits::_Allocate() + 0x9 bytes

vld的依赖项libformat

在vld的项目属性中,linker/ input里面是找不到libformat的依赖的

image.png

但是在command line里面就出现了这个依赖

image.png

设置依赖的地方在这里:

image.png

应用程序无法正常启动(0xc0150002)

如果程序运行起来时,出现:

image.png

这是因为缺少依赖项导致的,以下2个文件也需要copy到正确的位置,特别是那个manifest文件

  • Microsoft.DTfW.DHL.manifest
  • dbghelp.dll

Microsoft.DTfW.DHL.manifest

Microsoft.DTfW.DHL.manifest 是一个用于描述模块依赖的 XML 文件,它是 Microsoft Debugging Tools for Windows 的一部分。此文件描述了 Microsoft 诊断技术框架(Diagnostics Technology Framework,DTF)和 Microsoft 调试帮助库(Debug Help Library,DHL)等模块之间的依赖关系。

在程序运行时,如果该程序需要用到 DTF 或 DHL 等相关模块的功能,系统会自动加载这些模块,并根据 Microsoft.DTfW.DHL.manifest 中所描述的依赖关系来进行初始化。

因此,在部署和维护程序时,确保正确引用 Microsoft.DTfW.DHL.manifest 及其它依赖文件,可以帮助程序正确地加载和使用相关模块,从而更好地实现程序的调试和诊断功能。

使用体验

vld的内存泄露检测还是非常强悍的,基本上是非常精准,而且零误报,不过使用过程中还有一些不足的地方:

  • 单例类型的内存,如果程序退出时不主动清理,vld也会认为是内存泄露,不过懒人一般都是把这部分内存交给操作系统清理了,毕竟这部分的内存对程序的运行可以不认为是内存泄露。
  • 即使是同一处代码导致的内存泄露,每一次的内存泄露都是单独的一次打印,打印信息没有合并,导致查看起来非常麻烦。
  • 部分内存泄露无法统计到堆栈,只给出了地址,这对于排查修复没有任何帮助。
  • 内存泄露统计过于详细,cocos2dx随便跑一下,就给出了几百处内存泄露的地方,里面有重复的地方,但是大部分都是几个字节的泄露,甚至字符串常量也会被统计进去。
目录
相关文章
|
算法 C++
[√]ffi zlib
[√]ffi zlib
92 1
|
Web App开发 JavaScript 前端开发
[√]MeshBuffer和VertexFormat
[√]MeshBuffer和VertexFormat
74 1
|
Shell C++ Windows
[√]尝试使用cmake编译使用vld
[√]尝试使用cmake编译使用vld
142 0
|
编译器 API C++
[√]vld编译Release遇到的各种问题
[√]vld编译Release遇到的各种问题
97 0
|
编译器 Android开发 iOS开发
[√]关于cmake的kits
[√]关于cmake的kits
165 0
|
缓存 Linux Android开发
[√]获取Android内存情况
[√]获取Android内存情况
146 0
|
算法 C++ Windows
[√]vld实现对结果自定义排序
[√]vld实现对结果自定义排序
73 0
|
编译器
[√]cmake 编译选项
[√]cmake 编译选项
95 0
|
存储 编译器 API
[√]vld源码共读
[√]vld源码共读
76 0
Qt5Error:msvc-version.conf loaded but QMAKE_MSC_VER ins‘t set
Qt5Error:msvc-version.conf loaded but QMAKE_MSC_VER ins‘t set
493 0