我正在調試潛在的GDI手柄泄漏。由於@Alois Kraus,有一個WinDbg script它執行句柄計數。我是否需要WOW64轉儲進行GDI句柄分析?
從我的調試會話especially for .NET中,我發現通常最好是32位進程的32位轉儲和64位進程的64位轉儲。
不幸的是,在收到2次崩潰轉儲後,腳本無法運行。展望深入,我發現該GdiSharedHandleTable是null
在那些垃圾堆:
0:000> dt ntdll!_PEB GdiSharedHandleTable @$peb
+0x094 GdiSharedHandleTable : (null)
現在,his website,阿洛伊斯提到
重要:如果您在64位操作系統上運行,你需要即使您調試32位應用程序,也要附加64位Windbg!
不幸的是,在32位故障轉儲中使用64位WinDbg並沒有幫助。結果仍然是一樣的。
現在,這裏的一個理論:
- 在32位過程中的一些DLL是64個DLL(請參閱Windows內部5,第3章, 「系統機制,」 211頁)
ntdll
是一個(它在64位版本和32位版本中被加載兩次)- 雖然GDI對象是用戶對象(而不是內核對象),但它們仍然需要由操作系統繪製等。因此,可以要求他們在WOW64層管理
- 這意味着,我必須有一個WOW64崩潰轉儲,使其工作
所以我的問題是:做我有很少的情況下在這裏,我需要一個WOW64崩潰轉儲?我的理論更詳細的解釋會很棒。如果在某本書中有一個很好的解釋,那麼對這一章的引用就足夠了。如果我還沒有,我會買它。
你使用哪種鈣?在Win 7 x64上,calc是64位。在調試會話,'DD @@ C++(@ $ Peb-> GdiSharedHandleTable)''返回00000000 00000000',所以它的零和腳本不應該工作。但是,當您運行腳本時,它會返回正確的結果。這似乎對我來說是一個矛盾。 –
對不起,我無法理解什麼矛盾,你看我做DD POI()2倍時首先應用在systembp和第二,當應用程序是在它的WinMain第一時間表爲空和第二時間表指向有效的內存 – blabb
對不起,我故障。 –