WinDBG 显示不完整的堆栈
WinDBG show incomplete stack
我得到了一个复杂的故障转储:一个(32 位)程序 (C++) 是用 Visual Studio6 编写的,并在 64 位机器上执行。所以,我得到了一个 64 位故障转储。
遗憾的是,我无法访问 VS 6(而且我认为 VS6 无法处理 64 位)。 VS 2015 无法打开此故障转储(32 位调试器无法调试 64 位..),所以我用 WinDBG(和我自己的 dmp 文件查看器:) 进行了尝试。
查看堆栈仅显示系统地址 (0x7..)。
例如:
. 0 Id: bdc.b40 Suspend: 0 Teb: 00000000`7efdb000 Unfrozen
Start: XXXX+0x4bf33d (00000000`008bf33d)
Priority: 2 Priority class: 128 Affinity: f
# Child-SP RetAddr Call Site
00 00000000`0008e2e8 00000000`73deaedc wow64win!NtUserGetMessage+0xa
01 00000000`0008e2f0 00000000`73e3d18f wow64win!whNtUserGetMessage+0x30
02 00000000`0008e350 00000000`73dc2776 wow64!Wow64SystemServiceEx+0xd7
03 00000000`0008ec10 00000000`73e3d286 wow64cpu!ServiceNoTurbo+0x2d
04 00000000`0008ecd0 00000000`73e3c69e wow64!RunCpuSimulation+0xa
05 00000000`0008ed20 00000000`77c7fb96 wow64!Wow64LdrpInitialize+0x42a
06 00000000`0008f270 00000000`77cdbd09 ntdll!LdrpInitializeProcess+0x17e3
07 00000000`0008f760 00000000`77c6a36e ntdll! ?? ::FNODOBFM::`string'+0x22a30
08 00000000`0008f7d0 00000000`00000000 ntdll!LdrInitializeThunk+0xe
在 ThreadInfoListStream 或
中甚至没有上面列出的入口点
0:000> ~*
. 0 Id: bdc.b40 Suspend: 0 Teb: 00000000`7efdb000 Unfrozen
Start: XXXX+0x4bf33d (00000000`008bf33d)
Priority: 2 Priority class: 128 Affinity: f
[..]
怎么了/我哪里错了?我该怎么做才能看到整个堆栈?有没有什么地方可以帮助/指导我如何自己展开堆栈(我能够加载/读取 pdb,我可以访问转储中保存的内存,我已经对 TEB 的主要部分进行了未编码,. ..).
谢谢
.effmach
命令可以用来切换架构。它需要 x86
或 amd64
作为参数。
您还可以加载 wow64exts
扩展。它有一个 !sw
命令可以在两种模式之间切换。
注意命令提示符和 k
的输出如何变化:
0:000> k
Child-SP RetAddr Call Site
00000000`006ee8e8 00000000`60db21ef wow64cpu!CpupSyscallStub+0xc
00000000`006ee8f0 00000000`60e5bfa1 wow64cpu!Thunk0Arg+0x5
00000000`006ee9a0 00000000`60e4cbb0 wow64!RunCpuSimulation+0xf311
00000000`006eea20 00007ff9`0bef2a11 wow64!Wow64LdrpInitialize+0x120
00000000`006eecd0 00007ff9`0bf289c6 ntdll!EtwEventProviderEnabled+0x1cb1
00000000`006ef0d0 00007ff9`0bed9fae ntdll!memset+0x1c006
00000000`006ef150 00000000`00000000 ntdll!LdrInitializeThunk+0xe
0:000> .load wow64exts
0:000> !sw
Switched to 32bit mode
0:000:x86> k
ChildEBP RetAddr
007eeebc 09ad86fe win32u!NtUserWaitMessage+0xc
WARNING: Frame IP not in any known module. Following frames may be wrong.
007eefd8 7303eaf6 0x9ad86fe
007eefe4 730470e9 clr!CallDescrWorkerInternal+0x34
007ef038 73047714 clr!CallDescrWorkerWithHandler+0x6b
007ef0a0 731dac11 clr!MethodDescCallSite::CallTargetWorker+0x16a
007ef1cc 731dad09 clr!RunMain+0x1ad
我得到了一个复杂的故障转储:一个(32 位)程序 (C++) 是用 Visual Studio6 编写的,并在 64 位机器上执行。所以,我得到了一个 64 位故障转储。 遗憾的是,我无法访问 VS 6(而且我认为 VS6 无法处理 64 位)。 VS 2015 无法打开此故障转储(32 位调试器无法调试 64 位..),所以我用 WinDBG(和我自己的 dmp 文件查看器:) 进行了尝试。
查看堆栈仅显示系统地址 (0x7..)。
例如:
. 0 Id: bdc.b40 Suspend: 0 Teb: 00000000`7efdb000 Unfrozen
Start: XXXX+0x4bf33d (00000000`008bf33d)
Priority: 2 Priority class: 128 Affinity: f
# Child-SP RetAddr Call Site
00 00000000`0008e2e8 00000000`73deaedc wow64win!NtUserGetMessage+0xa
01 00000000`0008e2f0 00000000`73e3d18f wow64win!whNtUserGetMessage+0x30
02 00000000`0008e350 00000000`73dc2776 wow64!Wow64SystemServiceEx+0xd7
03 00000000`0008ec10 00000000`73e3d286 wow64cpu!ServiceNoTurbo+0x2d
04 00000000`0008ecd0 00000000`73e3c69e wow64!RunCpuSimulation+0xa
05 00000000`0008ed20 00000000`77c7fb96 wow64!Wow64LdrpInitialize+0x42a
06 00000000`0008f270 00000000`77cdbd09 ntdll!LdrpInitializeProcess+0x17e3
07 00000000`0008f760 00000000`77c6a36e ntdll! ?? ::FNODOBFM::`string'+0x22a30
08 00000000`0008f7d0 00000000`00000000 ntdll!LdrInitializeThunk+0xe
在 ThreadInfoListStream 或
中甚至没有上面列出的入口点0:000> ~*
. 0 Id: bdc.b40 Suspend: 0 Teb: 00000000`7efdb000 Unfrozen
Start: XXXX+0x4bf33d (00000000`008bf33d)
Priority: 2 Priority class: 128 Affinity: f
[..]
怎么了/我哪里错了?我该怎么做才能看到整个堆栈?有没有什么地方可以帮助/指导我如何自己展开堆栈(我能够加载/读取 pdb,我可以访问转储中保存的内存,我已经对 TEB 的主要部分进行了未编码,. ..).
谢谢
.effmach
命令可以用来切换架构。它需要 x86
或 amd64
作为参数。
您还可以加载 wow64exts
扩展。它有一个 !sw
命令可以在两种模式之间切换。
注意命令提示符和 k
的输出如何变化:
0:000> k
Child-SP RetAddr Call Site
00000000`006ee8e8 00000000`60db21ef wow64cpu!CpupSyscallStub+0xc
00000000`006ee8f0 00000000`60e5bfa1 wow64cpu!Thunk0Arg+0x5
00000000`006ee9a0 00000000`60e4cbb0 wow64!RunCpuSimulation+0xf311
00000000`006eea20 00007ff9`0bef2a11 wow64!Wow64LdrpInitialize+0x120
00000000`006eecd0 00007ff9`0bf289c6 ntdll!EtwEventProviderEnabled+0x1cb1
00000000`006ef0d0 00007ff9`0bed9fae ntdll!memset+0x1c006
00000000`006ef150 00000000`00000000 ntdll!LdrInitializeThunk+0xe
0:000> .load wow64exts
0:000> !sw
Switched to 32bit mode
0:000:x86> k
ChildEBP RetAddr
007eeebc 09ad86fe win32u!NtUserWaitMessage+0xc
WARNING: Frame IP not in any known module. Following frames may be wrong.
007eefd8 7303eaf6 0x9ad86fe
007eefe4 730470e9 clr!CallDescrWorkerInternal+0x34
007ef038 73047714 clr!CallDescrWorkerWithHandler+0x6b
007ef0a0 731dac11 clr!MethodDescCallSite::CallTargetWorker+0x16a
007ef1cc 731dad09 clr!RunMain+0x1ad