【Visual Leak Detector】在 QT 中使用 VLD(方式三)

来源:https://www.cnblogs.com/young520/archive/2023/03/22/17242116.html
-Advertisement-
Play Games

說明 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。 1. 使用前的準備 參考本人另一篇博客 安裝 Visual Leak Detector 下載 vld-2.5.1-setup.exe 並按步驟安裝 VLD。這一種使用方式的特點是,在一臺電腦上安裝完成後,將 VLD 安裝目錄下的 lib ...


說明

使用 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。安裝完成後,文件列表如下:

Oh Shit!-圖片走丟了-打個廣告-歡迎來博客園關註“木三百川”

需要用到的是 binincludelib 三個文件夾,以及 vld.ini 文件。下文示例項目所在路徑為 E:\Cworkspace\Qt 5.9.0\QtDemo\testVLD,項目路徑下的文件列表如下:

Oh Shit!-圖片走丟了-打個廣告-歡迎來博客園關註“木三百川”

2.1 複製 lib 庫及頭文件

拷貝 include 文件夾中的 vld.hvld_def.h 到項目路徑下,拷貝整個 lib 文件夾到項目路徑下,這兩步拷貝完成後,項目路徑下的文件列表如下:

Oh Shit!-圖片走丟了-打個廣告-歡迎來博客園關註“木三百川”

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.dllMicrosoft.DTfW.DHL.manifestvld_x86.dllvld_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,拷貝結果如下:

Oh Shit!-圖片走丟了-打個廣告-歡迎來博客園關註“木三百川”

64 位的做類似操作,拷貝 bin\Win64 文件夾中的四個文件 dbghelp.dllMicrosoft.DTfW.DHL.manifestvld_x64.dllvld_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,拷貝結果如下:

Oh Shit!-圖片走丟了-打個廣告-歡迎來博客園關註“木三百川”

更佳的做法是使用 DESTDIR 指令,實現 32 位、64 位在指定路徑下生成 exe,這樣可以將 exe 直接生成在對應的 Win32Win64 路徑下,而不需要將上述 4 個文件分別拷貝到對應的 debug 目錄。為實現這種效果,首先將整個 bin 文件拷貝到項目路徑下,拷貝完成後,項目路徑下的文件列表如下:

Oh Shit!-圖片走丟了-打個廣告-歡迎來博客園關註“木三百川”

在項目對應的 pro 文件中使用 DESTDIR 指令設置生成路徑,添加如下代碼:

contains(QT_ARCH, x86_64){
    DESTDIR = $$PWD/bin/Win64
}else{
    DESTDIR = $$PWD/bin/Win32
}

同時,為將 releasedebug 兩種版本區分出來,不至於在同一個文件夾中引起混亂,在 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\debugE:\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\Win32E:\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.dllMicrosoft.DTfW.DHL.manifestvld_x86.dllvld_x86.pdb,64 位為 dbghelp.dllMicrosoft.DTfW.DHL.manifestvld_x64.dllvld_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

Oh Shit!-圖片走丟了-打個廣告-歡迎來博客園關註“木三百川”

本文作者:木三百川

本文鏈接:https://www.cnblogs.com/young520/p/17242116.html

版權聲明:本文系博主原創文章,著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請附上出處鏈接。遵循 署名-非商業性使用-相同方式共用 4.0 國際版 (CC BY-NC-SA 4.0) 版權協議。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Swift 備忘清單 IT寶庫整理的Swift開發速查清單,該清單提供了使用 Swift 的示例,涵蓋 Swift 基礎知識、控制流、類型、結構/類、運算符、函數方法等。入門,為開發人員分享快速參考備忘單。 開發速查表大綱 入門 變數 類型註釋 算術運算符 字元串插值 多行字元串 代碼註釋 組成一個 ...
  • 本文介紹基於Python中ArcPy模塊,對大量柵格遙感影像文件進行批量掩膜與批量重採樣的操作。 首先,我們來明確一下本文的具體需求。現有一個存儲有大量.tif格式遙感影像的文件夾;且其中除了.tif格式的遙感影像文件外,還具有其它格式的文件。 我們希望,依據一個已知的面要素矢量圖層文件,對上述文件 ...
  • aliases: [] tags : " #QA #Java " summary: [POI生成Excel超出的單元格樣式的最大數量] author : [yaenli] notekey: [20230322-100908] 問題現象 使用Apache POI生成Excel時,如果創建的單元格樣式過 ...
  • Tomcat生命周期管理 各種組件如何統一管理 Tomcat的架構設計是清晰的、模塊化、它擁有很多組件,加入在啟動Tomcat時一個一個組件啟動,很容易遺漏組件,同時還會對後面的動態組件拓展帶來麻煩。如果採用我們傳統的方式的話,組件在啟動過程中如果發生異常,會很難管理,比如你的下一個組件調用了sta ...
  • Tcl語言線上運行編譯,是一款可線上編程編輯器,在編輯器上輸入Tcl語言代碼,點擊運行,可線上編譯運行Tcl語言,Tcl語言代碼線上運行調試,Tcl語言線上編譯,可快速線上測試您的Tcl語言代碼,線上編譯Tcl語言代碼發現是否存在錯誤,如果代碼測試通過,將會輸出編譯後的結果。 該線上工具由IT寶庫提 ...
  • 直入主題: Q1:為什麼要用分散式鎖? 在分散式系統中,多個進程或線程可能會同時訪問共用資源,這可能會導致數據不一致、併發性問題、性能下降等問題。為瞭解決這些問題,我們通常會使用分散式鎖來協調多個進程或線程對共用資源的訪問。 分散式鎖是一種協調機制,它通過在共用資源上設置鎖來防止多個進程或線程同時訪 ...
  • 一.註解 1. 註解入門 Annotation是從JDK5.0開始引入的新技術 Annotation的作用: 不是程式本身,可以對程式做出解釋(這一點和註釋(comment)沒什麼區別) 可以被其他程式(比如:編譯器等)讀取 Annotation的格式: 註解是以“@註解名”在代碼中存在的,還可以添 ...
  • 原文:blog.csdn.net/qunqunstyle99/article/details/94717256 ThreadLocal是什麼 ThreadLocal是一個本地線程副本變數工具類。主要用於將私有線程和該線程存放的副本對象做一個映射,各個線程之間的變數互不幹擾,在高併發場景下,可以實現無 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...