崩溃捕捉的dump没有提供堆栈的问题


前两天客户现场出现了崩溃,但是程序捕捉生成的dump文件大小为0kb,没有办法只能通过任务管理器创建转储文件进行分析。
输入 !analyze -v 命令输出如下:

(Windbg调试八)崩溃捕捉的dump没有提供堆栈的问题_异常类型
通过此堆栈信息看不出任何崩溃的具体原因。再输入 ~*kv 命令查看所有线程的堆栈:
(Windbg调试八)崩溃捕捉的dump没有提供堆栈的问题_异常类型_02
可以看到崩溃的线程,输入 ~56s 切换到该线程,再输入 kv 查看该线程的堆栈如下:
(Windbg调试八)崩溃捕捉的dump没有提供堆栈的问题_异常记录_03

注意UnhandledExceptionFilterEx函数只有一个参数,也就是EXCEPTION_POINTERS指针,输入 dd 0fe8e67c

查看该地址的内存: (Windbg调试八)崩溃捕捉的dump没有提供堆栈的问题_异常记录_04
我们再来看EXCEPTION_POINTERS结构:

(Windbg调试八)崩溃捕捉的dump没有提供堆栈的问题_数据_05
PEXCEPTION_RECORD结构定义如下:
(Windbg调试八)崩溃捕捉的dump没有提供堆栈的问题_堆栈_06
第一个 dword 值表示异常记录, 输入 .exr 0fe8e7bc 查看异常类型信息:
(Windbg调试八)崩溃捕捉的dump没有提供堆栈的问题_堆栈_07
可以看到,该崩溃是由于对null地址写入造成的。
第二个 dword 值是上下文记录,再输入 .cxr 0fe8e80c 查看该地址的上下文:

(Windbg调试八)崩溃捕捉的dump没有提供堆栈的问题_异常记录_08
通过这个异常记录可以看到是调用memcpy出错的,再结合上面的异常类型,基本可以确定是调用memcpy给null地址写入数据时崩溃的。
输入 kv 命令以获得实际的异常的调用堆栈:
(Windbg调试八)崩溃捕捉的dump没有提供堆栈的问题_数据_09

终于看到了熟悉的堆栈信息,输入 .frame 1 进入具体的代码,可以看到memcpy的第一个参数值确实为null,也就是malloc失败,进一步分析发现是程序内存泄漏导致的。