WinDbg 尋找問題異常堆棧,堆疊追蹤UnhandledExceptionFilter

來源:互聯網
上載者:User

 1.UnhandledExceptionFilter 函數調用時沒有例外處理常式定義來處理引發的異常。 函數通常將異常傳遞達 Ntdll.DLL 檔案這將捕捉並試圖處理它。

在該進程的記憶體快照存在某些情況下,您可以看到到一個線程持有鎖點的線程調用的 UnhandledExceptionFilter 函數。 在這些情況中您可以按照本文標識導致異常的 DLL 中的步驟。
Windbg.exe 開啟轉儲檔案
1.下載並安裝偵錯工具。 要下載偵錯工具,請訪問下面的 Microsoft 網站:
Microsoft 調試工具
http://www.microsoft.com/whdc/devtools/ddk/default.mspx (http://www.microsoft.com/whdc/devtools/ddk/default.mspx)
2.轉到windbg目錄,採用工具cdb產生dump檔案:cdb -pv -pn 進程名 -c ".dump /m c:/檔案名稱.dmp;q",例如:cdb -pv -pn explorer.exe -c ".dump /m c:/explorer.dmp;q"
3.開啟該調試器的安裝位置檔案夾,然後雙擊 Windbg.exe 以啟動調試器。
4.在 檔案 菜單上單擊 開啟損毀傾印 (或按 CTRL + D),然後選擇您要查看該轉儲檔案。
' 異常堆棧使用 Windbg.exe
1.在 Windbg.exe,開啟.dmp 檔案,該進程。
2.請確保以正確的位置指向符號路徑。 有關如何執行此操作的詳細資料請訪問下面的 Microsoft 網站:
如何擷取符號
http://www.microsoft.com/whdc/devtools/ddk/default.mspx (http://www.microsoft.com/whdc/devtools/ddk/default.mspx)
3.在命令提示字元處鍵入 ~*kb 要列出所有進程中線程。
4.標識進行函數調用的線程 Kernel32! 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+0x65D:/nt/private/windows/base/client/support.c @ 453]

 

5.切換到該線程 (在此樣本中,線程是"~ 120s")。

6.顯示記憶體內容的第一個參數指定位置處 Kernel32! 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

 

 

7.第一個 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

 

8.第二個 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]

 

9.運行 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函數的情況


1.有些情況下堆棧中沒有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 函數的第二個參數是一個指向establisher幀結構的指標。
_except_handler 回呼函數的第三個參數是一個指向 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 回呼函數的第四個參數被稱為DispatcherContext。

2.分析dump檔案時,在命令提示字元處鍵入 ~*kb 要列出所有進程中線程。

 
3.標識進行函數調用的線程 Kernel32!_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

 

4.切換到該線程 (在此樣本中,線程是"~ 9s")。

 
5.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

 

6.Kernel32! !_except_handler第三個參數 dword 值是上下文記錄。 要擷取的上下文資訊,請在命令提示字元處運行以下:
.cxr second DWORD from step 6
0:009> .cxr 085df50c

eax=085df7dc ebx=00005d34 ecx=00000000 edx=01240608 esi=085df864 edi=00100000eip=7c812afb esp=085df7d8 ebp=085df82c iopl=0         nv up ei pl nz na pe nccs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206kernel32!RaiseException+0x53:7c812afb 5e              pop     esi

 

7.運行 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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.