我正在调试潜在的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并没有帮助。结果仍然相同。
现在这是一个理论:
ntdll
是其中之一(它加载了两次,在64位版本和32位版本中)所以我的问题是:我在这里很少有案例需要WOW64崩溃转储吗?对我的理论进行更详细的解释会很棒。如果已经在某本书中有一个很好的解释,那么对这一章的引用就足够了。如果我还没有它,我会买它。
答案 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