说明
使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 配置文件中配置项 ForceIncludeModules 的使用方法。 同系列文章目录可见 《内存泄漏检测工具》目录
1. 配置文件使用说明
在程序中通过 #include "vld.h"
的方式检测内存泄漏时,VLD 首先会尝试在程序的生成目录下读取 vld.ini
文件,若未读取成功,则会尝试在 VLD 的安装目录下读取 vld.ini
文件,若仍未读取成功,则会使用内置的默认配置,内置的默认配置如果不动源码是无法更改的,因此通过修改相应目录下的 vld.ini
文件来定制 VLD 功能是最好的选择。当配置参数等号右边为空,或者给配置了不合法值时,在使用过程中会被程序重置到默认值。
2. 设置需要检测的第三方模块
参数名:ForceIncludeModules
。
有效赋值:包含模块名的列表。
默认值:无。
功能说明:当需要对第三方模块(exe
、lib
、dll
)进行内存泄漏检测,但又没法在这些模块的源码中 #include "vld.h"
时,可以在等号右边列出这些模块的名称,模块之间可使用任意分隔符,甚至不分隔也可以,但为了便于阅读,通常使用空格、;
或 ,
来进行分隔。需要注意的是,这个功能开启后程序有崩溃的风险,有时候还会输出错误的内存泄漏报告。
2.1 测试代码
#include <QCoreApplication>
#include "vld.h"
#include "testdll1.h"
#include "testdll2.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
TestDll1 aaa;
aaa.testFun(1);
TestDll2 bbb;
bbb.testFun(2);
return a.exec();
}
测试环境:QT 5.9.2,MSVC 2015 32bit,Debug 模式,VLD 版本为 2.5.1,VLD 配置文件只对该参数做修改,测试工程所在路径为:E:\Cworkspace\Qt 5.9\QtDemo\testVLD
。其中的 testdll1
与 testdll2
是为了测试而打包的库,两个库里的函数都存在内存泄漏。
2.2 ForceIncludeModules 为空时的输出
标准输出窗显示:
testDLL1 ptr = 00840bc0, *ptr = 00000001.
testDLL2 ptr = 00840b90, *ptr = 00000002.
VLD 输出报告:
Visual Leak Detector read settings from: D:\Program Files (x86)\Visual Leak Detector\vld.ini
Visual Leak Detector Version 2.5.1 installed.
No memory leaks detected.
Visual Leak Detector is now exiting.
2.3 ForceIncludeModules = 指定库时的输出
以下 ForceIncludeModules
配置的效果相同:
ForceIncludeModules = testDll1.dll;testDll2.dll // 使用英文分号做分隔符
ForceIncludeModules = testDll1.dll,testDll2.dll // 使用英文逗号做分隔符
ForceIncludeModules = testDll1.dll testDll2.dll // 使用空格做分隔符
ForceIncludeModules = testDll1.dll/testDll2.dll // 使用斜杠做分隔符
ForceIncludeModules = testDll1.dll-testDll2.dll // 使用减号做分隔符
ForceIncludeModules = testDll1.dlltestDll2.dll // 不使用任何分隔符
ForceIncludeModules = testDll1.dllabcdefghtestDll2.dll // 使用字符串abcdefgh做分隔符
ForceIncludeModules = testDll1.dll++++++testDll2.dll // 使用字符串++++++做分隔符
标准输出窗显示:
testDLL1 ptr = 00e070f8, *ptr = 00000001.
testDLL2 ptr = 00e072a8, *ptr = 00000002.
VLD 输出报告:
Visual Leak Detector read settings from: D:\Program Files (x86)\Visual Leak Detector\vld.ini
Visual Leak Detector Version 2.5.1 installed.
Forcing inclusion of these modules in leak detection: testdll1.dll;testdll2.dll
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x00E070F8: 4 bytes ----------
Leak Hash: 0x8BB01C20, Count: 1, Total 4 bytes
Call Stack (TID 14012):
ucrtbased.dll!malloc()
f:\dd\vctools\crt\vcstartup\src\heap\new_scalar.cpp (19): testDll1.dll!operator new() + 0x9 bytes
e:\cworkspace\qt 5.9\qtdemo\testdll1\testdll1.cpp (10): testDll1.dll!TestDll1::testFun() + 0x7 bytes
e:\cworkspace\qt 5.9\qtdemo\testvld\main.cpp (11): testVLD.exe!main() + 0xB bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (74): testVLD.exe!invoke_main() + 0x1B bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (264): testVLD.exe!__scrt_common_main_seh() + 0x5 bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (309): testVLD.exe!__scrt_common_main()
f:\dd\vctools\crt\vcstartup\src\startup\exe_main.cpp (17): testVLD.exe!mainCRTStartup()
KERNEL32.DLL!BaseThreadInitThunk() + 0x19 bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0x11E bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xEE bytes
Data:
01 00 00 00 ........ ........
---------- Block 2 at 0x00E072A8: 4 bytes ----------
Leak Hash: 0x08AA1CDB, Count: 1, Total 4 bytes
Call Stack (TID 14012):
ucrtbased.dll!malloc()
f:\dd\vctools\crt\vcstartup\src\heap\new_scalar.cpp (19): testDll2.dll!operator new() + 0x9 bytes
e:\cworkspace\qt 5.9\qtdemo\testdll2\testdll2.cpp (10): testDll2.dll!TestDll2::testFun() + 0x7 bytes
e:\cworkspace\qt 5.9\qtdemo\testvld\main.cpp (14): testVLD.exe!main() + 0xB bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (74): testVLD.exe!invoke_main() + 0x1B bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (264): testVLD.exe!__scrt_common_main_seh() + 0x5 bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (309): testVLD.exe!__scrt_common_main()
f:\dd\vctools\crt\vcstartup\src\startup\exe_main.cpp (17): testVLD.exe!mainCRTStartup()
KERNEL32.DLL!BaseThreadInitThunk() + 0x19 bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0x11E bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xEE bytes
Data:
02 00 00 00 ........ ........
Visual Leak Detector detected 2 memory leaks (80 bytes).
Largest number used: 80 bytes.
Total allocations: 80 bytes.
Visual Leak Detector is now exiting.
2.4 输出结果对比
- 当
ForceIncludeModules
为空时,没有检测出动态库里的内存泄漏。 - 当
ForceIncludeModules
指定了库testDll1.dll
与testDll2.dll
时,成功检测到了动态库里的内存泄漏,并指出了文件和行号等信息。
- ForceIncludeModulesmd Detector Visual Leakforceincludemodulesmd detector visual leak detector visual leak vld detector方式visual leak skipheapfreeleaks detector visual leak 源码detector visual leak detector visual leak 2015 skipcrtstartupleaks detector visual leak stackwalkmethod detector visual leak detector版本visual leak traceinternalframes detector visual leak