GDI泄露檢測


前一段在一個仿QQ的IM通訊工具中加入屏幕截圖以及截圖編輯功能,但是測試中發現當連續進行幾十次截圖后,系統會出現白屏,開始以為和win7經常閃白有關,屏幕截圖截取到閃白的瞬間導致白屏,后來發現是GDI內存不足,申請不到GDI內存貼圖失敗所致。於是找了GDI泄露的工具,對程序進行GDI內存檢測,下面就介紹兩款GDI泄露檢測工具的用法以及GDI編程的一些注意事項。

第一款:GDIndicator 支持win7+xp 下載地址

1、啟動待檢測的程序和GDIndicator,啟動順序沒有要求,之后F5刷新,就能看到系統中所有進程,和使用的資源數

找到想要查看的進程,這里我們的程序是 TPCommonControlTest,雙擊進入沒有釋放的GDI對象列表

 

在左邊list控件中單擊GDI對象,即可查看,對於可用bitmap對象,還可以看縮略圖。

2、進行可能引起泄露的操作,並復原,對本程序來說,就是打開聊天窗口,屏幕截圖,並關閉聊天窗口。

     如果沒有GDI泄露,在進行上述操作后,GDI對象應該沒有改變,如果改變了,根據差值,查找泄露的GDI對象。

3、下圖是進行操作后,的GDI對象使用情況,根據差值,重點分析有哪些泄露




根據對比發現,新增了1個bitmap2個dc對象,然后雙擊TPCommonControlTest進程,結合代碼分析,看哪些地方使用DC了,以及是否釋放。這個工具定位不是很精確,不能給出調用堆棧等,只能由程序員根據新增對象分析、查找。


第二款工具,GdiLeakDetector,支持xp,win7支持不是很好,可以精確定位GDI泄露位置 下載地址:

使用方法:

1、打開GdiLeakDetector,找到要檢測的程序,並點擊運行程序按鈕




2、進行可能出現泄露的操作,並退出程序,並依次點擊左邊的GDI泄露列表,看哪個是可以修改的



如上圖所示,很容易的找到,在copyclipbrd中有dc泄露,去函數中查看,發現dc是通過CreateCompatibleDC函數創建的,但是釋放時用了releaseDC,這是不對的,對於CreateCompatibleDC申請的DC,應該用deletedc釋放,而getDC取得的DC資源,用releaseDC釋放,不對應的話就會造成GDI泄露。

 

附:GDI使用的幾個注意點:

http://blog.csdn.net/bobob/archive/2005/12/29/565188.aspx

1、Create出來的GDI對象,要用Deleteobject釋放, create出來的DC,要用DeleteDc釋放,getDC得出的DC,用ReleaseDc釋放。

2、先create后delete, create1,create2, delete2,delete1的順序。

3、畫圖步驟

a 創建一個內存兼容dc(CreateCompatibleDC)
b.創建一個內存兼容bitmap(CreateCompatibleBitmap)
c.關聯創建的內存兼容dc和bitmap(SelectObject)
d.畫圖
e.BitBlt到目的dc上
f.斷開內存兼容dc和bitmap關聯(SelectObject)
g.銷毀內存兼容bitmap
h.銷毀內存兼容dc


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM