【问题标题】:How can I dump 32-bit structs in 64-bit WinDbg?如何在 64 位 WinDbg 中转储 32 位结构?
【发布时间】:2014-04-02 14:01:05
【问题描述】:

我正在使用 64 位 WinDbg 转储结构信息,并尝试转储 32 位结构信息。

我启动 WinDbg,选择文件 > 内核调试并启动本地会话。然后我转储一个结构:

lkd> dt nt!_LIST_ENTRY
    +0x000 Flink            : Ptr64 _LIST_ENTRY
    +0x008 Blink            : Ptr64 _LIST_ENTRY

正如预期的那样,这显示了 64 位结构信息。

我知道我可以调试远程系统或分析故障转储,只要我为这些 Windows 版本加载正确的符号。

它试图将 .effmach 设置为 x86,正如 in this comment 所暗示的那样,但我仍然得到 64 位结构:

lkd> .effmach x86
Effective machine: x86 compatible (x86)
lkd:x86> .symfix
lkd:x86> .reload
Connected to Windows 7 7601 x64 target at (date), ptr64 TRUE
Loading Kernel Symbols
...............................................................
.................................................................
Loading User Symbols
..........................................
Loading unloaded module list
......
lkd> dt nt!_LIST_ENTRY
    +0x000 Flink            : Ptr64 _LIST_ENTRY
    +0x008 Blink            : Ptr64 _LIST_ENTRY`

如您所见,这不是 32 位的 _LIST_ENTRY 结构,而是我们在上面已经看到的 64 位结构。

我的问题:是否可以在 64 位 WinDbg 中转储 32 位结构信息,而无需远程 32 位系统和 32 位故障转储?

【问题讨论】:

  • 为什么在内核调试过程中需要这种结构?我认为您不会看到 64 位内核使用 32 位结构。用例是什么?目前它在我看来就像一个 XY 问题。你真正想达到什么目标?
  • 是的,这很可能是 XY 问题。我的用例:我试图查看不同 Windows 版本(从 Windows XP 到当前版本)的结构之间的差异。或许 WinDbg 不是合适的工具。

标签: debugging struct windbg


【解决方案1】:

不,没有办法做你想做的事。 Windows 上 x64 上的内核模式代码始终为 64 位并使用 64 位结构,因此不存在 32 位类型信息。

【讨论】:

    【解决方案2】:

    你检查过这个link

    这可能会有所帮助!

    编辑:添加更多细节。

    如果您正在调试 64 位内核,我同意 snoone 的观点。整个地址空间为 64 位。因此,所有内核模式结构都将只有 64 位。

    现在,我发布上面链接的原因是:如果您想调试 32 位应用程序 [即WoW apps] 在 64 位机器上运行,那么除了您尝试的 .effmatch x86 之外,您还可以尝试另一个扩展。 那就是:!wow64exts.sw

    所以想介绍 wow64exts 扩展,我发现它对在 64 位操作系统上处理 32 位内容时消除混乱非常有帮助!

    【讨论】:

    • 您能否详细说明,仅发布链接答案不是一个好的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多