【Visual Leak Detector】在 QT 中使用 VLD(方式三)
说明
使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。
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。安装完成后,文件列表如下:

需要用到的是 bin、include 和 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 文件中添加如下代码:
HEADERS += \
vld.h \
vld_def.h
win32{
CONFIG(debug, debug | release) {
contains(QT_ARCH, x86_64){
LIBS += -L$$PWD/lib/Win64 -lvld
}else{
LIBS += -L$$PWD/lib/Win32 -lvld
}
}
}
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 指令设置生成路径,添加如下代码:
contains(QT_ARCH, x86_64){
DESTDIR = $$PWD/bin/Win64
}else{
DESTDIR = $$PWD/bin/Win32
}
同时,为将 release 和 debug 两种版本区分出来,不至于在同一个文件夹中引起混乱,在 pro 文件中额为添加如下代码:
TARGET_NAME = testVLD
CONFIG(debug, debug|release) {
TARGET_NAME = $${TARGET_NAME}-d
}
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 行报告:
Visual Leak Detector read settings from: E:\Cworkspace\Qt 5.9.0\QtDemo\testVLD\bin\Win32\vld.ini
Visual Leak Detector Version 2.5.1 installed.
No memory leaks detected.
Visual Leak Detector is now exiting.
需要注意的是,此时读取的配置文件 vld.ini 已经不是 VLD 安装路径下的那个了,从第一行可以看到具体路径。使用 64 位 MSVC 时的输出如下:
Visual Leak Detector read settings from: E:\Cworkspace\Qt 5.9.0\QtDemo\testVLD\bin\Win64\vld.ini
Visual Leak Detector Version 2.5.1 installed.
No memory leaks detected.
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 文件
# testVLD.pro
QT -= gui
CONFIG += c++11 console
CONFIG -= app_bundle
SOURCES += main.cpp
HEADERS += \
vld.h \
vld_def.h
win32{
CONFIG(debug, debug | release) {
contains(QT_ARCH, x86_64){
LIBS += -L$$PWD/lib/Win64 -lvld
}else{
LIBS += -L$$PWD/lib/Win32 -lvld
}
}
}
contains(QT_ARCH, x86_64){
DESTDIR = $$PWD/bin/Win64
}else{
DESTDIR = $$PWD/bin/Win32
}
TARGET_NAME = testVLD
CONFIG(debug, debug|release) {
TARGET_NAME = $${TARGET_NAME}-d
}
TARGET = $${TARGET_NAME}
4.2 主函数 main.cpp 文件
// mian.cpp
#include <QCoreApplication>
#include "vld.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
return a.exec();
}
4.3 示例工程目录结构
工程目录结构如下:
E:\Cworkspace\Qt 5.9.0\QtDemo\testVLD
│ main.cpp
│ testVLD.pro
│ testVLD.pro.user
│ vld.h
│ vld_def.h
│
├─bin
│ ├─Win32
│ │ dbghelp.dll
│ │ Microsoft.DTfW.DHL.manifest
│ │ testVLD-d.exe
│ │ testVLD-d.ilk
│ │ testVLD-d.pdb
│ │ testVLD.exe
│ │ testVLD.pdb
│ │ vld.ini
│ │ vld_x86.dll
│ │ vld_x86.pdb
│ │
│ └─Win64
│ dbghelp.dll
│ Microsoft.DTfW.DHL.manifest
│ testVLD-d.exe
│ testVLD-d.ilk
│ testVLD-d.pdb
│ testVLD.exe
│ testVLD.pdb
│ vld.ini
│ vld_x64.dll
│ vld_x64.pdb
│
└─lib
├─Win32
│ vld.lib
│
└─Win64
vld.lib

【Visual Leak Detector】在 QT 中使用 VLD(方式三)的更多相关文章
- Cocos开发中性能优化工具介绍之Visual Studio内存泄漏检测工具——Visual Leak Detector
那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能,我们可以使用第三方工具Visual Leak Detector(以下简 ...
- vld(Visual Leak Detector) 内存泄露检测工具
初识Visual Leak Detector 灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题.当程序越来越复 杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题.内存 ...
- VS2017 编译 Visual Leak Detector + VLD 使用示例
起因 一个Qt5+VS2017的工程,需要进行串口操作,在自动时发现一段时间软件崩溃了,没有保存log,在 debug 的时候发现每运行一次应用占据的内存就多一点,后来意识到是内存泄漏了.这个真是头疼 ...
- 使用Visual Leak Detector for Visual C++ 捕捉内存泄露
什么是内存泄漏? 内存泄漏(memory leak),指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况.内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段 ...
- 使用Visual Leak Detector检测内存泄漏[转]
1.初识Visual Leak Detector 灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题.当程序越来越复杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题 ...
- Cocos性能优化工具的开发介绍Visual Studio内存泄漏检测工具——Visual Leak Detector
然后,Windows下有什么好的内存泄漏检測工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检測功能.我们能够使用第三方工具Visual Leak Detector(下面简 ...
- VisualStudio 怎么使用Visual Leak Detector
VisualStudio 怎么使用Visual Leak Detector 那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测 ...
- Visual Leak Detector原理剖析
认识VLD VLD(Visual Leak Detector)是一款用于Visual C++的开源内存泄漏检测工具,我们只需要在被检测内存泄漏的工程代码里#include “vld.h”就可以开启内存 ...
- 关于Visual Leak Detector的配置与使用 (测试vector 引起的内存泄漏问题)
之前在做一个音频特征提取的批量处理程序,老是出现内存泄露问题,用Visual Leak Detector(VLD)工具做了下检测,检测出了一些问题,解决后还是会有问题.之后继续排查,因为我的代码中,大 ...
- Visual Leak Detector 2.2.3 Visual C++内存检测工具
Visual Leak Detector是一款免费的.健全的.开源的Visual C++内存泄露检测系统.相比Visual C++自带的内存检测机制,Visual Leak Detector可以显 ...
随机推荐
- 【STM32】细说TIM的Channels与应用
寄存器层 1.TIM_Base_Set初始化常用: CR1:TIM control reg 1 该寄存器内容决定定时器计数模式CounterMode.分频比ClockDivision和 ...
- SpringBoot项目启动
SpringBoot项目与其他项目启动方式有些不同. 查看是否是SpringBoot项目,可以查看在项目的pom.xml中是否有引入SpringBoot: 上图中就是对应的spring-boot.若有 ...
- SpringMVC-nfjh
SpringMVC springmvc项目创建 1.使用maven创建web项目结构 2.补充更改结构 3.springmvc-config.xml 1)添加包扫描(context命名空间) 2)添加 ...
- 20202411 2020-2021-2 《Python程序设计》实验三报告
20202411 2020-2021-2 <Python程序设计>实验三报告 课程:<Python程序设计> 班级: 2024 姓名: 陈书桓 学号:20202411 实验教师 ...
- 3Com-OfficeConnect-Wireless-11宽带路由器默认口令
网络空间资产搜索: app="3Com-OfficeConnect-Wireless-11g-Cable/DSL-Router" 找到环境 账户密码 admin/a***n End ...
- dos命令初学
DOS命令 打开DOS命令方式 开始+系统+命令提示符 WIN键盘+R 输入CMD 打开控制台(推荐使用) 在任意文件夹下面,按住shift键加鼠标右键点击,在此处打开命令行窗口 自愿管理器的地址栏前 ...
- HTTP请求向服务器传参方式
请求HttpRequest 提示: 用户发送请求时携带的参数后端需要使用,而不同的发送参数的方式对应了不同的提取参数的方式 所以要学会如何提取参数,我们就需要先了解前端传参数有哪些方式 回想一下,利用 ...
- 20200923--计算鞍点(奥赛一本通P91 4)
给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点.鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值. 例如:在下面的例子中(第4行第1列的元素就是鞍 ...
- 三,打包electron
1,在当前项目下运行 npm install --save-dev @electron-forge/cli npx electron-forge import 此时package.json内容如下: ...
- git commit --amend适用场景详解
适用场景: 场景1.本地开发代码已提交,提交后发现这次提交的代码有问题,或者漏提交了一些文件,此时,希望达到以下目的: ①修改有问题的代码. ②补足漏提交的文件(一般是新增的文件没有git add . ...