!analyze命令簡介
這個!analyze擴展顯示有關當前異常或錯誤檢查的信息。
用戶模式:
!analyze [-v] [-f | -hang] [-D BucketID] !analyze -c [-load KnownIssuesFile | -unload | -help ]
內核模式:
!analyze [-v] [-f | -hang] [-D BucketID] !analyze -c [-load KnownIssuesFile | -unload | -help ] !analyze -show BugCheckCode [BugParameters]
參數:
- -v
顯示詳細輸出。 - -f
生成!analyze異常輸出。 即使調試器未檢測到異常,也可以使用此參數查看異常分析。 - -hang
生成!analyze -hang的應用程序輸出。當目標遇到錯誤檢查或異常,但分析應用程序掛起的原因與您的問題更相關時,請使用此參數。在內核模式下,!analyze-hang調查系統持有的鎖,然后掃描dpc隊列鏈。在用戶模式下,!analyze-hang分析線程堆棧,以確定是否有任何線程正在阻塞其他線程。在以用戶模式運行此擴展之前,請考慮將當前線程更改為您認為已停止響應的線程(即掛起),因為異常可能已將當前線程更改為其他線程。 - -D BucketID
僅顯示與指定bucketid相關的項。 - -show BugCheckCode [BugParameters]
顯示有關由錯誤檢查代碼指定的錯誤檢查的信息。BugParameters最多指定四個由空格分隔的錯誤檢查參數。這些參數使您能夠進一步優化搜索。 - -c
當調試器遇到已知問題時繼續執行。如果問題不是“已知”問題,則調試器仍會被分解到目標中。 可以使用 -c具有以下子參數選項。 這些子參數配置已知問題的列表。 它們不會導致進行單獨執行。 直到你運行 !analyze -c 加載至少一次 ! 分析 -c沒有任何影響。加載指定的已知問題文件。knownissuesfile指定此文件的路徑和文件名。此文件必須為XML格式。您可以在調試器安裝目錄的sdk\samples\analyze_continue子目錄中找到一個示例文件。(要使Windows具有此文件,必須已執行調試工具的完整安裝。)known issues file文件中的已知問題列表將用於所有以后的-c命令,直到使用-c-unload或再次使用-c-load(此時新數據將替換舊數據)。
-load KnownIssuesFile
-unload
卸載當前已知問題列表。
-help
在調試器命令窗口中顯示此命令的幫助。
此命令對於用戶模式異常和內核模式停止錯誤(即崩潰)的樣本進行分析,在用戶模式下,顯示有關當前異常的信息。在內核模式下,顯示有關最新錯誤檢查的信息。如果出現錯誤檢查,顯示信息自動生成。
!analyze的使用
調試崩潰的目標計算機或應用程序的第一步是使用!analyze擴展命令。這個擴展執行大量的自動化分析。此分析的結果將顯示在調試器命令窗口中。您應該使用-v選項來完全詳細地顯示數據。
用戶模式!analyze -v示例
在本例中,調試器附加到遇到異常的用戶模式應用程序
0:000> !analyze -v ******************************************************************************* * * * Exception Analysis * * * ******************************************************************************* Debugger SolutionDb Connection::Open failed 80004005
如果已連接到Internet,調試器將嘗試訪問由Microsoft維護的故障解決方案數據庫。在這種情況下,將顯示一條錯誤消息,指示您的計算機無法訪問Internet或網站不工作。
FAULTING_IP: ntdll!PropertyLengthAsVariant+73 77f97704 cc int 3
FAULTING_IP字段顯示發生故障時的指令指針。
EXCEPTION_RECORD: ffffffff -- (.exr ffffffffffffffff) ExceptionAddress: 77f97704 (ntdll!PropertyLengthAsVariant+0x00000073) ExceptionCode: 80000003 (Break instruction exception) ExceptionFlags: 00000000 NumberParameters: 3 Parameter[0]: 00000000 Parameter[1]: 00010101 Parameter[2]: ffffffff
異常記錄字段顯示此崩潰的異常記錄。也可以使用.exr(顯示異常記錄)命令查看此信息。
BUGCHECK_STR: 80000003
BUGCHECK_STR字段顯示異常代碼。這個名字用詞不當,術語bug check實際上表示內核模式崩潰。在用戶模式調試中,在此情況下將顯示異常代碼0x80000003。
DEFAULT_BUCKET_ID: APPLICATION_FAULT
DEFAULT_BUCKET_ID字段顯示此故障所屬的一般故障類別。
PROCESS_NAME: MyApp.exe
PROCESS_NAME字段指定引發異常的進程的名稱。
LAST_CONTROL_TRANSFER: from 01050963 to 77f97704
LAST_CONTROL_TRANSFER字段顯示堆棧上的最后一次調用。在這種情況下,地址0x01050963處的代碼調用了0x77f97704處的函數。您可以將這些地址與ln (List Nearest Symbols)命令一起使用,以確定這些地址所在的模塊和函數。
STACK_TEXT: 0006b9dc 01050963 00000000 0006ba04 000603fd ntdll!PropertyLengthAsVariant+0x73 0006b9f0 010509af 00000002 0006ba04 77e1a449 MyApp!FatalErrorBox+0x55 [D:\source_files\MyApp\util.c @ 541] 0006da04 01029f4e 01069850 0000034f 01069828 MyApp!ShowAssert+0x47 [D:\source_files\MyApp\util.c @ 579] 0006db6c 010590c3 000e01ea 0006fee4 0006feec MyApp!SelectColor+0x103 [D:\source_files\MyApp\colors.c @ 849] 0006fe04 77e11d0a 000e01ea 00000111 0000413c MyApp!MainWndProc+0x1322 [D:\source_files\MyApp\MyApp.c @ 1031] 0006fe24 77e11bc8 01057da1 000e01ea 00000111 USER32!UserCallWinProc+0x18 0006feb0 77e172b4 0006fee4 00000001 010518bf USER32!DispatchMessageWorker+0x2d0 0006febc 010518bf 0006fee4 00000000 01057c5d USER32!DispatchMessageA+0xb 0006fec8 01057c5d 0006fee4 77f82b95 77f83920 MyApp!ProcessQCQPMessage+0x3b [D:\source_files\MyApp\util.c @ 2212] 0006ff70 01062cbf 00000001 00683ed8 00682b88 MyApp!main+0x1e6 [D:\source_files\MyApp\MyApp.c @ 263] 0006ffc0 77e9ca90 77f82b95 77f83920 7ffdf000 MyApp!mainCRTStartup+0xff [D:\source_files\MyApp\crtexe.c @ 338] 0006fff0 00000000 01062bc0 00000000 000000c8 KERNEL32!BaseProcessStart+0x3d
STACK_TEXT字段顯示故障線程的堆棧跟蹤。
FOLLOWUP_IP: MyApp!FatalErrorBox+55 01050963 5e pop esi FOLLOWUP_NAME: dbg SYMBOL_NAME: MyApp!FatalErrorBox+55 MODULE_NAME: MyApp IMAGE_NAME: MyApp.exe DEBUG_FLR_IMAGE_TIMESTAMP: 383490a9
當!
analyze確定可能導致錯誤的指令時,它在FOLLOWUP_IP字段中顯示該指令。symbol_name、module_name、image_name和dbg_flr_image_timestamp字段顯示與此指令對應的symbol、module、image name和image timestamp。
STACK_COMMAND: .ecxr ; kb
STACK_COMMAND字段顯示用於獲取堆棧文本的命令。您可以使用此命令重復此堆棧跟蹤顯示,或更改它以獲取相關的堆棧信息。
BUCKET_ID: 80000003_MyApp!FatalErrorBox+55
BUCKET_ID字段顯示當前故障所屬的特定故障類別。此類別有助於調試器確定要在分析輸出中顯示的其他信息。