Visual Leak Detector在 QT 中使用 VLD(方式二)

Posted 木三百川

tags:

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

使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。介绍在 QT 中使用 VLD 的方式之一。

说明

使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。


1. 使用前的准备

参考本人另一篇博客 安装 Visual Leak Detector 下载 vld-2.5.1-setup.exe 并按步骤安装 VLD。这一种使用方式的特点是,在一台电脑上安装完成后,需在项目 pro 文件中指明库及头文件的路径,然后在 mian.cpp 文件中 #include "vld.h"。当把项目拷贝到别的电脑上编译运行时,需要确保该电脑已经使用 vld-2.5.1-setup.exe 安装了 VLD,并更改项目 pro 文件中指明的相关路径。

2. 在 QT 中使用 VLD

我的 VLD 安装目录为 D:\\Program Files (x86)\\Visual Leak Detector

2.1 在项目 .pro 文件中指明路径

在项目对应的 pro 文件中指明 VLD 的 include 目录和 lib 文件,pro 文件中添加如下代码:

win32
    INCLUDEPATH += $$quote(D:\\Program Files (x86)\\Visual Leak Detector\\include)
    DEPENDPATH += $$quote(D:\\Program Files (x86)\\Visual Leak Detector\\include)

    CONFIG(debug, debug | release) 
        contains(QT_ARCH, x86_64)
            LIBS += -L$$quote(D:\\Program Files (x86)\\Visual Leak Detector\\lib\\Win64) -lvld
        else
            LIBS += -L$$quote(D:\\Program Files (x86)\\Visual Leak Detector\\lib\\Win32) -lvld
        
    

2.2 在 main.cpp 文件中添加头文件

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

#include "vld.h"

选择 MSVC 32bit 或者 MSVC 64bit 编译器,选择 Debug 模式,编译运行,就可以正常使用了。

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

程序运行结束后,若没有检测到内存泄漏,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.

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

程序运行结束后,若检测到内存泄漏,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 0x00000000977910B0: 20 bytes ----------
  Leak Hash: 0x0A94032F, Count: 1, Total 20 bytes
  Call Stack (TID 12424):
    ucrtbased.dll!malloc()
    f:\\dd\\vctools\\crt\\vcstartup\\src\\heap\\new_array.cpp (16): testVLD.exe!operator new[]()
    e:\\cworkspace\\qt 5.9.0\\qtdemo\\testvld\\main.cpp (12): 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.

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

  • 检查编译器版本,VLD 无法在 minGW 下使用,只能使用 MSVC 编译器。
  • 检查是否是 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 安装成功后,是否已经重启了 QT,因为要加载 VLD 安装时新添的环境变量,若没重启 QT,可能找不到 VLD 的依赖环境。
  • 清除上一次的编译文件,重新编译运行一下。
  • 若路径中存在空格,添加库时一定要使用 $$quote() 将路径括起来,否则路径解析不正确,例如上面写的 INCLUDEPATH += $$quote(D:\\Program Files (x86)\\Visual Leak Detector\\include)

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

Visual Leak Detector在 QT 中使用 VLD(方式一)

Visual Leak Detector 内存泄露检测,该怎么处理

Visual Leak Detector使用注意事项

Visual Leak Detector配置项 SkipCrtStartupLeaks

Visual Leak Detector简介

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