WinDbgは問題異常スタックを検索し、スタックはUnhandledExceptionFilterを追跡する
9498 ワード
UnhandledExceptionFilter関数呼び出し時に発生した例外を処理する例外ハンドラ定義はありません.関数は通常、異常をNtdllに伝達する.dllファイルはスナップして処理しようとします.プロセスのメモリスナップショットが存在する場合、ロックポイントを持つスレッドによって呼び出されるUnhandledExceptionFilter関数が表示されます.これらの場合、本明細書に従って、異常を引き起こすDLLの手順を識別できます.
Windbg.exeダンプファイルを開く
デバッガをダウンロードしてインストールします.デバッガをダウンロードするには、次のMicrosoft Webサイトにアクセスします.
Microsoftデバッグツール
http://www.microsoft.com/whdc/devtools/ddk/default.mspx
(http://www.microsoft.com/whdc/devtools/ddk/default.mspx)
windbgディレクトリに移動し、ツールcdbを使用してdumpファイルを生成します.cdb-pv-pnプロセス名-c'.dump/m c:/ファイル名.dmp;qなどです.
cdb -pv -pn explorer.exe -c ".dump/m c:/explorer.dmp;q"
デバッガのインストール先フォルダを開き、Windbgをダブルクリックします.exeでデバッガを起動します.
[ファイル](File)メニューで[フェイルオーバーダンプを開く](Open Failure Dump)(またはCTRL+D)をクリックし、ダンプファイルを表示するかどうかを選択します.
'異常スタックはWindbgを使用する.exe
Windbgでexe、開きます.dmpファイル、プロセス.
正しい位置でシンボルパスを指していることを確認してください.この操作の実行方法の詳細については、次のMicrosoft Webサイトを参照してください.
シンボルの取得方法
http://www.microsoft.com/whdc/devtools/ddk/default.mspx
(http://www.microsoft.com/whdc/devtools/ddk/default.mspx)
コマンドプロンプトに~*kbを入力して、すべてのプロセスのスレッドをリストします.
関数呼び出しを行うスレッドKernel 32を識別します!UnhandledExceptionFilter. 次のように見えます.
このスレッドに切り替えます(この例では、スレッドは「~120 s」).
メモリの内容を表示する最初のパラメータ指定位置Kernel 32!UnhandledExceptionFilterはddの最初のパラメータを使用します.EXCEPTION_を指しますPOINTERS構造
最初のdword値は異常レコードを表します.例外のタイプに関する情報を取得するには、コマンド・プロンプトで次のように実行します.
.exr first DWORD from step 6
2番目のdword値はコンテキストレコードです.取得するコンテキスト情報は、コマンドプロンプトで次のように実行します.
.cxr second DWORD from step 6
kvコマンドを実行して、実際の異常な呼び出しスタックを取得します.これにより、正しく処理されていない可能性のある実際の問題を特定できます.
_except_handler関数の場合
場合によってはスタックにUnhandledExceptionFilterがなく、_のみexcept_handler関数、これはSEH異常処理関数です.関数プロトタイプ:EXCEPTION_DISPOSITION __cdecl _except_handler( struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame, struct _CONTEXT *ContextRecord, void * DispatcherContext);この関数の最初のパラメータはEXCEPTION_を指すRECORD構造のポインタ.この構造はWINNTです.Hで定義されている、typedef struct_EXCEPTION_RECORD { DWORD ExceptionCode; DWORD ExceptionFlags; struct _EXCEPTION_RECORD *ExceptionRecord; PVOID ExceptionAddress; DWORD NumberParameters; DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];} EXCEPTION_RECORD; _except_handler関数の2番目のパラメータはestablisherフレーム構造を指すポインタである.except_handlerコールバック関数の3番目のパラメータはCONTEXT構造を指すポインタである.typedef struct _CONTEXT{ DWORD ContextFlags; DWORD Dr0; DWORD Dr1; DWORD Dr2; DWORD Dr3; DWORD Dr6; DWORD Dr7; FLOATING_SAVE_AREA FloatSave; DWORD SegGs; DWORD SegFs; DWORD SegEs; DWORD SegDs; DWORD Edi; DWORD Esi; DWORD Ebx; DWORD Edx; DWORD Ecx; DWORD Eax; DWORD Ebp; DWORD Eip; DWORD SegCs; DWORD EFlags; DWORD Esp; DWORD SegSs;} CONTEXT; _except_handlerコールバック関数の4番目のパラメータをDispatcherContextと呼ぶ.
dumpファイルを解析する場合は、コマンドプロンプトに~*kbを入力して、すべてのプロセスのスレッドをリストします.
関数呼び出しを行うスレッドKernel 32を識別します!except_handler. 次のように見えます.
このスレッドに切り替えます(この例では、スレッドは「~9 s」).
Kernel32! !_except_handlerの最初のパラメータdword値は異常レコードを表します.例外のタイプに関する情報を取得するには、コマンドプロンプトで次のように実行します.exr first DWORD from step 5
Kernel32! !_except_handlerの3番目のパラメータdword値はコンテキストレコードです.取得するコンテキスト情報は、コマンドプロンプトで次のように実行します.
.cxr second DWORD from step 6
kvコマンドを実行して、実際の異常な呼び出しスタックを取得します.これにより、正しく処理されていない可能性のある実際の問題を特定できます.
Windbg.exeダンプファイルを開く
デバッガをダウンロードしてインストールします.デバッガをダウンロードするには、次のMicrosoft Webサイトにアクセスします.
Microsoftデバッグツール
http://www.microsoft.com/whdc/devtools/ddk/default.mspx
(http://www.microsoft.com/whdc/devtools/ddk/default.mspx)
windbgディレクトリに移動し、ツールcdbを使用してdumpファイルを生成します.cdb-pv-pnプロセス名-c'.dump/m c:/ファイル名.dmp;qなどです.
cdb -pv -pn explorer.exe -c ".dump/m c:/explorer.dmp;q"
デバッガのインストール先フォルダを開き、Windbgをダブルクリックします.exeでデバッガを起動します.
[ファイル](File)メニューで[フェイルオーバーダンプを開く](Open Failure Dump)(またはCTRL+D)をクリックし、ダンプファイルを表示するかどうかを選択します.
'異常スタックはWindbgを使用する.exe
Windbgでexe、開きます.dmpファイル、プロセス.
正しい位置でシンボルパスを指していることを確認してください.この操作の実行方法の詳細については、次のMicrosoft Webサイトを参照してください.
シンボルの取得方法
http://www.microsoft.com/whdc/devtools/ddk/default.mspx
(http://www.microsoft.com/whdc/devtools/ddk/default.mspx)
コマンドプロンプトに~*kbを入力して、すべてのプロセスのスレッドをリストします.
関数呼び出しを行うスレッドKernel 32を識別します!UnhandledExceptionFilter. 次のように見えます.
120 id: f0f0f0f0.a1c Suspend: 1 Teb 7ff72000 Unfrozen
ChildEBP RetAddr Args to Child
09a8f334 77eb9b46 0000244c 00000001 00000000 ntdll!ZwWaitForSingleObject+0xb [i386/usrstubs.asm @ 2004]
09a8f644 77ea7e7a 09a8f66c 77e861ae 09a8f674 KERNEL32!UnhandledExceptionFilter+0x2b5
[D:/nt/private/windows/base/client/thread.c @ 1753]
09a8ffec 00000000 787bf0b8 0216fe94 00000000 KERNEL32!BaseThreadStart+0x65 [D:/nt/private/windows/base/client/support.c @ 453]
このスレッドに切り替えます(この例では、スレッドは「~120 s」).
メモリの内容を表示する最初のパラメータ指定位置Kernel 32!UnhandledExceptionFilterはddの最初のパラメータを使用します.EXCEPTION_を指しますPOINTERS構造
0:120> dd 09a8f66c
09a8f66c 09a8f738 09a8f754 09a8f698 77f8f45c
09a8f67c 09a8f738 09a8ffdc 09a8f754 09a8f710
09a8f68c 09a8ffdc 77f8f5b5 09a8ffdc 09a8f720
09a8f69c 77f8f3fa 09a8f738 09a8ffdc 09a8f754
09a8f6ac 09a8f710 77e8615b 09a8fad4 00000000
09a8f6bc 09a8f738 74a25336 09a8f6e0 09a8f910
09a8f6cc 01dc8ad8 0d788918 00000001 018d1f28
09a8f6dc 00000001 61746164 7073612e 09a8f71c
最初のdword値は異常レコードを表します.例外のタイプに関する情報を取得するには、コマンド・プロンプトで次のように実行します.
.exr first DWORD from step 6
0:120> .exr 09a8f738
ExceptionAddress: 78011f32 (MSVCRT!strnicmp+0x00000092)
ExceptionCode: c0000005
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000000
Parameter[1]: 00000000
Attempt to read from address 00000000
2番目のdword値はコンテキストレコードです.取得するコンテキスト情報は、コマンドプロンプトで次のように実行します.
.cxr second DWORD from step 6
0:120> .cxr 09a8f754
eax=027470ff ebx=7803cb28 ecx=00000000 edx=00000000 esi=00000000 edi=09a8fad4
eip=78011f32 esp=09a8fa20 ebp=09a8fa2c iopl=0 nv up ei ng nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010286
MSVCRT!strnicmp+92:
78011f32 8a06 mov al,[esi]
kvコマンドを実行して、実際の異常な呼び出しスタックを取得します.これにより、正しく処理されていない可能性のある実際の問題を特定できます.
0:120> kv
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
09a8fa2c 780119ab 09a8fad4 00000000 09a8faa8 MSVCRT!strnicmp+0x92
09a8fa40 7801197c 09a8fad4 00000000 6d7044fd MSVCRT!stricmp+0x3c
09a8fa80 6e5a6ef6 09a8fad4 2193d68d 00e5e298 MSVCRT!stricmp+0xd
09a8fa94 6d7043bf 09a8fad4 09a8faa8 0000001c IisRTL!CLKRHashTable::FindKey+0x59 (FPO: [2,0,1])
09a8faac 749fc22d 09a8fad4 01d553b0 0000001c ISATQ!CDirMonitor::FindEntry+0x1e
(FPO: [Non-Fpo]) [D:/nt/private/inet/iis/svcs/infocomm/atq/dirmon.cpp @ 884]
09a8fac4 749fd1cb 09a8fad4 09a8fb10 525c3a46 asp!RegisterASPDirMonitorEntry+0x6e
(FPO: [EBP 0x09a8fb08] [2,0,4]) [D:/nt/private/inet/iis/svcs/cmp/asp/aspdmon.cpp @ 534]
09a8fb08 749fcdd6 00000000 09a8fcbc 018d1f28 asp!CTemplateCacheManager::RegisterTemplateForChangeNotification+0x8a
(FPO: [Non-Fpo]) [D:/nt/private/inet/iis/svcs/cmp/asp/cachemgr.cpp @ 621]
09a8fb3c 74a08bfe 00000000 000000fa 74a30958 asp!CTemplateCacheManager::Load+0x382
(FPO: [Non-Fpo]) [D:/nt/private/inet/iis/svcs/cmp/asp/cachemgr.cpp @ 364]
09a8fc68 74a0d4c9 04c12518 018d1f28 09a8fcbc asp!LoadTemplate+0x42
(FPO: [Non-Fpo]) [D:/nt/private/inet/iis/svcs/cmp/asp/exec.cpp @ 1037]
09a8fcc0 74a2c3e5 00000000 0637ee38 09a8fd58 asp!CHitObj::ViperAsyncCallback+0x3e8
(FPO: [Non-Fpo]) [D:/nt/private/inet/iis/svcs/cmp/asp/hitobj.cpp @ 2414]
09a8fcd8 787c048a 00000000 77aa1b03 01e91ed8 asp!CViperAsyncRequest::OnCall+0x3f
(FPO: [Non-Fpo]) [D:/nt/private/inet/iis/svcs/cmp/asp/viperint.cpp @ 194]
09a8fce0 77aa1b03 01e91ed8 77a536d8 00000000 COMSVCS!STAActivityWorkHelper+0xa
(FPO: [1,0,0])
09a8fd24 77aa1927 000752f8 000864dc 787c0480 ole32!EnterForCallback+0x6a
(FPO: [Non-Fpo]) [D:/nt/private/ole32/com/dcomrem/crossctx.cxx @ 1759]
09a8fe50 77aa17ea 000864dc 787c0480 01e91ed8 ole32!SwitchForCallback+0x12b
(FPO: [Non-Fpo]) [D:/nt/private/ole32/com/dcomrem/crossctx.cxx @ 1644]
09a8fe78 77aa60c1 000864dc 787c0480 01e91ed8 ole32!PerformCallback+0x50
(FPO: [Non-Fpo]) [D:/nt/private/ole32/com/dcomrem/crossctx.cxx @ 1559]
09a8fed4 77aa5fa6 04f2b4c0 787c0480 01e91ed8 ole32!CObjectContext::InternalContextCallback+0xf5
(FPO: [Non-Fpo]) [D:/nt/private/ole32/com/dcomrem/context.cxx @ 3866]
09a8fef4 787bd3c3 04f2b4c0 787c0480 01e91ed8 ole32!CObjectContext::DoCallback+0x1a
(FPO: [Non-Fpo]) [D:/nt/private/ole32/com/dcomrem/context.cxx @ 3746]
09a8ff24 787bf373 0216fb3c 00000007 09a8ffec COMSVCS!STAActivityWork::DoWork+0x73
(FPO: [0,4,2])
09a8ffb4 77e8758a 0216fe94 0216fb3c 00000007 COMSVCS!STAThread::STAThreadWorker+0x2bb
(FPO: [EBP 0x09a8ffec] [1,31,4])
09a8ffec 00000000 787bf0b8 0216fe94 00000000 KERNEL32!BaseThreadStart+0x52
(FPO: [Non-Fpo]) [D:/nt/private/windows/base/client/support.c @ 451]
_except_handler関数の場合
場合によってはスタックにUnhandledExceptionFilterがなく、_のみexcept_handler関数、これはSEH異常処理関数です.関数プロトタイプ:EXCEPTION_DISPOSITION __cdecl _except_handler( struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame, struct _CONTEXT *ContextRecord, void * DispatcherContext);この関数の最初のパラメータはEXCEPTION_を指すRECORD構造のポインタ.この構造はWINNTです.Hで定義されている、typedef struct_EXCEPTION_RECORD { DWORD ExceptionCode; DWORD ExceptionFlags; struct _EXCEPTION_RECORD *ExceptionRecord; PVOID ExceptionAddress; DWORD NumberParameters; DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];} EXCEPTION_RECORD; _except_handler関数の2番目のパラメータはestablisherフレーム構造を指すポインタである.except_handlerコールバック関数の3番目のパラメータはCONTEXT構造を指すポインタである.typedef struct _CONTEXT{ DWORD ContextFlags; DWORD Dr0; DWORD Dr1; DWORD Dr2; DWORD Dr3; DWORD Dr6; DWORD Dr7; FLOATING_SAVE_AREA FloatSave; DWORD SegGs; DWORD SegFs; DWORD SegEs; DWORD SegDs; DWORD Edi; DWORD Esi; DWORD Ebx; DWORD Edx; DWORD Ecx; DWORD Eax; DWORD Ebp; DWORD Eip; DWORD SegCs; DWORD EFlags; DWORD Esp; DWORD SegSs;} CONTEXT; _except_handlerコールバック関数の4番目のパラメータをDispatcherContextと呼ぶ.
dumpファイルを解析する場合は、コマンドプロンプトに~*kbを入力して、すべてのプロセスのスレッドをリストします.
関数呼び出しを行うスレッドKernel 32を識別します!except_handler. 次のように見えます.
9 Id: 918.117c Suspend: 2 Teb: 7ffd8000 Unfrozen
ChildEBP RetAddr Args to Child
085df400 7c9232a8 085df4ec 085dffdc 085df50c kernel32!_except_handler3+0x61
085df424 7c92327a 085df4ec 085dffdc 085df50c ntdll!ExecuteHandler2+0x26
085df4d4 7c92e48a 00000000 085df50c 085df4ec ntdll!ExecuteHandler+0x24
このスレッドに切り替えます(この例では、スレッドは「~9 s」).
Kernel32! !_except_handlerの最初のパラメータdword値は異常レコードを表します.例外のタイプに関する情報を取得するには、コマンドプロンプトで次のように実行します.exr first DWORD from step 5
0:009> .exr 085df4ec
ExceptionAddress: 7c812afb (kernel32!RaiseException+0x00000053)
ExceptionCode: e06d7363 (C++ EH exception)
ExceptionFlags: 00000001
NumberParameters: 3
Parameter[0]: 19930520
Parameter[1]: 085df874
Parameter[2]: 006c010c
Kernel32! !_except_handlerの3番目のパラメータdword値はコンテキストレコードです.取得するコンテキスト情報は、コマンドプロンプトで次のように実行します.
.cxr second DWORD from step 6
0:009> .cxr 085df50c
eax=085df7dc ebx=00005d34 ecx=00000000 edx=01240608 esi=085df864 edi=00100000
eip=7c812afb esp=085df7d8 ebp=085df82c iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000206
kernel32!RaiseException+0x53:
7c812afb 5e pop esi
kvコマンドを実行して、実際の異常な呼び出しスタックを取得します.これにより、正しく処理されていない可能性のある実際の問題を特定できます.
0:009> kv
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
09a8fa2c 780119ab 09a8fad4 00000000 09a8faa8 MSVCRT!strnicmp+0x92
09a8fa40 7801197c 09a8fad4 00000000 6d7044fd MSVCRT!stricmp+0x3c
09a8fa80 6e5a6ef6 09a8fad4 2193d68d 00e5e298 MSVCRT!stricmp+0xd