博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
21.windbg-.lastevent、!analyze(dump分析、异常错误码查询)
阅读量:2392 次
发布时间:2019-05-10

本文共 5918 字,大约阅读时间需要 19 分钟。

原文地址:

.lastevent

.lastevent 命令显示最近一次发生的异常或事件。

[cpp]
  1. 0:000> .lastevent  
  2. Last event: 1534.f4c: Break instruction exception - code 80000003 (first chance)  
  3.   debugger time: Tue May 22 10:47:26.962 2012 (GMT+8)  
  4. 0:000> ~  
  5. .  0  Id: 1534.e8c Suspend: 1 Teb: 7ffdf000 Unfrozen  
  6.    1  Id: 1534.1338 Suspend: 1 Teb: 7ffde000 Unfrozen  
  7. #  2  Id: 1534.f4c Suspend: 1 Teb: 7ffdd000 Unfrozen  

我们可以看出,当前为2号线程发生异常,线程0前面的点号(.)表示它是当前线程。线程2前面的数字号(#)表示它是产生异常或调试器附加到进程时活动的线程。如果使用CTRL+C、 CTRL+BREAK或Debug | Break中断到调试器,总是会产生一个 0x80000003异常代码。

[cpp]
  1. 0:000> .lastevent  
  2. Last event: 1664.4184: Access violation - code c0000005 (first/second chance not available)  
  3.   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

分析参考:

如下述为一个对NULL指针赋值生成的dump,自动生成dump可以参考

[cpp]
  1. 0:000> !analyze -v  
  2. *******************************************************************************  
  3. *                                                                             *  
  4. *                        Exception Analysis                                   *  
  5. *                                                                             *  
  6. *******************************************************************************  
  7.   
  8. *************************************************************************  
  9. ***                                                                   ***  
  10. ***                                                                   ***  
  11. ***    Your debugger is not using the correct symbols                 ***  
  12. ***                                                                   ***  
  13. ***    In order for this command to work properly, your symbol path   ***  
  14. ***    must point to .pdb files that have full type information.      ***  
  15. ***                                                                   ***  
  16. ***    Certain .pdb files (such as the public OS symbols) do not      ***  
  17. ***    contain the required information.  Contact the group that      ***  
  18. ***    provided you with these symbols if you need this command to    ***  
  19. ***    work.                                                          ***  
  20. ***                                                                   ***  
  21. ***    Type referenced: kernel32!pNlsUserInfo                         ***  
  22. ***                                                                   ***  
  23. *************************************************************************  
  24. *************************************************************************  
  25. ***                                                                   ***  
  26. ***                                                                   ***  
  27. ***    Your debugger is not using the correct symbols                 ***  
  28. ***                                                                   ***  
  29. ***    In order for this command to work properly, your symbol path   ***  
  30. ***    must point to .pdb files that have full type information.      ***  
  31. ***                                                                   ***  
  32. ***    Certain .pdb files (such as the public OS symbols) do not      ***  
  33. ***    contain the required information.  Contact the group that      ***  
  34. ***    provided you with these symbols if you need this command to    ***  
  35. ***    work.                                                          ***  
  36. ***                                                                   ***  
  37. ***    Type referenced: kernel32!pNlsUserInfo                         ***  
  38. ***                                                                   ***  
  39. *************************************************************************  
首先被提示,这是没有pdb文件 的
[cpp]
  1. FAULTING_IP:   
  2. test2+1002  
  3. 01211002 8900            mov     dword ptr [eax],eax  
FAULTING_IP:出现错误时的指令,这句明显就是把eax赋到[eax]中
[cpp]
  1. EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)  
EXCEPTION_RECORD:崩溃时的异常记录,可以使用.exr查看
[cpp]
  1. ExceptionAddress: 01211002 (test2+0x00001002)  
  2.    ExceptionCode: c0000005 (Access violation)  
  3.   ExceptionFlags: 00000000  
  4. NumberParameters: 2  
  5.    Parameter[0]: 00000001  
  6.    Parameter[1]: 00000000  
  7. Attempt to write to address 00000000  
这个就很详细了,尝试向0地址写入,它其实就是调试中用到的结构体:可以直接通过MSDN查到它的定义
[cpp]
  1. typedef struct _EXCEPTION_RECORD {  
  2.     DWORD    ExceptionCode;  
  3.     DWORD ExceptionFlags;  
  4.     struct _EXCEPTION_RECORD *ExceptionRecord;  
  5.     PVOID ExceptionAddress;  
  6.     DWORD NumberParameters;  
  7.     ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];  
  8.     } 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]
  1. DEFAULT_BUCKET_ID:  NULL_POINTER_READ  
DEFAULT_BUCKET_ID:表示了本次错误属于哪种通用失败
[cpp]
  1. 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]
  1. 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 address0x76b6337acalled a function at 0x1211002. You can use these addresses with the  command to determine what modules and functions these addresses reside in.

[cpp]
  1. STACK_TEXT:    
  2. WARNING: Stack unwind information not available. Following frames may be wrong.  
  3. 0020fbb8 76b6337a 7efde000 0020fc04 77e092b2 test2+0x1002  
  4. 0020fbc4 77e092b2 7efde000 596d1564 00000000 kernel32!BaseThreadInitThunk+0xe  
  5. 0020fc04 77e09285 012112b6 7efde000 00000000 ntdll!__RtlUserThreadStart+0x70  
  6. 0020fc1c 00000000 012112b6 7efde000 00000000 ntdll!_RtlUserThreadStart+0x1b  
堆信息

[cpp]
  1. STACK_COMMAND:  ~0s; .ecxr ; kb  
打印堆栈的命令

[cpp]
  1. SYMBOL_NAME:  test2+1002  
对应的符号名称

[cpp]
  1. IMAGE_NAME:  test2.exe  
对应的模块名称

3.符号文件简介:

符号文件对于调试程序是相当重要的,通常符号文件中包含以下内容

全局变量的名字和地址

函数名,地址及其原型

帧指针优化数据

局部变量的名字和地址

源文件路径以及每个符号的行号

变量,结构等的类型信息

转载地址:http://iehab.baihongyu.com/

你可能感兴趣的文章
利用 TensorFlow 一步一步构建一个多任务学习模型
查看>>
使用数据驱动进行配对交易:简单交易策略
查看>>
量化交易:相关系数
查看>>
课程---程序员炒股,如何计算股票投资组合的风险和收益
查看>>
人工智能资料库:第1辑(20170105)
查看>>
人工智能资料库:第2辑(20170106)
查看>>
人工智能资料库:第3辑(20170107)
查看>>
人工智能资料库:第4辑(20170108)
查看>>
人工智能资料库:第5辑(20170109)
查看>>
人工智能资料库:第6辑(20170110)
查看>>
人工智能资料库:第18辑(20170127)
查看>>
人工智能资料库:第19辑(20170128)
查看>>
人工智能资料库:第20辑(20170129)
查看>>
人工智能资料库:第21辑(20170130)
查看>>
人工智能资料库:第22辑(20170131)
查看>>
人工智能资料库:第23辑(20170201)
查看>>
MongoDB-初体验
查看>>
TensorFlow中四种-Cross-Entropy-算法实现和应用
查看>>
不可不知的python陷阱
查看>>
进程管理工具--supervisor
查看>>