在程序崩溃后附加windbg,.dump生成的dmp文件并不是直接保存着程序崩溃时的状况,而是保持着windows在做崩溃处理时的状况,因此此时的调用堆栈并不是崩溃时的调用堆栈。 下面是实际崩溃时的调用栈
下面是崩溃处理时的调用栈
两个调用栈中都有,对比一下可以猜测是__RtlUserThreadStart中启动程序,崩溃后回到__RtlUserThreadStart中,接着调用UnhandledExceptionFilter,进行异常处理,函数原型如下 LONG WINAPI UnhandledExceptionFilter( In struct _EXCEPTION_POINTERS *ExceptionInfo); 参数中有个 struct _EXCEPTION_POINTERS 指针,用于传递异常信息
typedef struct _EXCEPTION_POINTERS { PEXCEPTION_RECORD ExceptionRecord; //异常记录 PCONTEXT ContextRecord; //异常上下文 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS; 使用 .exr ExceptionRecord 可以获得异常的一些基本信息,包括发生异常的位置,异常编号,基本的说明等 .cxr ContextRecord 可以获得异常时的一些上下文信息,包括寄存器状态,代码,调用栈等
注:附加后dump下来会有多个线程,要进行线程切换找到异常的线程,线程相关命令 ~编号[操作],编号可以是*,表示所有线程, 操作可以有k -输出调用栈,s-切换线程