我是否需要WOW64转储才能进行GDI句柄分析?

时间:2016-12-01 21:41:11

标签: windbg gdi handle resource-leak

我正在调试潜在的GDI Handle Leak。感谢@Alois Kraus,有WinDbg script执行句柄计数。

从我的调试会话especially for .NET,我发现通常情况下,最好是32位进程的32位进程和64位进程的64位转储。

不幸的是,我收到了2个崩溃转储,但脚本不起作用。仔细研究一下,我发现那些转储中的GdiSharedHandleTable是null

0:000> dt ntdll!_PEB GdiSharedHandleTable @$peb
   +0x094 GdiSharedHandleTable : (null) 

现在,在his website,Alois提及

  

重要提示:如果您在64位操作系统上运行,即使调试32位应用程序,也需要连接64位Windbg!

不幸的是,在32位崩溃转储上使用64位WinDbg并没有帮助。结果仍然相同。

现在这是一个理论:

  • 32位进程中的某些DLL是64位DLL(参见Windows Internals 5,第3章,“系统机制”,第211页)
  • ntdll是其中之一(它加载了两次,在64位版本和32位版本中)
  • 虽然GDI对象是用户对象(而不是内核对象),但它们仍然需要由OS绘制等。因此,可能需要在WOW64层中管理它们
  • 这意味着我必须有一个WOW64崩溃转储才能使其正常工作

所以我的问题是:我在这里很少有案例需要WOW64崩溃转储吗?对我的理论进行更详细的解释会很棒。如果已经在某本书中有一个很好的解释,那么对这一章的引用就足够了。如果我还没有它,我会买它。

1 个答案:

答案 0 :(得分:2)

如果在进程到达WinMain / Main / WinmainCrtStartup / etc之前进行了转储 也就是说,如果初始化代码没有运行,那么GdiSharedHandleTable可以为null

在正常运行期间坠毁的情况并非如此,但需要注意的是 例如,如果你在windbg中启动了calc.exe并在第一次系统中断时检查GdiSharedHandleTable,那么GdiSharedHandle可以为NULL 但是如果你在@ $ exentry或calc!WinMain

上设置了休息时间,那么它将被填充

生成此输出的脚本已作为linked thread

的答案发布
0:000> dd  @@c++(@$Peb->GdiSharedHandleTable)

00000000  ???????? ???????? ???????? ????????
00000010  ???????? ???????? ???????? ????????
00000020  ???????? ???????? ???????? ????????
00000030  ???????? ???????? ???????? ????????
00000040  ???????? ???????? ???????? ????????
00000050  ???????? ???????? ???????? ????????
00000060  ???????? ???????? ???????? ????????
00000070  ???????? ???????? ???????? ????????

0:000> g calc!WinMain

calc!WinMain:
00591635 8bff            mov     edi,edi

0:000> dd  @@c++(@$Peb->GdiSharedHandleTable)

00470000  00000000 00000000 40000000 00000000
00470010  00000000 00000000 00000000 00000000
00470020  00000000 00000000 00000000 00000000
00470030  00000000 00000000 00000000 00000000
00470040  00000000 00000000 00000000 00000000
00470050  00000000 00000000 00000000 00000000
00470060  00000000 00000000 00000000 00000000
00470070  00000000 00000000 00000000 00000000

0:000> $$>a< c:\wdscr\dumpgdi.txt

gdioffs Kaddr     Pid      Count    Handle  Type      Tname    IsLive    UAddr    
00472b30 fe6b5728 00000ca4 00000000 0d0102b3 00000001 DC       00000040 000e0cb0
00472be0 fdf73da8 00000ca4 00000000 420502be 00000005 Bitmap   00000040 00000000
004737b0 fddac108 00000ca4 00000000 9605037b 00000005 Bitmap   00000040 00000000
00474030 fe76eda8 00000ca4 00000000 eb050403 00000005 Bitmap   00000040 00000000
00474c90 fddde008 00000ca4 00000000 d70a04c9 0000000a Font     00000040 001fb1e8
0047ab80 fddab008 00000ca4 00000000 ba050ab8 00000005 Bitmap   00000040 00000000
0047f270 fddbcda8 00000ca4 00000000 16050f27 00000005 Bitmap   00000040 00000000
0047fef0 fdee4da8 00000ca4 00000000 cd050fef 00000005 Bitmap   00000040 00000000
004809f0 fe72eda8 00000ca4 00000000 3405109f 00000005 Bitmap   00000040 00000000
00480e50 fdda5aa8 00000ca4 00000000 0e0510e5 00000005 Bitmap   00000040 00000000
00481cf0 ffb0fda8 00000ca4 00000000 df0511cf 00000005 Bitmap   00000040 00000000
00481d70 fddb0da8 00000ca4 00000000 930511d7 00000005 Bitmap   00000040 00000000
00482020 ff4a1da8 00000ca4 00000000 d4051202 00000005 Bitmap   00000040 00000000
00482060 fddd4008 00000ca4 00000000 39051206 00000005 Bitmap   00000040 00000000
00482170 fddb6008 00000ca4 00000000 20051217 00000005 Bitmap   00000040 00000000
00483140 ff4a0008 00000ca4 00000000 4e051314 00000005 Bitmap   00000040 00000000
00483870 ff427980 00000ca4 00000000 6d051387 00000005 Bitmap   00000040 00000000
00483d80 fe7d04b0 00000ca4 00000000 bd0513d8 00000005 Bitmap   00000040 00000000
00484620 ff437eb8 00000ca4 00000000 0d101462 00000010 Brush    00000040 000f0fd8
004846a0 fddc2da8 00000ca4 00000000 d305146a 00000005 Bitmap   00000040 00000000
00484b80 fdf1a728 00000ca4 00000000 530114b8 00000001 DC       00000040 000e0ae0


Gdi Handles for C:\Windows\system32\calc.exe
Total Gdi Handles = 21
DC       = 2
Font     = 0
Region   = 17
Brush    = 0
Bitmap   = 1
Pen      = 1
Pallete  = 0
Unknpown = 0

enter image description here