我正在调试潜在的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
对不起,我故障。 –