Qt 使用Visual Leak Detector(方式三)


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

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

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

2.1 复制 lib 库及头文件

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

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

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

1 HEADERS += \ 2 vld.h \ 3 vld_def.h 4 5 win32else 12 } 13 }

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

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

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

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

1 contains(QT_ARCH, x86_64)else

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

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

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

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

2.5 在 mainpp 文件中添加头文件

  在项目的 mainpp 文件中,添加头文件:

#include "vld.h"

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

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

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

1 Visual Leak Detector read settings fr: 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 fr: 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.DTfDHL.manifest、vld_x86.dll 和 vld_x86.pdb,64 位为 dbghelp.dll、Microsoft.DTfDHL.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 += mainpp 9 10 HEADERS += \ 11 vld.h \ 12 vld_def.h 13 14 win32else 21 } 22 } 23 24 contains(QT_ARCH, x86_64)else 29 30 TARGET_NAME = testVLD 31 CONFIG(debug, debug|release) d 33 } 34 TARGET = $$

4.2 主函数 mainpp 文件

1 // mianpp 2 3 #include <QCoreApplication> 4 #include "vld.h" 5 6 int main(int argc, char *argv[]) 7

4.3 示例工程目录结构

工程目录结构如下:

1 E:\Cworkspace\Qt 5.9.0\QtDemo\testVLD 2 │ mainpp 3 │ testVLD.pro 4 │ testVLD.pro.user 5 │ vld.h 6 │ vld_def.h 7 │ 8 ├─bin 9 │ ├─Win32 10 │ │ dbghelp.dll 11 │ │ Microsoft.DTfDHL.manifest 12 │ │ testVLDd.exe 13 │ │ testVLDd.ilk 14 │ │ testVLDd.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.DTfDHL.manifest 24 │ testVLDd.exe 25 │ testVLDd.ilk 26 │ testVLDd.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



上一篇:Modbus和Modbus/TCP协议

下一篇:Visual Studio2017报错 未能找到类型或命名空间名“DotNetOpenAuth”


Qt Visual Leak Detector
Copyright © 2002-2019 k262电脑网 www.k262.cn 皖ICP备2020016292号
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!QQ:251442993 热门搜索 网站地图