首页 > 其他分享 >Qt 使用Visual Leak Detector(方式三)

Qt 使用Visual Leak Detector(方式三)

时间:2024-03-04 17:56:52浏览次数:26  
标签:bin Qt Leak VLD vld Visual debug testVLD

1. 使用前的准备
  参考本人另一篇博客 安装 Visual Leak Detector 下载 vld-2.5.1-setup.exe 并按步骤安装 VLD。这一种使用方式的特点是,在一台电脑上安装完成后,将 VLD 安装目录下的 lib 库及 include 文件拷贝到项目目录中,在项目 pro 文件中指明库及头文件的路径,并将 vld.ini 文件和 VLD 安装目录 bin 文件夹下的全部文件拷贝到项目生成目录下,最后在 mian.cpp 文件中 #include "vld.h"。优点是,当把项目拷贝到别的电脑上编译运行时,该电脑无需安装 VLD,也不需要更改任何代码。

2. 在 QT 中使用 VLD
  我的 VLD 安装目录为 D:\Program Files (x86)\Visual Leak Detector。安装完成后,文件列表如下:

  需要用到的是 bininclude 和 lib 三个文件夹,以及 vld.ini 文件。下文示例项目所在路径为 E:\Cworkspace\Qt 5.9.0\QtDemo\testVLD,项目路径下的文件列表如下:

2.1 复制 lib 库及头文件

  拷贝 include 文件夹中的 vld.h 及 vld_def.h 到项目路径下,拷贝整个 lib 文件夹到项目路径下,这两步拷贝完成后,项目路径下的文件列表如下:

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

  在项目对应的 pro 文件中添加 VLD 的头文件和 lib 库,pro 文件中添加如下代码:

 1 HEADERS += \
 2     vld.h \
 3     vld_def.h
 4 
 5 win32{
 6     CONFIG(debug, debug | release) {
 7         contains(QT_ARCH, x86_64){
 8             LIBS += -L$$PWD/lib/Win64 -lvld
 9         }else{
10             LIBS += -L$$PWD/lib/Win32 -lvld
11         }
12     }
13 }

2.3 配置 bin 文件夹下的依赖库
  拷贝 bin\Win32 文件夹中的四个文件 dbghelp.dll、Microsoft.DTfW.DHL.manifest、vld_x86.dll 和 vld_x86.pdb 到 32 位 MSVC 在 Debug 模式下的生成目录中,若不使用 DESTDIR 指令,但勾选 Shadow build ,默认的生成路径为 E:\Cworkspace\Qt 5.9.0\QtDemo\build-testVLD-Desktop_Qt_5_9_2_MSVC2015_32bit-Debug\debug,拷贝结果如下:

  64 位的做类似操作,拷贝 bin\Win64 文件夹中的四个文件 dbghelp.dll、Microsoft.DTfW.DHL.manifest、vld_x64.dll 和 vld_x64.pdb 到 64 位 MSVC 在 Debug 模式下的生成目录中,若不使用 DESTDIR 指令,但勾选 Shadow build ,默认的生成路径为 E:\Cworkspace\Qt 5.9.0\QtDemo\build-testVLD-Desktop_Qt_5_9_2_MSVC2015_64bit-Debug\debug,拷贝结果如下:

  更佳的做法是使用 DESTDIR 指令,实现 32 位、64 位在指定路径下生成 exe,这样可以将 exe 直接生成在对应的 Win32 和 Win64 路径下,而不需要将上述 4 个文件分别拷贝到对应的 debug 目录。为实现这种效果,首先将整个 bin 文件拷贝到项目路径下,拷贝完成后,项目路径下的文件列表如下:

  在项目对应的 pro 文件中使用 DESTDIR 指令设置生成路径,添加如下代码:

1 contains(QT_ARCH, x86_64){
2     DESTDIR = $$PWD/bin/Win64
3 }else{
4     DESTDIR = $$PWD/bin/Win32
5 }

  同时,为将 release 和 debug 两种版本区分出来,不至于在同一个文件夹中引起混乱,在 pro 文件中额为添加如下代码:

1 TARGET_NAME = testVLD
2 CONFIG(debug, debug|release) {
3     TARGET_NAME = $${TARGET_NAME}-d
4 }
5 TARGET = $${TARGET_NAME}

  这样设置之后,生成的 debug 版结果将比 release 版结果多一个 -d 后缀,便于区分。

2.4 复制 vld.ini 文件
  vld.ini 是 VLD 工具的配置文件,可以修改 vld.ini 内容以定制内存泄漏检测报告。没有该文件其实也能正常运行,但为了后续可定制,最好还是将 vld.ini 拷贝到生成目录下。比如在上一步中的 E:\Cworkspace\Qt 5.9.0\QtDemo\build-testVLD-Desktop_Qt_5_9_2_MSVC2015_32bit-Debug\debug 及 E:\Cworkspace\Qt 5.9.0\QtDemo\build-testVLD-Desktop_Qt_5_9_2_MSVC2015_64bit-Debug\debug,若在上一步中使用了 DESTDIR 指令,则生成目录变为 E:\Cworkspace\Qt 5.9.0\QtDemo\testVLD\bin\Win32 及 E:\Cworkspace\Qt 5.9.0\QtDemo\testVLD\bin\Win64。

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

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

#include "vld.h"

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

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

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

1 Visual Leak Detector read settings from: E:\Cworkspace\Qt 5.9.0\QtDemo\testVLD\bin\Win32\vld.ini
2 Visual Leak Detector Version 2.5.1 installed.
3 No memory leaks detected.
4 Visual Leak Detector is now exiting.

  需要注意的是,此时读取的配置文件 vld.ini 已经不是 VLD 安装路径下的那个了,从第一行可以看到具体路径。使用 64 位 MSVC 时的输出如下:

1 Visual Leak Detector read settings from: E:\Cworkspace\Qt 5.9.0\QtDemo\testVLD\bin\Win64\vld.ini
2 Visual Leak Detector Version 2.5.1 installed.
3 No memory leaks detected.
4 Visual Leak Detector is now exiting.

  因为使用了 DESTDIR 指令, 32 位和 64 位会在所指定的路径下生成,符合预期结果。

3. 无法正常使用的可能原因
按前述步骤进行配置后,就可以卸载已经安装的 VLD 工具了,到 VLD 安装路径下,双击 unins000.exe,弹窗点击“是(Y)” 按钮卸载 VLD,重新编译运行程序,仍可正常使用。当把项目拷贝到别的电脑上编译运行时,新电脑环境无需安装 VLD,也不需要更改任何代码。若无法正常使用,考虑以下可能的原因。

  • 检查编译器版本,VLD 无法在 minGW 下使用,只能使用 MSVC 编译器。
  • 检查是否是 Debug 模式,VLD 无法直接在 Release 模式下使用。
  • 检查文件的位数是否正确,32 bit /64 bit 不能混用。
  • 清除上一次的编译文件,重新编译运行一下。
  • 若路径中存在空格,添加库时一定要使用 $$quote() 将路径括起来,否则路径解析不正确。
  • 检查生成目录下是否包含有 VLD 的 4 个依赖文件,32 位为 dbghelp.dll、Microsoft.DTfW.DHL.manifest、vld_x86.dll 和 vld_x86.pdb,64 位为 dbghelp.dll、Microsoft.DTfW.DHL.manifest、vld_x64.dll 和 vld_x64.pdb 。

4. 示例源码

4.1 工程 .pro 文件

 1 # testVLD.pro
 2 
 3 QT -= gui
 4 
 5 CONFIG += c++11 console
 6 CONFIG -= app_bundle
 7 
 8 SOURCES += main.cpp
 9 
10 HEADERS += \
11     vld.h \
12     vld_def.h
13 
14 win32{
15     CONFIG(debug, debug | release) {
16         contains(QT_ARCH, x86_64){
17             LIBS += -L$$PWD/lib/Win64 -lvld
18         }else{
19             LIBS += -L$$PWD/lib/Win32 -lvld
20         }
21     }
22 }
23 
24 contains(QT_ARCH, x86_64){
25     DESTDIR = $$PWD/bin/Win64
26 }else{
27     DESTDIR = $$PWD/bin/Win32
28 }
29 
30 TARGET_NAME = testVLD
31 CONFIG(debug, debug|release) {
32     TARGET_NAME = $${TARGET_NAME}-d
33 }
34 TARGET = $${TARGET_NAME}

4.2 主函数 main.cpp 文件

 1 // mian.cpp
 2 
 3 #include <QCoreApplication>
 4 #include "vld.h"
 5 
 6 int main(int argc, char *argv[])
 7 {
 8     QCoreApplication a(argc, argv);
 9 
10     return a.exec();
11 }

4.3 示例工程目录结构

工程目录结构如下:

 1 E:\Cworkspace\Qt 5.9.0\QtDemo\testVLD
 2 │  main.cpp
 3 │  testVLD.pro
 4 │  testVLD.pro.user
 5 │  vld.h
 6 │  vld_def.h
 7 │
 8 ├─bin
 9 │  ├─Win32
10 │  │      dbghelp.dll
11 │  │      Microsoft.DTfW.DHL.manifest
12 │  │      testVLD-d.exe
13 │  │      testVLD-d.ilk
14 │  │      testVLD-d.pdb
15 │  │      testVLD.exe
16 │  │      testVLD.pdb
17 │  │      vld.ini
18 │  │      vld_x86.dll
19 │  │      vld_x86.pdb
20 │  │
21 │  └─Win64
22 │          dbghelp.dll
23 │          Microsoft.DTfW.DHL.manifest
24 │          testVLD-d.exe
25 │          testVLD-d.ilk
26 │          testVLD-d.pdb
27 │          testVLD.exe
28 │          testVLD.pdb
29 │          vld.ini
30 │          vld_x64.dll
31 │          vld_x64.pdb
32 │
33 └─lib
34     ├─Win32
35     │      vld.lib
36     │
37     └─Win64
38             vld.lib

标签:bin,Qt,Leak,VLD,vld,Visual,debug,testVLD
From: https://www.cnblogs.com/ybqjymy/p/18052313

相关文章

  • Qt 使用 Visual Leak Detector(方式一)
    1.使用前的准备参考本人另一篇博客安装VisualLeakDetector下载vld-2.5.1-setup.exe并按步骤安装VLD。这一种使用方式的缺点是,当把项目拷贝到别的电脑上编译运行时,需要按以下流程重新配置VLD环境。但优点是在一台电脑上配置完成后,用的时候十分方便,包含头文件就可以......
  • Qt MSVC使用内存泄露检测工具 VLD(Visual Leak Detector)
    一、简介VLD=VisualLeakDetector,是一款用于VisualC++的免费的内存泄露检测工具,官网 kinddragon.github.io, GitHub 。先说优点:为每个泄漏的块提供完整的堆栈跟踪,包括源文件和行号信息(如果可用)。检测大多数(如果不是全部)类型的进程内内存泄漏,包括基于COM的泄漏......
  • Visual Leak Detector 安装 VLD
    一.工具下载VisualLeakDetector官网下载地址:https://kinddragon.github.io/vld/,点击DownloadInstaller绿色按钮可下载工具的安装程序vld-2.5.1-setup.exe。也可去Git仓库releases界面下载安装程序vld-2.5.1-setup.exe。二.工具安装2.1Next2.2Iacceptt......
  • Visual Studio 性能探查器排查内存泄漏
    1、自用方法介绍【1】VS使用debug模式执行程序(注意:Release模式无法看到堆栈细节!)【2】截取内存快照2、别人方法介绍【1】首先用vsattach到进程,再点调试–窗口–显示诊断工具。注意:如果用调试–性能探测器去附加进程,则内存使用率这一项是灰的,无法勾选,但是......
  • Visual Studio 打开Qt项目
    一、下载QTVSTOOL插件1.1下载地址官方下载地址:Indexof/development_releases/vsaddin找到对应的VS版本下载1.2 安装先关闭VS,然后安装,在打开VS,就看到顶部有QTVSTOOLS 了1.3 添加路径QtOptions->Add->apth,找到你Qt安装的目录对应的如下文件夹Q......
  • Visual Leak Detector 简介
    1.工具简介VisualLeakDetector简称VLD,是Windows平台下用于C/C++代码内存泄漏检测的开源工具,使用起来比较简单,配置好环境后包含头文件,就可以在运行时自动检测是否存在内存泄漏,并在指定位置(控制台或者文本文件)输出检测报告。该工具最初由DanMoulding开发,但是后面2.......
  • 调整window下qt界面的缩放比例为自适应
    原因:QtCreator的缩放策略是四舍五入,只能缩放到1或2,而不是1.5,就比如系统缩放为150%,qt界面则会被缩放为200%解决办法:Linux下:exportQT_SCALE_FACTOR_ROUNDING_POLICY=PassThrough1.这行代码是环境变量设置的一部分,用于指定QT应用程序的缩放因子舍入策略。QT_SCALE_FACTOR......
  • JVisualVM连接远程服务器
    要使用JVisualVM连接远程服务器,你需要在远程服务器上配置JVM以允许JVisualVM进行远程连接,然后在本地JVisualVM中添加远程主机。以下是连接远程服务器的步骤:远程服务器配置配置JVM启动参数:在启动Java应用程序时,需要添加一些JVM参数来启用远程监控。例如,使用以下参数启动应用程......
  • QT安装指导
    Qt是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。QT有自带的编辑器QtCreator,但是我主要是C#开发者,习惯于使用VS,所以后面会使用VS开发QT。安装包下载地址:https://download.qt.io/archive/online_installers/我使用了最新版本 安装......
  • Qt表格排序例子
    表格排序是Qt内建支持的,用起来很简单。只需要在QtCreator界面给QTableView或QTableWidget的SortingEnabled属性设置为true就行了。本文将对这两种控件分别展示一下效果和一个自定义的排序例子。一、QTableWidget这个不需要任何代码,只需要设计界面时候启用排序就行了。下面直接......