gpt4 book ai didi

windbg - 我需要 WOW64 转储来进行 GDI 句柄分析吗?

转载 作者:行者123 更新时间:2023-12-04 12:39:50 33 4
gpt4 key购买 nike

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

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

不幸的是,我收到了 2 个故障转储,脚本不起作用。深入研究,我发现 GdiSharedHandleTable 是 null在这些转储中:

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

现在,在 his website , 阿洛伊斯提到

Important: If you are running on a 64 bit OS you need to attach the 64-bit Windbg even if you debug a 32-bit application!



不幸的是,在 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 位进程应该只包含相同位数的指针的规则保持一致。

    关于windbg - 我需要 WOW64 转储来进行 GDI 句柄分析吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40920898/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com