【Visual Leak Detector】原始碼除錯 VLD 庫

木三百川發表於2023-05-07

說明

使用 VLD 記憶體洩漏檢測工具輔助開發時整理的學習筆記。本篇介紹 VLD 原始碼的除錯。同系列文章目錄可見 《記憶體洩漏檢測工具》目錄


1. VLD 庫原始碼除錯步驟

vld2.5.1 版本為例,下載原始碼 後,原始碼包中各檔案的用途可看本人另一篇部落格 【VLD】原始碼檔案概覽。使用 VLD 進行洩漏檢測時,有時候會出現突然崩潰、退出時沒有列印以下提示資訊等情況,此時就可以除錯一下 VLD 的原始碼,查一查是哪裡出了問題。

Visual Leak Detector is now exiting.

與其他 DLL 的除錯方法一樣,VLD 原始碼除錯遵循以下步驟(參考 MSDN - how-to-debug-from-a-dll-project)。

1.1 設定為啟動專案

使用 VS2015 開啟 vld_vs14.sln,將 vld 設定為啟動專案。

Oh Shit!-圖片走丟了-打個廣告-歡迎來部落格園關注“木三百川”

1.2 設定除錯程式

進入 vld 屬性頁 -> 配置屬性 -> 除錯 頁面。選擇 Debug 模式,選擇 本地 Windows 偵錯程式,根據自己需求設定除錯程式與除錯程式的啟動引數。點選確定。

Oh Shit!-圖片走丟了-打個廣告-歡迎來部落格園關注“木三百川”

這個 命令 就是指呼叫 vld.dll 的程式(被稱為除錯程式)所在路徑,我的是 E:\Cworkspace\VSDemo\testVLD\Debug\testVLD.exe,如果這個除錯程式需要額外的引數,就把引數填寫在下一行 命令引數 中,沒有引數空著就好。

Oh Shit!-圖片走丟了-打個廣告-歡迎來部落格園關注“木三百川”

1.3 設定輸出目錄

進入 vld 屬性頁 -> 配置屬性 -> 常規 頁面。選擇 Debug 模式,根據自己需求設定輸出目錄。點選確定。

Oh Shit!-圖片走丟了-打個廣告-歡迎來部落格園關注“木三百川”

設定為除錯程式的同一級目錄,我的是 E:\Cworkspace\VSDemo\testVLD\Debug,由於 vld_vs14.sln 的路徑為 E:\Cworkspace\VSDemo\vld-master,因此這裡顯示為相對路徑。

Oh Shit!-圖片走丟了-打個廣告-歡迎來部落格園關注“木三百川”

1.4 複製 vld 依賴檔案

vld 安裝目錄中的 dbghelp.dllMicrosoft.DTfW.DHL.manifest 這兩個檔案複製至除錯程式的同一級目錄,我的是 E:\Cworkspace\VSDemo\testVLD\Debug,要注意是 Win32 還是 x64,拷對應的才行。

Oh Shit!-圖片走丟了-打個廣告-歡迎來部落格園關注“木三百川”

1.5 加斷點除錯

至此,就可以開始除錯了,不妨在 VisualLeakDetector 類的建構函式中加一個斷點,點選 本地 Windows 偵錯程式 開始除錯(或者按 F5),程式成功停在了斷點處。

Oh Shit!-圖片走丟了-打個廣告-歡迎來部落格園關注“木三百川”

2. 注意事項

除錯時,有以下幾點需注意:

  • vld 原始碼生成的 vld.dll 與除錯程式所引用的 vld.dll 必須是同一路徑下的同一個檔案,這也是要重新設定 vld 輸出目錄的原因。為確保除錯程式執行時能正確找到 vld 生成的 dll,可以將 vld 輸出目錄設定為除錯程式所在目錄,或者Path 環境變數的某個目錄(例如 vld 安裝目錄的 bin 子目錄下)
  • vld 的依賴檔案 dbghelp.dllMicrosoft.DTfW.DHL.manifest 也應該放在除錯程式能找到的地方。
  • 平臺位數必須一致,Win32 時都必須得是 Win32x64 時都必須得是 x64
  • 除錯程式必須能找到它所依賴的其他環境(比如 xx.dll)。特別是 QT 開發的除錯程式,其依賴的 Qt DLL 比較多,直接執行時會提示缺失某某 DLL
  • 除錯程式與 DLL 都必須是 Debug 版本。

相關文章