生活随笔
收集整理的這篇文章主要介紹了
.lastevent、!analyze(dump分析、异常错误码查询)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
.lastevent
.lastevent ?命令顯示最近一次發生的異常或事件。
[cpp] ?view plaincopy
0:000>?.lastevent?? Last?event:?1534.f4c:?Break?instruction?exception?-?code?80000003?(first?chance)?? ??debugger?time:?Tue?May?22?10:47:26.962?2012?(GMT+8)?? 0:000>?~?? .??0??Id:?1534.e8c?Suspend:?1?Teb:?7ffdf000?Unfrozen?? ???1??Id:?1534.1338?Suspend:?1?Teb:?7ffde000?Unfrozen?? #??2??Id:?1534.f4c?Suspend:?1?Teb:?7ffdd000?Unfrozen ??
我們可以看出,當前為2號線程發生異常,線程0前面的點號(.)表示它是當前線程。線程2前面的數字號(#)表示它是產生異常或調試器附加到進程時活動的線程。如果使用CTRL+C、 CTRL+BREAK或Debug | Break中斷到調試器,總是會產生一個 0x80000003異常代碼。
[cpp] ?view plaincopy
0:000>?.lastevent?? Last?event:?1664.4184:?Access?violation?-?code?c0000005?(first/second?chance?not?available)?? ??debugger?time:?Thu?Aug?13?11:20:44.037?2015?(GMT+8)??
異常錯誤碼查詢
異常 值 描述 EXCEPTION_ACCESS_VIOLATION 0xC0000005 程序企圖讀寫一個不可訪問的地址時引發的異常。例如企圖讀取0地址處的內存。 EXCEPTION_ARRAY_BOUNDS_EXCEEDED 0xC000008C 數組訪問越界時引發的異常。 EXCEPTION_BREAKPOINT 0x80000003 觸發斷點時引發的異常。 EXCEPTION_DATATYPE_MISALIGNMENT 0x80000002 程序讀取一個未經對齊的數據時引發的異常。 EXCEPTION_FLT_DENORMAL_OPERAND 0xC000008D 如果浮點數操作的操作數是非正常的,則引發該異常。所謂非正常,即它的值太小以至于不能用標準格式表示出來。 EXCEPTION_FLT_DIVIDE_BY_ZERO 0xC000008E 浮點數除法的除數是0時引發該異常。 EXCEPTION_FLT_INEXACT_RESULT 0xC000008F 浮點數操作的結果不能精確表示成小數時引發該異常。 EXCEPTION_FLT_INVALID_OPERATION 0xC0000090 該異常表示不包括在這個表內的其它浮點數異常。 EXCEPTION_FLT_OVERFLOW 0xC0000091 浮點數的指數超過所能表示的最大值時引發該異常。 EXCEPTION_FLT_STACK_CHECK 0xC0000092 進行浮點數運算時棧發生溢出或下溢時引發該異常。 EXCEPTION_FLT_UNDERFLOW 0xC0000093 浮點數的指數小于所能表示的最小值時引發該異常。 EXCEPTION_ILLEGAL_INSTRUCTION 0xC000001D 程序企圖執行一個無效的指令時引發該異常。 EXCEPTION_IN_PAGE_ERROR 0xC0000006 程序要訪問的內存頁不在物理內存中時引發的異常。 EXCEPTION_INT_DIVIDE_BY_ZERO 0xC0000094 整數除法的除數是0時引發該異常。 EXCEPTION_INT_OVERFLOW 0xC0000095 整數操作的結果溢出時引發該異常。 EXCEPTION_INVALID_DISPOSITION 0xC0000026 異常處理器返回一個無效的處理的時引發該異常。 EXCEPTION_NONCONTINUABLE_EXCEPTION 0xC0000025 發生一個不可繼續執行的異常時,如果程序繼續執行,則會引發該異常。 EXCEPTION_PRIV_INSTRUCTION 0xC0000096 程序企圖執行一條當前CPU模式不允許的指令時引發該異常。 EXCEPTION_SINGLE_STEP 0x80000004 標志寄存器的TF位為1時,每執行一條指令就會引發該異常。主要用于單步調試。 EXCEPTION_STACK_OVERFLOW 0xC00000FD 棧溢出時引發該異常。
!analyze
!analyze擴展顯示當前異常或bug check的信息。一般使用!analyze -v
分析參考:https://msdn.microsoft.com/en-us/library/windows/hardware/ff560201(v=vs.85).aspx
如下述為一個對NULL指針賦值生成的dump,自動生成dump可以參考16.windbg-.dump(轉儲文件)
[cpp] ?view plaincopy
0:000>?!analyze?-v?? *******************************************************************************?? *?????????????????????????????????????????????????????????????????????????????*?? *????????????????????????Exception?Analysis???????????????????????????????????*?? *?????????????????????????????????????????????????????????????????????????????*?? *******************************************************************************?? ?? *************************************************************************?? ***???????????????????????????????????????????????????????????????????***?? ***???????????????????????????????????????????????????????????????????***?? ***????Your?debugger?is?not?using ?the?correct?symbols?????????????????***?? ***???????????????????????????????????????????????????????????????????***?? ***????In?order?for ? this ?command?to?work?properly,?your?symbol?path???***?? ***????must?point?to?.pdb?files?that?have?full?type?information.??????***?? ***???????????????????????????????????????????????????????????????????***?? ***????Certain?.pdb?files?(such?as?the?public ?OS?symbols)? do ?not??????***?? ***????contain?the?required?information.??Contact?the?group?that??????***?? ***????provided?you?with?these?symbols?if ?you?need? this ?command?to????***?? ***????work.??????????????????????????????????????????????????????????***?? ***???????????????????????????????????????????????????????????????????***?? ***????Type?referenced:?kernel32!pNlsUserInfo?????????????????????????***?? ***???????????????????????????????????????????????????????????????????***?? *************************************************************************?? *************************************************************************?? ***???????????????????????????????????????????????????????????????????***?? ***???????????????????????????????????????????????????????????????????***?? ***????Your?debugger?is?not?using ?the?correct?symbols?????????????????***?? ***???????????????????????????????????????????????????????????????????***?? ***????In?order?for ? this ?command?to?work?properly,?your?symbol?path???***?? ***????must?point?to?.pdb?files?that?have?full?type?information.??????***?? ***???????????????????????????????????????????????????????????????????***?? ***????Certain?.pdb?files?(such?as?the?public ?OS?symbols)? do ?not??????***?? ***????contain?the?required?information.??Contact?the?group?that??????***?? ***????provided?you?with?these?symbols?if ?you?need? this ?command?to????***?? ***????work.??????????????????????????????????????????????????????????***?? ***???????????????????????????????????????????????????????????????????***?? ***????Type?referenced:?kernel32!pNlsUserInfo?????????????????????????***?? ***???????????????????????????????????????????????????????????????????***?? *************************************************************************?? 首先被提示,這是沒有pdb文件 的
[cpp] ?view plaincopy
FAULTING_IP:??? test2+1002?? 01211002?8900????????????mov?????dword?ptr?[eax],eax?? FAULTING_IP:出現錯誤時的指令,這句明顯就是把eax賦到[eax]中
[cpp] ?view plaincopy
EXCEPTION_RECORD:??ffffffff?--?(.exr?0xffffffffffffffff)?? EXCEPTION_RECORD:崩潰時的異常記錄,可以使用.exr查看
[cpp] ?view plaincopy
ExceptionAddress:?01211002?(test2+0x00001002)?? ???ExceptionCode:?c0000005?(Access?violation)?? ??ExceptionFlags:?00000000?? NumberParameters:?2?? ???Parameter[0]:?00000001?? ???Parameter[1]:?00000000?? Attempt?to?write?to?address?00000000?? 這個就很詳細了,嘗試向0地址寫入,它其實就是調試中用到的結構體:可以直接通過MSDN查到它的定義
[cpp] ?view plaincopy
typedef ? struct ?_EXCEPTION_RECORD?{?? ????DWORD ????ExceptionCode;?? ????DWORD ?ExceptionFlags;?? ????struct ?_EXCEPTION_RECORD?*ExceptionRecord;?? ????PVOID ?ExceptionAddress;?? ????DWORD ?NumberParameters;?? ????ULONG_PTR ?ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];?? ????}?EXCEPTION_RECORD;?? 注意的是:上面的NumberParameter:2表示ExceptionInformation有兩個附加異常碼,1和0,對于多數異常來說,這些附加異常碼是沒有什么用的,MSDN:
For most exception codes, the array elements are undefined.只有以下兩個被定義了
當ExceptionCode為 EXCEPTION_ACCESS_VIOLATION時,ExceptionInformation[0]=0表示線程試圖讀取不可訪問的數據ExceptionInformation[0]=1
表示線程試圖寫入不可訪問的地址,很明顯,這里表示第二種,具體參考MSDN
[cpp] ?view plaincopy
DEFAULT_BUCKET_ID:??NULL_POINTER_READ?? DEFAULT_BUCKET_ID:表示了本次錯誤屬于哪種通用失敗
[cpp] ?view plaincopy
BUGCHECK_STR:??APPLICATION_FAULT_NULL_POINTER_READ_NULL_POINTER_WRITE?? The BUGCHECK_STR field shows the exception code. The name is a misnomer—the term? bug check ?actually signifies a kernel-mode crash. In user-mode debugging, the exception code will be displayed—in this case, 0x80000003.
[cpp] ?view plaincopy
LAST_CONTROL_TRANSFER:??from?76b6337a?to?01211002?? 堆棧的最后調用:
The LAST_CONTROL_TRANSFER field shows the last call on the stack. In this case, the code at address0x76b6337a called a function at 0x1211002. You can use these addresses with the? ln (List Nearest Symbols) ?command to determine what modules and functions these addresses reside in.
[cpp] ?view plaincopy
STACK_TEXT:???? WARNING:?Stack?unwind?information?not?available.?Following?frames?may?be?wrong.?? 0020fbb8?76b6337a?7efde000?0020fc04?77e092b2?test2+0x1002?? 0020fbc4?77e092b2?7efde000?596d1564?00000000?kernel32!BaseThreadInitThunk+0xe?? 0020fc04?77e09285?012112b6?7efde000?00000000?ntdll!__RtlUserThreadStart+0x70?? 0020fc1c?00000000?012112b6?7efde000?00000000?ntdll!_RtlUserThreadStart+0x1b?? 堆信息
[cpp] ?view plaincopy
STACK_COMMAND:??~0s;?.ecxr?;?kb?? 打印堆棧的命令
[cpp] ?view plaincopy
SYMBOL_NAME:??test2+1002?? 對應的符號名稱
[cpp] ?view plaincopy
IMAGE_NAME:??test2.exe?? 對應的模塊名稱
3.符號文件簡介:
符號文件對于調試程序是相當重要的,通常符號文件中包含以下內容
全局變量的名字和地址
函數名,地址及其原型
幀指針優化數據
局部變量的名字和地址
源文件路徑以及每個符號的行號
變量,結構等的類型信息
新人創作打卡挑戰賽 發博客就能抽獎!定制產品紅包拿不停!
總結
以上是生活随笔 為你收集整理的.lastevent、!analyze(dump分析、异常错误码查询) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。