Visual Leak Detector源於Code Project:Visual Leak Detector - Enhanced Memory Leak Detection for Visual C++, 安裝包能夠到 這裏 下載。html
使用很簡單,基本上安裝完了就之能夠直接用, 具體能夠參考 這篇windows
關於對象句柄泄露, 主要分GDI對象,Kernel對象,User對象:工具
GDI對象只在本進程有效,主要是指Brush, Pen,DC等, 具體能夠參考 這裏spa
User對象只在同一Session內有效,同一user對象在不一樣進程內值都相等,能夠跨進程使用, 主要是指Menu, window, cursor, hook等,具體能夠參考 這裏.net
Kernel對象能夠跨進程使用, 可是由於每一個進程都有本身的內核對象表,因此同一對象的句柄值在不一樣進程裏會不相等(儘管最終指向同一個內核對象),主要是指各種HANDLE,具體能夠參考 這裏code
對於對象句柄泄露,免費來講沒有太好的工具能夠直接使用, 不少時候咱們能夠直接經過任務管理器來觀察各種對象的個數, 若是有持續增加, 則說明有泄露存在。不少時候GDI泄露是大頭,咱們要判斷哪類GDI對象正在泄露,能夠考慮使用工具GDIView。(對於對象句柄泄露,誰有好的工具,能夠提示下。)orm
對於內核對象泄露,咱們能夠考慮使用WinDbg的 !htrace 命令, 使用很簡單:經過 !htrace -enable 命令打開棧回溯, 而後經過 !htrace -snapshot 命令保存一個當前全部句柄的快照, 最後再經過 -htrace -diff 命令獲取全部前面保存快照後打開但沒有關閉的句柄對象。htm
若是公司有錢,能夠考慮購買Boudcheck, 這個工具很是強大,能夠幫咱們快速的檢測出各種內存和對象泄露,包括API的參數錯誤等。思考Boundcheck的實現原理,實際上並不複雜,主要就是API Hook, 大概過程以下:對象
(1) 將注入對方進程blog
(2) 經過API Hook替代系統資源分配和釋放相關的API, 而且記錄調用棧
(3)最後檢測沒有釋放的資源, 生成報表
這裏有篇文章告訴你如何開發相似的工具:LeakMon - Track Handle leak, GDI Leak and Memory Leak in your Applications
固然儘管原理很簡單,可是由於Windows的API種類繁多,而且在新版本中會常有增長, 要開發一個完整的工具也不是一件容易的事情。