我需要一个WOW64转储进行GDI句柄分析吗?

我正在调试潜在的GDI句柄泄漏。 感谢@Alois Kraus,有一个WinDbg脚本执行句柄计数。

从我的调试会话中,尤其是.NET,我发现通常最好是32位进程的32位转储和64位进程的64位转储。

不幸的是,我收到2次崩溃转储后,脚本无法运行。 深入研究,我发现GdiSharedHandleTable在这些转储中为null

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

现在,在他的网站上,阿洛伊斯提到

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

不幸的是,在32位故障转储中使用64位WinDbg并没有帮助。 结果仍然是一样的。

这里有一个理论:

  • 32位进程中的某些DLL是64位DLL(请参阅Windows内部函数5,第3章“系统机制”,第211页)
  • ntdll就是其中之一(它在64位版本和32位版本中被加载两次)
  • 虽然GDI对象是用户对象(而不是内核对象),但它们仍然需要由操作系统绘制等。 因此可能需要它们在WOW64层中进行管理
  • 这意味着我必须有一个WOW64崩溃转储才能工作
  • 所以我的问题是: 我在这里很少遇到需要WOW64崩溃转储的情况吗? 对我的理论更详细的解释会很棒。 如果在某本书中有一个很好的解释,那么对这一章的引用就足够了。 如果我还没有,我会买它。


    对于GDI句柄转储,即使它是Win64机器上的32位进程,也需要执行64位转储。 如果你在64位机器上进行32位转储,则指向GDI共享句柄表的指针为空。 它看起来像只有64位转储才能捕获此信息。

    这很有意义,因为您需要处理32位进程中的64位指针,因为您的进程的GDI句柄表部分已从内核空间映射到您的地址空间。 我想这是为了保持与32位进程只应包含相同位数的指针的规则一致。


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

    对于在正常运行期间坠毁的转储,情况并非如此,但需要注意
    例如,如果您在windbg中启动calc.exe,并在第一次系统中断时检查GdiSharedHandleTable,则GdiSharedHandle可以为NULL
    但如果您在@ $ exentry或calc!WinMain上设置了中断,则会被填充

    生成此输出的脚本已发布为链接线程的答案

    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:wdscrdumpgdi.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:Windowssystem32calc.exe
    Total Gdi Handles = 21
    DC       = 2
    Font     = 0
    Region   = 17
    Brush    = 0
    Bitmap   = 1
    Pen      = 1
    Pallete  = 0
    Unknpown = 0
    

    在这里输入图像描述

    链接地址: http://www.djcxy.com/p/37337.html

    上一篇: Do I need a WOW64 dump for GDI Handle analysis?

    下一篇: Import component from a different repo