【发布时间】: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 不是合适的工具。