使用Windbg调试系统弹出的内存不可读错误
步骤:
1. 使用Windbg挂钩到崩溃的进程上面
2. 使用~*k列出所有线程
3. 搜索UnhandledExceptionFilter所在的线程
4. 使用~ns切换到上面崩溃所在的线程,n为线程前面的序号
5.使用kv显示线程调用堆栈
6,可以看到02af7740 7c83ab50 02af7768 7c839b39 02af7770 kernel32!UnhandledExceptionFilter+0x628 (FPO: [Non-Fpo])类似的语句,第一个参数02af7768 此指向 EXCEPTION_POINTERS 结构
0:010> dd 02af7768
02af7768 02af785c 02af7878 02af7794 7c9232a8
02af7778 02af785c 02afffdc 02af7878 02af7830
02af7788 02afdc20 7c9232bc 02afffdc 02af7844
02af7798 7c92327a 02af785c 02afffdc 02af7878
02af77a8 02af7830 7c839ad8 00000001 02af785c
02af77b8 02afffdc 7c94a9ef 02af785c 02afffdc
02af77c8 02af7878 02af7830 7c839ad8 1e817ad0
02af77d8 02af785c 1e817ad0 00000000 00000000
第一个 DWORD 代表异常记录。 若要获取有关异常的类型信息,请请在命令提示符处运行以下:
.exr first DWORD
0:010> .exr 02af785c
ExceptionAddress: 4ae9f47d (gdiplus!ScanOperation::Blend_sRGB_sRGB_MMX+0x00000043)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000001
Parameter[1]: 1e817ad0
Attempt to write to address 1e817ad0
第二个 DWORD 是上下文记录。
若要获取上下文的信息,请在命令提示符处运行以下:
.cxr second DWORD
0:010> .cxr
02af7878
eax=ffffffff ebx=07188a48 ecx=000003cc edx=000000ff esi=1e817ad0 edi=1e817ad0
eip=4ae9f47d esp=02af7b44 ebp=02af7b58 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010246
gdiplus!ScanOperation::Blend_sRGB_sRGB_MMX+0x43:
4ae9f47d 8907 mov dword ptr [edi],eax ds:0023:1e817ad0=????????