Windows下进行内存泄漏检测--VLD
程序员文章站
2022-06-01 14:36:18
...
Windows下的应用程序在做内存泄漏测试时,无需重新编译的检测工具很少,只有(DR. Memory, UMDH等)少数软件,而且提示较不明确。而VLD(Visual LeakDetector)虽然需要重新编译,但是仅需增加一个include文件,且仅在debug模式下工作,对项目影响较小,可以考虑。
Visual Leak Detector is a free, robust, open-source memory leak detection system for Visual C++.
下面说说VLD的特点:
1) 可以得到内存泄漏点的调用堆栈,如果可以的话,还可以得到其所在的文件及行号;
2) 可以得到泄漏内存的完整数据;
3) 可以设置内存泄漏报告的级别;
4) 它以动态库的形式提供,无需编译源代码,只需要很小的改动程序;
5) 源代码使用GNU许可发布,并有详细的文档及其注释
与VS自带的工具比较:The main difference between the CRT Debug Library and VLD, is that Visual Leak Detector shows you the complete callstack used for memory allocation has led to the leak.
分步指南
- 获取VLD
- 从项目官方网站获取:项目主页:http://vld.codeplex.com/
- 从Visual Studio的扩展和更新中,搜索VLD。可以找到Visual Leak Detector for Visual C++。
- 下载vld-2.5.1-setup.exe(当前的最新版)并安装,在安装过程中会出现
默认是全部勾选的,直接Next至Finish。和以前的版本不一样,vld会将自己配置在VS上,所以我们现在不用再对自己的项目进行进行对vld的include头文件和library库文件的添加配置,我们需要用的时候只需要添加头文件:#include “vld.h” 即可。 - 新建工程, 打开项目属性, 就可以看到: (如果是已有项目,需自行添加引用的vld头文件目录)
- 新建源文件,文件名随便起一个: *.cpp ,在源文件中引用“include "vld.h"”即可。
#ifdef _DEBUG
#include "vld.h"
#endif
- 选择Debug模式,运行:
- 结束程序后这样从debugger就可以知道程序中那里出现了内存泄漏了,上图我们可以看到问题出现在哪个文件以及哪一行。
- 如果不依赖IDE,则需要修改VLD的默认设置,让输出同时可以记录到文件中
-
修改vld安装目录下的vld.ini
vld配置文件ReportFile = memory_leak_report.txt
ReportTo = both
- 保证程序执行目录中同时保存有pdb文件
- 运行debug版程序后,同目录会生成vld输出文件,以供查看
注意:
1. 仅支持Visual Studio 2008-2015
2. VLD 内存检测工具,只能检测使用VC++编译器,不能用于检测MinGW编译器。所以如果使用跨平台的IDE如QT,请注意使用VLD时选择VC++编译器。
3. 仅工作在debug模式
4. 若程序包含多个dll,则每个dll都需要有至少一个C/C++文件包含 vld.h
5. QT可正常使用,暂未发现误报的问题
2. VLD 内存检测工具,只能检测使用VC++编译器,不能用于检测MinGW编译器。所以如果使用跨平台的IDE如QT,请注意使用VLD时选择VC++编译器。
3. 仅工作在debug模式
4. 若程序包含多个dll,则每个dll都需要有至少一个C/C++文件包含 vld.h
5. QT可正常使用,暂未发现误报的问题
下一篇: 各位大神,小弟问一个奇葩的问题