如何检测资源泄露
Visual Leak Detector源于Code Project:Visual Leak Detector - Enhanced Memory Leak Detection for Visual C++,?安裝包可以到?這里?下載。
使用很簡(jiǎn)單,基本上安裝完了就之可以直接用, 具體可以參考?這篇
關(guān)于對(duì)象句柄泄露, 主要分GDI對(duì)象,Kernel對(duì)象,User對(duì)象:
GDI對(duì)象只在本進(jìn)程有效,主要是指Brush, Pen,DC等, 具體可以參考?這里
User對(duì)象只在同一Session內(nèi)有效,同一user對(duì)象在不同進(jìn)程內(nèi)值都相等,可以跨進(jìn)程使用, 主要是指Menu, window, cursor, hook等,具體可以參考?這里
Kernel對(duì)象可以跨進(jìn)程使用, 但是因?yàn)槊總€(gè)進(jìn)程都有自己的內(nèi)核對(duì)象表,所以同一對(duì)象的句柄值在不同進(jìn)程里會(huì)不相等(盡管最終指向同一個(gè)內(nèi)核對(duì)象),主要是指各類(lèi)HANDLE,具體可以參考?這里
對(duì)于對(duì)象句柄泄露,免費(fèi)來(lái)說(shuō)沒(méi)有太好的工具可以直接使用, 很多時(shí)候我們可以直接通過(guò)任務(wù)管理器來(lái)觀察各類(lèi)對(duì)象的個(gè)數(shù), 如果有持續(xù)增長(zhǎng), 則說(shuō)明有泄露存在。很多時(shí)候GDI泄露是大頭,我們要判斷哪類(lèi)GDI對(duì)象正在泄露,可以考慮使用工具GDIView。(對(duì)于對(duì)象句柄泄露,誰(shuí)有好的工具,可以提示下。)
對(duì)于內(nèi)核對(duì)象泄露,我們可以考慮使用WinDbg的 !htrace 命令, 使用很簡(jiǎn)單:通過(guò) !htrace -enable 命令打開(kāi)?;厮?#xff0c; 然后通過(guò) !htrace -snapshot 命令保存一個(gè)當(dāng)前所有句柄的快照, 最后再通過(guò) -htrace -diff 命令獲取所有前面保存快照后打開(kāi)但沒(méi)有關(guān)閉的句柄對(duì)象。
如果公司有錢(qián),可以考慮購(gòu)買(mǎi)Boudcheck, 這個(gè)工具非常強(qiáng)大,可以幫我們快速的檢測(cè)出各類(lèi)內(nèi)存和對(duì)象泄露,包括API的參數(shù)錯(cuò)誤等。思考Boundcheck的實(shí)現(xiàn)原理,實(shí)際上并不復(fù)雜,主要就是API Hook, 大概過(guò)程如下:
(1) 將注入對(duì)方進(jìn)程
(2) 通過(guò)API Hook替代系統(tǒng)資源分配和釋放相關(guān)的API, 并且記錄調(diào)用棧
(3)最后檢測(cè)沒(méi)有釋放的資源, 生成報(bào)表
這里有篇文章告訴你如何開(kāi)發(fā)類(lèi)似的工具:LeakMon - Track Handle leak, GDI Leak and Memory Leak in your Applications
當(dāng)然盡管原理很簡(jiǎn)單,但是因?yàn)閃indows的API種類(lèi)繁多,并且在新版本中會(huì)常有增加, 要開(kāi)發(fā)一個(gè)完整的工具也不是一件容易的事情。
轉(zhuǎn)載于:https://www.cnblogs.com/weiym/p/3940502.html
總結(jié)
- 上一篇: 酷狗音乐怎么定时关闭音乐
- 下一篇: WPF触屏Touch事件在嵌套控件中的响