Visual Leak Detector是一款用於Visual C++的內存泄露檢測工具,是個開源項目。相比較其它的內存泄露檢測工具(如Purify, BoundsChecker等),它具有如下特點:
1、 免費
2、 可以得到內存泄漏點的調用堆棧,及其所在文件及行號;
3、 可以得到泄露內存的完整數據;
4、 可以靈活配置程序內的dll是否做檢測;
5、 可以設置內存泄露報告的級別;
6、 它是一個dll或lib,使用極其簡便;
7、 它的源代碼使用GNU許可發佈,並有詳盡的文檔及註釋。對於想深入瞭解堆內存管理的讀者,是一個不錯的選擇。
使用方法:
VLD支持VC6,VS2003~2010,且使用非常方便,安裝完vld-2.1-setup.exe後,在Visual C++的IDE環境下,配置完lib和include的路徑;在程序中,只需在任何一個cpp文件里加入include <vld.h>一次即可(必須放到stdafx.h後面),且可通過安裝目錄下的vld.in文件,靈活配置是否檢測該程序加載的其他dll模塊、最大內存泄漏數據字節、結果輸出文件等等高級配置。
該工具只在debug運行過程中有效,Release時完全不用考慮頭文件包含的問題。
在debug編譯的程序運行結束時,如有內存泄漏,會有Outputdebug輸出檢測的堆棧信息,如果是在VS的debug調試狀態下,雙擊堆棧行,可以直接跳轉到對應的文件及行數。非常方便。
檢測示例:
2.1版本支持了64位開發環境的檢測及VS2010。
更多介紹見http://vld.codeplex.com/documentation
工作原理:
VLD加載後,會使用allocation hooks鉤子,通過hookfree()和hookmalloc()這兩個函數監視進程的每堆內存分配和釋放情況,且在每次內存分配時將其上下文記錄下來,當程序退出時,先檢查分配和釋放的對應記錄,如果有分配過的記錄沒有對應的釋放記錄,肯定有內存泄漏了,對於檢測到的內存泄漏,查找其記錄下來的上下文信息,並將其轉換成報告輸出。有興趣的話可以閱讀Visual Leak Detector的源代碼。
總結:
在使用上,Visual Leak Detector簡單方便,結果報告一目瞭然。在原理上,Visual Leak Detector針對內存泄漏問題的特點,可謂對症下藥——內存泄漏不是不容易發現嗎?那就每次內存分配是都給記錄下來,程序退出時算總賬;內存泄漏現象,出現時不是時過境遷,並非當時泄漏點的現場了嗎?那就把現場也記錄下來,清清楚楚的告訴使用者那塊泄漏的內存就是在如何一個調用過程中泄漏掉的。
附:
該工具是由Dan Moulding創建的,2006年11月的1.9d版本以後沒有再更新,目前由Arkadiy Shapkin維護,最新版本的爲2011年6月發佈的2.2版本。
2.0以上版本項目網址:http://vld.codeplex.com/
1.9及以下項目網址:http://www.codeproject.com/KB/applications/visualleakdetector.aspx
工具安裝包見附件。