vld
Visual Leak Detector是一款用于Visual C++的免费的内存泄露检测工具,Github显示该仓库已经停止维护了,它还有自己的github.io主页。
vld安装
注意安装目录不能有空格、中文,后续加入头文件目录有这个限制。
安装完成后的目录结构,可以看到它是区分32、64位的
vld.ini
vld是有自己的配置文件vld.ini, 方便用户自定义化,虽然暴露的配置项不是太多。
当vld被项目加载时会打印log:
Visual Leak Detector read settings from: xxxxx
仓库的vld.cpp中有获取ini的逻辑,大致总结下查找vld.ini的顺序:
- 从当前模块所在的目录查找
- 从当前exe的运行目录查找
- 从
vld.dll
所在的目录查找 - 从注册表中查找(使用安装版本的vld有修改注册表)
如果以上目录都没有找到,就会使用默认的配置。
在项目中使用
- 项目中引入lib、头文件所在的目录,如果你的程序是win32的,需要使用win32相关的lib,不能混用
- 在程序main入口文件引入文件 #include "vld.h"
- 运行程序,当程序退出后,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的依赖的
但是在command line
里面就出现了这个依赖
设置依赖的地方在这里:
应用程序无法正常启动(0xc0150002)
如果程序运行起来时,出现:
这是因为缺少依赖项导致的,以下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随便跑一下,就给出了几百处内存泄露的地方,里面有重复的地方,但是大部分都是几个字节的泄露,甚至字符串常量也会被统计进去。