說明
使用 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
設定為啟動專案。
1.2 設定除錯程式
進入 vld 屬性頁 -> 配置屬性 -> 除錯 頁面。選擇 Debug
模式,選擇 本地 Windows 偵錯程式,根據自己需求設定除錯程式與除錯程式的啟動引數。點選確定。
這個 命令 就是指呼叫 vld.dll
的程式(被稱為除錯程式)所在路徑,我的是 E:\Cworkspace\VSDemo\testVLD\Debug\testVLD.exe
,如果這個除錯程式需要額外的引數,就把引數填寫在下一行 命令引數 中,沒有引數空著就好。
1.3 設定輸出目錄
進入 vld 屬性頁 -> 配置屬性 -> 常規 頁面。選擇 Debug
模式,根據自己需求設定輸出目錄。點選確定。
設定為除錯程式的同一級目錄,我的是 E:\Cworkspace\VSDemo\testVLD\Debug
,由於 vld_vs14.sln
的路徑為 E:\Cworkspace\VSDemo\vld-master
,因此這裡顯示為相對路徑。
1.4 複製 vld 依賴檔案
將 vld
安裝目錄中的 dbghelp.dll
與 Microsoft.DTfW.DHL.manifest
這兩個檔案複製至除錯程式的同一級目錄,我的是 E:\Cworkspace\VSDemo\testVLD\Debug
,要注意是 Win32
還是 x64
,拷對應的才行。
1.5 加斷點除錯
至此,就可以開始除錯了,不妨在 VisualLeakDetector
類的建構函式中加一個斷點,點選 本地 Windows 偵錯程式 開始除錯(或者按 F5
),程式成功停在了斷點處。
2. 注意事項
除錯時,有以下幾點需注意:
vld
原始碼生成的vld.dll
與除錯程式所引用的vld.dll
必須是同一路徑下的同一個檔案,這也是要重新設定vld
輸出目錄的原因。為確保除錯程式執行時能正確找到vld
生成的dll
,可以將vld
輸出目錄設定為除錯程式所在目錄,或者為Path
環境變數的某個目錄(例如 vld 安裝目錄的 bin 子目錄下)。vld
的依賴檔案dbghelp.dll
與Microsoft.DTfW.DHL.manifest
也應該放在除錯程式能找到的地方。- 平臺位數必須一致,
Win32
時都必須得是Win32
,x64
時都必須得是x64
。 - 除錯程式必須能找到它所依賴的其他環境(比如
xx.dll
)。特別是 QT 開發的除錯程式,其依賴的Qt DLL
比較多,直接執行時會提示缺失某某DLL
。 - 除錯程式與
DLL
都必須是Debug
版本。