2017-05-19 1 views
0

私はこの行を、私が見ているダンプ(x86/Windows 7)のコールスタックの1つに見ます。私の質問はこの呼び出しにしか関係していないので、私はひどく切った。WindowsのExceptionHandler stacktrace

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

と行く:http://www.nynaeve.net/Code/KiUserExceptionDispatcher.c

それは、スタック上の最初の二つの引数のように見えるコンテキストレコードと例外レコードでなければなりません。しかし、いくつかの実験では、01111111が最初の引数ではないことに気付きました。実際は04444444から始まります。したがって、この場合は.cxr 04444444.exr 05555555が表示されます。

ここで、デバッガはその時点でスタックに何が表示されている可能性があると理解しています。フレームが間違っている可能性があります "、どうすれば私は01111111を無視すべきであることを知ることができますか?

UPDATE

は異なるアプローチを試すことができます。関連する情報は2つあります。

Args to Child 
0ccccccc 77895ac4 00000000 kernel32!UnhandledExceptionFilter+0x9e 
[... various other calls here, leading up to ...] 
0eeeeeee 0aaaaaaa 0bbbbbbb ntdll!KiUserExceptionDispatcher+0xf 

ですので、これを確認してください。唯一のパラメータUnhandledExceptionFilterはEXCEPTION_POINTERS *構造です。 EXCEPTION_POINTERS構造体において

0:010> dd 0ccccccc l2 
0ddddddd 0bbbbbbb 0aaaaaaa 

秒CONTEXT_RECORD(0aaaaaaa)であるが、最初のフィールドは、(0bbbbbbbは)EXCEPTION_RECORDあります。しかし、KiUserEceptionDispatcherの呼び出しでは、これらの引数は逆の方法で表示されます。 0eeeeeeeがでないことはもちろん、はKiUserExceptionDispatcherの最初のパラメータですが、0ccccccc ISはUnhandledExceptionFilterの最初のパラメータです。

私は混乱しています!

+0

リンクした 'KiUserExceptionDispatcher'のプロトタイプが正しいかどうか分かりません。私はそれが実際に 'VOID KiUserExceptionDispatcher(PEXCEPTION_RECORD ExceptionRecord、PCONTEXT Context)だと思います。この場合、「01111111」は例外レコードであり、「04444444」はコンテキストレコードである。 –

+0

[このソース](https://doar-e.github.io/blog/2013/10/12/having-a-look-at-the-windows-userkernel-exceptions-dispatcher/)と[このソース] (https://blogs.msdn.microsoft.com/dsvc/2012/10/08/making-sense-out-of-a-nonsensical-call-stack/)は、これを裏付けるようです。 –

+0

@SeanClineよくリンクされている擬似コードは、Microsoft社だけでなく、Windowsの内部世界でも有​​名なKen Johnsonのものです。とにかく、これらの引数を入れ替えても、01111111は最初のものではありません。最初の引数は04444444から始まります。これは私が理解しようとしている部分です。 – ForeverLearning

答えて

2

の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 

あなたの投稿は、それはそういただきましたその時点件まで

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 

見ることができます+ 0xFのようにリターンアドレスを示してい呼び出しスタックから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] "???" 

あなたは両方とも.extpt R(このコマンドを使用した後.cxr使用してスコープをデフォルトにコンテキストをリセットする必要がある場合があります)

0:000> .exptr (@esp+4) 

----- Exception record at 0023dee8: 
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 

----- Context record at 0023df08: 
eax=0023e1ec ebx=02b12fd0 ecx=00000003 edx=00000000 esi=02b13178 edi=00000001 
eip=7521b760 esp=0023e1ec 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 
KERNELBASE!RaiseException+0x58: 
7521b760 c9    leave 


0:000> kb 3 
# ChildEBP RetAddr Args to Child    
00 0023e23c 7579359c e06d7363 00000001 00000003 KERNELBASE!RaiseException+0x58 
01 0023e274 0079eee0 0023e294 007c15b4 02b13178 msvcrt!_CxxThrowException+0x48 
02 0023e288 0079146e 02b13178 80000002 c87a3f02 calc!divrat+0x69 

0:000> .cxr 
Resetting default scope 

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 

希望、これはあなたが実際のwindbgのスタックトレース

を漏らすカントれる特定の状況のた​​めに自分で検索するに足ります
+0

blabb(実際にあなたの名前を変更する必要があります:-)):私はこれをよく理解するために同様の実験をしていましたが、あなたのショートカットが好きです(poi(@ esp + 4))。もう一度ありがとう! – ForeverLearning

関連する問題