Visual Leak Detector在 VS 2015 中使用 VLD

Posted 木三百川

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Visual Leak Detector在 VS 2015 中使用 VLD相关的知识,希望对你有一定的参考价值。

使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍在 VS 2015 中使用 VLD。

说明

使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍在 VS 2015 中使用 VLD。同系列文章目录可见 《内存泄漏检测工具》目录


1. 使用前的准备

参考本人另一篇博客 安装 Visual Leak Detector 下载 vld-2.5.1-setup.exe 并按步骤安装 VLD。注意配置环境的时候一定要把三个选项都打上勾,在一台电脑上配置完成后,用的时候十分方便,包含头文件就可以使用,不需添加任何多余的代码。

3. 在 VS 2015 中使用 VLD

在项目的 main.cpp 文件中,添加头文件:

#include <vld.h>

选择 x86 或者 x64 编译器,选择 Debug 模式,编译运行,就可以正常使用了。我的 VS 版本是 Microsoft Visual Studio Professional 2015,VLD 安装目录为 D:\\Program Files (x86)\\Visual Leak Detector

3.1 无内存泄漏时的输出报告

程序运行结束后,若没有检测到内存泄漏,VLD 会输出以下 4 行报告:

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.

3.2 有内存泄漏时的输出报告

程序运行结束后,若检测到内存泄漏,VLD 会输出以下报告(本例中出现一处内存泄漏,使用 x86 编译器):

Visual Leak Detector read settings from: D:\\Program Files (x86)\\Visual Leak Detector\\vld.ini
Visual Leak Detector Version 2.5.1 installed.
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x008D8980: 20 bytes ----------
  Leak Hash: 0xC3828EE7, Count: 1, Total 20 bytes
  Call Stack (TID 12948):
    f:\\dd\\vctools\\crt\\vcstartup\\src\\heap\\new_array.cpp (15): testVLD.exe!operator new[]() + 0x9 bytes
    e:\\cworkspace\\vsdemo\\testvld\\testvld\\main.cpp (8): testVLD.exe!main() + 0x7 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!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD                                                  ........ ........


Visual Leak Detector detected 1 memory leak (56 bytes).
Largest number used: 56 bytes.
Total allocations: 56 bytes.
Visual Leak Detector is now exiting.

若使用的是 x64 编译器,报告输出如下:

Visual Leak Detector read settings from: D:\\Program Files (x86)\\Visual Leak Detector\\vld.ini
Visual Leak Detector Version 2.5.1 installed.
“testVLD.exe”(Win32): 已加载“C:\\Windows\\System32\\kernel.appcore.dll”。已加载符号。
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x00000000650C6AD0: 20 bytes ----------
  Leak Hash: 0x72624394, Count: 1, Total 20 bytes
  Call Stack (TID 12984):
    f:\\dd\\vctools\\crt\\vcstartup\\src\\heap\\new_array.cpp (16): testVLD.exe!operator new[]()
    e:\\cworkspace\\vsdemo\\testvld\\testvld\\main.cpp (8): testVLD.exe!main() + 0xA bytes
    f:\\dd\\vctools\\crt\\vcstartup\\src\\startup\\exe_common.inl (75): testVLD.exe!invoke_main()
    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() + 0x14 bytes
    ntdll.dll!RtlUserThreadStart() + 0x21 bytes
  Data:
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD                                                  ........ ........


Visual Leak Detector detected 1 memory leak (72 bytes).
Largest number used: 72 bytes.
Total allocations: 72 bytes.
Visual Leak Detector is now exiting.

4. 无法正常使用的可能原因

  • 检查是否是 Debug 模式,VLD 无法直接在 Release 模式下使用。
  • 检查环境变量是否正确配置,环境变量是 VLD 安装程序自动配置的,但是若在安装时没有勾选自动配置,会导致环境变量缺失,查看 Path 这一系统变量中是否添加了 VLD 的 bin 路径(我的是 D:\\Program Files (x86)\\Visual Leak Detector\\bin\\Win32D:\\Program Files (x86)\\Visual Leak Detector\\bin\\Win64 这两个)。
  • 在 VLD 安装成功后,是否已经重启了 VS,因为要加载 VLD 安装时新添的环境变量,若没重启 VS,可能找不到 VLD 的依赖环境。
  • 检查 includelib 目录是否被正确添加,这一步也是 VLD 安装程序自动进行的,打开项目属性页,点击 C/C++ -> 常规 -> 附加包含目录 查看是否添加了 VLD 的 include 目录(我的是 D:\\Program Files (x86)\\Visual Leak Detector\\include),然后点击 链接器 -> 常规 -> 附加库目录 查看是否添加了 VLD 的 lib 目录(在我电脑上,使用 x86 编译器时是 D:\\Program Files (x86)\\Visual Leak Detector\\lib\\Win32,使用 x64 编译器时是 D:\\Program Files (x86)\\Visual Leak Detector\\lib\\Win64)。
  • 清除上一次的编译文件,重新编译运行一下。

Visual Leak Detector配置项 VLD

使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 配置文件中配置项 VLD 的使用方法。

说明

使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 配置文件中配置项 VLD 的使用方法。


1. 配置文件使用说明

在程序中通过 #include "vld.h" 的方式检测内存泄漏时,VLD 首先会尝试在程序的生成目录下读取 vld.ini 文件,若未读取成功,则会尝试在 VLD 的安装目录下读取 vld.ini 文件,若仍未读取成功,则会使用内置的默认配置,内置的默认配置如果不动源码是无法更改的,因此通过修改相应目录下的 vld.ini 文件来定制 VLD 功能是最好的选择。当配置参数等号右边为空,或者给配置了不合法值时,在使用过程中会被程序重置到默认值。

2. 设置 VLD 的开启与关闭

参数名VLD

有效赋值onoff

默认值on

功能说明:为 on 时泄漏检测功能正常开启;为 off 时所有功能都被关闭。

2.1 测试代码

#include <QCoreApplication>
#include "vld.h"

void testFun(int i)

    int *ptr = new int(i);
    printf("ptr = %08x, *ptr = %08x.\\n", ptr, *ptr);


int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);

    testFun(1);

    return a.exec();

测试环境:QT 5.9.2MSVC 2015 32bitDebug 模式,VLD 版本为 2.5.1,VLD 配置文件只对该参数做修改,测试工程所在路径为:E:\\Cworkspace\\Qt 5.9\\QtDemo\\testVLD

2.2 VLD = on 时的输出

标准输出窗显示:

ptr = 0156a3e0, *ptr = 00000001.

VLD 输出报告:

Visual Leak Detector read settings from: D:\\Program Files (x86)\\Visual Leak Detector\\vld.ini
Visual Leak Detector Version 2.5.1 installed.
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x0156A3E0: 4 bytes ----------
  Leak Hash: 0x6B0F8BDF, Count: 1, Total 4 bytes
  Call Stack (TID 33296):
    ucrtbased.dll!malloc()
    f:\\dd\\vctools\\crt\\vcstartup\\src\\heap\\new_scalar.cpp (19): testVLD.exe!operator new() + 0x9 bytes
    e:\\cworkspace\\qt 5.9\\qtdemo\\testvld\\main.cpp (6): testVLD.exe!testFun() + 0x7 bytes
    e:\\cworkspace\\qt 5.9\\qtdemo\\testvld\\main.cpp (14): testVLD.exe!main() + 0x7 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                                                  ........ ........


Visual Leak Detector detected 1 memory leak (40 bytes).
Largest number used: 40 bytes.
Total allocations: 40 bytes.
Visual Leak Detector is now exiting.

2.3 VLD = off 时的输出

标准输出窗显示:

ptr = 014b1db0, *ptr = 00000001.

VLD 输出报告:

Visual Leak Detector read settings from: D:\\Program Files (x86)\\Visual Leak Detector\\vld.ini
Visual Leak Detector is turned off.

2.4 输出结果对比

  • VLD = on 时泄漏检测功能正常开启。
  • VLD = off 时所有功能都被关闭。

以上是关于Visual Leak Detector在 VS 2015 中使用 VLD的主要内容,如果未能解决你的问题,请参考以下文章

Visual Leak Detector 不适用于 VS2012 中的单元测试

在VS2017中配置VLD(Visual Leak Detector)内存泄漏检测工具

Visual Leak Detector使用注意事项

Visual Leak Detector配置项 SkipCrtStartupLeaks

Visual Leak Detector简介

Visual Leak Detector 2 2 3 Visual C++内存检测工具