Windows 7 Windows上的ExceptionHandler stacktrace

Windows 7 Windows上的ExceptionHandler stacktrace,windows-7,x86,windbg,dump,Windows 7,X86,Windbg,Dump,因此,我在一个转储(x86/Windows7)的调用堆栈中看到了这一行。由于我的问题仅与本次通话有关,因此我对其进行了大量删节 Args to Child 01111111 04444444 05555555 ntdll!KiUserExceptionDispatcher+0xf 经过: 看起来堆栈上的前两个参数必须是上下文记录和异常记录。然而,通过一些实验,我注意到01111111不是第一个参数。它实际上从044444开始。因此,在本例中,.cxr 04444444和.exr 0555555

因此,我在一个转储(x86/Windows7)的调用堆栈中看到了这一行。由于我的问题仅与本次通话有关,因此我对其进行了大量删节

Args to Child
01111111 04444444 05555555 ntdll!KiUserExceptionDispatcher+0xf
经过:

看起来堆栈上的前两个参数必须是上下文记录和异常记录。然而,通过一些实验,我注意到
01111111
不是第一个参数。它实际上从
044444
开始。因此,在本例中,
.cxr 04444444
.exr 05555555
显示sane输出

现在,我知道调试器可能只显示堆栈上的任何内容,我可能不应该仅依赖于此,但是如果下面的所有内容都标记为“堆栈展开信息不可用。下面的帧可能是错误的”,我怎么知道我应该忽略01111111

更新

让我们尝试另一种方法。以下是两条相关信息:

Args to Child
0ccccccc 77895ac4 00000000 kernel32!UnhandledExceptionFilter+0x9e
[... various other calls here, leading up to ...]
0eeeeeee 0aaaaaaa 0bbbbbbb ntdll!KiUserExceptionDispatcher+0xf
那么,看看这个。
UnhandledExceptionFilter
的唯一参数是一个异常指针*结构,对吗

0:010> dd 0ccccccc l2
0ddddddd  0bbbbbbb 0aaaaaaa
在EXCEPTION_POINTERS结构中,第一个字段是EXCEPTION_记录(0bbbbb),而第二个字段是CONTEXT_记录(0aaaaaaa)。但是,在对KiUserReceptionDispatcher的调用中,这些参数以相反的方式出现。更不用说0eeeeee不是KiUserExceptionDispatcher的第一个参数,但0cccccc是unhandledeexceptionfilter的第一个参数


我真糊涂

windows 7 x86 32位计算机
winkey+r->windbg计算
bp ntdll!KiUserExceptionDispatcher
f5 在计算器中除以0/0以引发异常

(ac8.c8c): C++ EH exception - code e06d7363 (first chance)
Breakpoint 0 hit
eax=0023e1ec ebx=02b12fd0 ecx=00000003 edx=00000000 esi=02b13178 edi=00000001
eip=76e77048 esp=0023dee0 ebp=0023e23c iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!KiUserExceptionDispatcher:
76e77048 fc              cld
您的帖子显示返回地址为+0xf,因此让我们看看这一点上的内容

0:000> u . .+f
ntdll!KiUserExceptionDispatcher:
76e77048 fc              cld
76e77049 8b4c2404        mov     ecx,dword ptr [esp+4]
76e7704d 8b1c24          mov     ebx,dword ptr [esp]
76e77050 51              push    ecx
76e77051 53              push    ebx
76e77052 e85d88fdff      call    ntdll!RtlDispatchException (76e4f8b4)
76e77057 0ac0            or      al,al
因此,在从调用堆栈中输入RtlDispatchException后,您似乎已中断

破门而入

0:000> tc
eax=0023e1ec ebx=0023dee8 ecx=0023df08 edx=00000000 esi=02b13178 edi=00000001
eip=76e77052 esp=0023ded8 ebp=0023e23c iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!KiUserExceptionDispatcher+0xa:
76e77052 e85d88fdff      call    ntdll!RtlDispatchException (76e4f8b4)


0:000> t
eax=0023e1ec ebx=0023dee8 ecx=0023df08 edx=00000000 esi=02b13178 edi=00000001
eip=76e4f8b4 esp=0023ded4 ebp=0023e23c iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!RtlDispatchException:
76e4f8b4 8bff            mov     edi,edi
查看堆栈,如果您要求windbg详细,它甚至会为您破译上下文

0:000> kb 3
 # ChildEBP RetAddr  Args to Child              
00 0023ded0 76e77057 0023dee8 0023df08 0023dee8 ntdll!RtlDispatchException
01 0023ded0 7521b760 0023dee8 0023df08 0023dee8 ntdll!KiUserExceptionDispatcher+0xf
02 0023e23c 7579359c e06d7363 00000001 00000003 KERNELBASE!RaiseException+0x58
0:000> kv 3
 # ChildEBP RetAddr  Args to Child              
00 0023ded0 76e77057 0023dee8 0023df08 0023dee8 ntdll!RtlDispatchException (FPO: [Non-Fpo])
01 0023ded0 7521b760 0023dee8 0023df08 0023dee8 ntdll!KiUserExceptionDispatcher+0xf (FPO: [2,0,0]) (CONTEXT @ 0023df08)
02 0023e23c 7579359c e06d7363 00000001 00000003 KERNELBASE!RaiseException+0x58 (FPO: [Non-Fpo])
exr输出

0:000> .exr poi(@esp+4)
ExceptionAddress: 7521b760 (KERNELBASE!RaiseException+0x00000058)
   ExceptionCode: e06d7363 (C++ EH exception)
  ExceptionFlags: 00000001
NumberParameters: 3
   Parameter[0]: 19930520
   Parameter[1]: 0023e294
   Parameter[2]: 007c15b4
unable to find C-Runtime symbols, even with unqualified search
上下文记录输出

0:000> dt ntdll!_CONTEXT poi(@esp+8)
   +0x000 ContextFlags     : 0x1003f
   +0x004 Dr0              : 0
   +0x008 Dr1              : 0
   +0x00c Dr2              : 0
   +0x010 Dr3              : 0
   +0x014 Dr6              : 0
   +0x018 Dr7              : 0
   +0x01c FloatSave        : _FLOATING_SAVE_AREA
   +0x08c SegGs            : 0
   +0x090 SegFs            : 0x3b
   +0x094 SegEs            : 0x23
   +0x098 SegDs            : 0x23
   +0x09c Edi              : 1
   +0x0a0 Esi              : 0x2b13178
   +0x0a4 Ebx              : 0x2b12fd0
   +0x0a8 Edx              : 0
   +0x0ac Ecx              : 3
   +0x0b0 Eax              : 0x23e1ec
   +0x0b4 Ebp              : 0x23e23c
   +0x0b8 Eip              : 0x7521b760
   +0x0bc SegCs            : 0x1b
   +0x0c0 EFlags           : 0x202
   +0x0c4 Esp              : 0x23e1ec
   +0x0c8 SegSs            : 0x23
   +0x0cc ExtendedRegisters : [512]  "???"
您甚至可以通过use.extptr获得这两个值(注意,使用此命令后,您可能需要使用.cxr将上下文重置为默认范围)


希望这足以让您自己针对无法透露实际windbg堆栈跟踪的特定情况进行研究

windows 7 x86 32位计算机
winkey+r->windbg计算
bp ntdll!KiUserExceptionDispatcher
f5 在计算器中除以0/0以引发异常

(ac8.c8c): C++ EH exception - code e06d7363 (first chance)
Breakpoint 0 hit
eax=0023e1ec ebx=02b12fd0 ecx=00000003 edx=00000000 esi=02b13178 edi=00000001
eip=76e77048 esp=0023dee0 ebp=0023e23c iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!KiUserExceptionDispatcher:
76e77048 fc              cld
您的帖子显示返回地址为+0xf,因此让我们看看这一点上的内容

0:000> u . .+f
ntdll!KiUserExceptionDispatcher:
76e77048 fc              cld
76e77049 8b4c2404        mov     ecx,dword ptr [esp+4]
76e7704d 8b1c24          mov     ebx,dword ptr [esp]
76e77050 51              push    ecx
76e77051 53              push    ebx
76e77052 e85d88fdff      call    ntdll!RtlDispatchException (76e4f8b4)
76e77057 0ac0            or      al,al
因此,在从调用堆栈中输入RtlDispatchException后,您似乎已中断

破门而入

0:000> tc
eax=0023e1ec ebx=0023dee8 ecx=0023df08 edx=00000000 esi=02b13178 edi=00000001
eip=76e77052 esp=0023ded8 ebp=0023e23c iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!KiUserExceptionDispatcher+0xa:
76e77052 e85d88fdff      call    ntdll!RtlDispatchException (76e4f8b4)


0:000> t
eax=0023e1ec ebx=0023dee8 ecx=0023df08 edx=00000000 esi=02b13178 edi=00000001
eip=76e4f8b4 esp=0023ded4 ebp=0023e23c iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!RtlDispatchException:
76e4f8b4 8bff            mov     edi,edi
查看堆栈,如果您要求windbg详细,它甚至会为您破译上下文

0:000> kb 3
 # ChildEBP RetAddr  Args to Child              
00 0023ded0 76e77057 0023dee8 0023df08 0023dee8 ntdll!RtlDispatchException
01 0023ded0 7521b760 0023dee8 0023df08 0023dee8 ntdll!KiUserExceptionDispatcher+0xf
02 0023e23c 7579359c e06d7363 00000001 00000003 KERNELBASE!RaiseException+0x58
0:000> kv 3
 # ChildEBP RetAddr  Args to Child              
00 0023ded0 76e77057 0023dee8 0023df08 0023dee8 ntdll!RtlDispatchException (FPO: [Non-Fpo])
01 0023ded0 7521b760 0023dee8 0023df08 0023dee8 ntdll!KiUserExceptionDispatcher+0xf (FPO: [2,0,0]) (CONTEXT @ 0023df08)
02 0023e23c 7579359c e06d7363 00000001 00000003 KERNELBASE!RaiseException+0x58 (FPO: [Non-Fpo])
exr输出

0:000> .exr poi(@esp+4)
ExceptionAddress: 7521b760 (KERNELBASE!RaiseException+0x00000058)
   ExceptionCode: e06d7363 (C++ EH exception)
  ExceptionFlags: 00000001
NumberParameters: 3
   Parameter[0]: 19930520
   Parameter[1]: 0023e294
   Parameter[2]: 007c15b4
unable to find C-Runtime symbols, even with unqualified search
上下文记录输出

0:000> dt ntdll!_CONTEXT poi(@esp+8)
   +0x000 ContextFlags     : 0x1003f
   +0x004 Dr0              : 0
   +0x008 Dr1              : 0
   +0x00c Dr2              : 0
   +0x010 Dr3              : 0
   +0x014 Dr6              : 0
   +0x018 Dr7              : 0
   +0x01c FloatSave        : _FLOATING_SAVE_AREA
   +0x08c SegGs            : 0
   +0x090 SegFs            : 0x3b
   +0x094 SegEs            : 0x23
   +0x098 SegDs            : 0x23
   +0x09c Edi              : 1
   +0x0a0 Esi              : 0x2b13178
   +0x0a4 Ebx              : 0x2b12fd0
   +0x0a8 Edx              : 0
   +0x0ac Ecx              : 3
   +0x0b0 Eax              : 0x23e1ec
   +0x0b4 Ebp              : 0x23e23c
   +0x0b8 Eip              : 0x7521b760
   +0x0bc SegCs            : 0x1b
   +0x0c0 EFlags           : 0x202
   +0x0c4 Esp              : 0x23e1ec
   +0x0c8 SegSs            : 0x23
   +0x0cc ExtendedRegisters : [512]  "???"
您甚至可以通过use.extptr获得这两个值(注意,使用此命令后,您可能需要使用.cxr将上下文重置为默认范围)


希望这足以让您自己研究您无法透露实际windbg堆栈跟踪的具体情况

我不确定您链接的
KiUserExceptionDispatcher
原型是否正确。我相信它实际上是
VOID KiUserExceptionDispatcher(peexception\u RECORD ExceptionRecord,PCONTEXT Context)
。在这种情况下,
0111111
是异常记录,
04444444
是上下文记录。我链接到的psuedo代码来自Ken Johnson,他不仅是一个微软人,而且是windows内部世界中非常有名的人。无论如何,即使交换这些参数,这里的问题是01111111不是第一个。第一个参数从044444开始。这就是我试图理解的部分。伪代码是从什么时候开始的?它没有日期。你介意发布一个真实的WinDbg输出吗?
kb
命令显示了更多信息。您确定这不是复制/粘贴问题吗?我还想知道
+0xf
偏移量。这不是太接近方法的开头吗?我不确定您链接的
KiUserExceptionDispatcher
的原型是否正确。我相信它实际上是
VOID KiUserExceptionDispatcher(peexception\u RECORD ExceptionRecord,PCONTEXT Context)
。在这种情况下,
0111111
是异常记录,
04444444
是上下文记录。我链接到的psuedo代码来自Ken Johnson,他不仅是一个微软人,而且是windows内部世界中非常有名的人。无论如何,即使交换这些参数,这里的问题是01111111不是第一个。第一个参数从044444开始。这就是我试图理解的部分。伪代码是从什么时候开始的?它没有日期。你介意发布一个真实的WinDbg输出吗?
kb
命令显示了更多信息。您确定这不是复制/粘贴问题吗?我还想知道
+0xf
偏移量。这不是太接近方法的开头了吗?blabb(你真的应该改名:-):非常感谢!为了更好地理解这一点,我做了类似的实验,但我喜欢你的捷径(poi(@esp+4))。再次感谢!布拉布(你真的应该改名:-):非常感谢!为了更好地理解这一点,我做了类似的实验,但我喜欢你的捷径(poi(@esp+4))。再次感谢!