Contents

我在之前的博客如何生成Dump文件中提到过,如果要用任务管理器收集32位应用程序dump的话,一定要确保用的是32位的任务管理器。假设用64位的任务管理器的话,用windbg打开,会发现类似如下的call stack。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
0:000> ~*k

. 0 Id: 1b00.59d0 Suspend: 1 Teb: 00000000`fffdb000 Unfrozen
Child-SP RetAddr Call Site
00000000`0008e2e8 00000000`7443aedc wow64win!NtUserGetMessage+0xa
00000000`0008e2f0 00000000`7448d18f wow64win!whNtUserGetMessage+0x30
00000000`0008e350 00000000`74412776 wow64!Wow64SystemServiceEx+0xd7
00000000`0008ec10 00000000`77c301e4 wow64cpu!ServiceNoTurbo+0x2d
00000000`0008ec18 00000000`74480023 ntdll_77c20000!RtlUserThreadStart
00000000`0008ec20 00000000`00000246 wow64!_imp_memcpy <PERF> (wow64+0x23)
00000000`0008ec28 00000000`0018fff0 0x246
00000000`0008ec30 00000000`0008ec60 0x18fff0
00000000`0008ec38 00000000`00390008 0x8ec60
00000000`0008ec40 00000000`00000000 0x390008

1 Id: 1b00.6040 Suspend: 1 Teb: 00000000`fffd8000 Unfrozen
Child-SP RetAddr Call Site
00000000`003af0f8 00000000`7441283e wow64cpu!CpupSyscallStub+0x9
00000000`003af100 00000000`77c301e4 wow64cpu!WaitForMultipleObjects32+0x3b
00000000`003af108 00000000`00000023 ntdll_77c20000!RtlUserThreadStart
00000000`003af110 00000000`00000246 0x23
00000000`003af118 00000000`042ffff0 0x246
00000000`003af120 00000000`00000000 0x42ffff0

可以用!wow64exts.sw命令切换到x86模式下,这样可以看到非托管的call stack,也可以看变量值等。

需要注意的是对于托管代码,还是没用的,sos不能正确加载,所以看不到托管的调用栈信息。

Contents