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