原文:
一、什么是Dump文件
又叫内存转储文件或者叫内存快照文件。是一个进程或系统在某一给定的时间的快照。比如在进程崩溃时或则进程有其他问题时,甚至是任何时候,我们都可以通过工具将系统或某进程的内存备份出来供调试分析用。dump文件中包含了程序运行的模块信息、线程信息、堆栈调用信息、异常信息等数据。
二、分类
Windows下Dump文件分为两大类:内核模式Dump和用户模式Dump
2.1、内核模式Dump
是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump。如果你抓取整个系统的内存dump文件, 那么你抓取的是内核态的dump文件.
2.2、用户模式Dump
如果你抓一个进程的dump文件, 那么你抓取的是用户态的dump文件。进一步可以分为完整Dump(Full Dump)和迷你Dump(Minidump)。
- Full Dump
包含了某个进程完整的地址空间数据,以及许多用于调试的信息 - Minidump
随着Windows XP,微软发布了一组新的被称为“minidump”的崩溃转存技术。Minidump很容易定制。按照最常用的配置,一个minidump只包括了最必要的信息,用于恢复故障进程的所有线程的调用堆栈,以及查看故障时刻局部变量的值。这样的dump文件通常很小(只有几K字节)。所以,很容易通过电子方式发送给软件开发人员。一旦需要,minidump甚至可以包含比原来的crash dump更多的信息。minidump可以定制,给我们带来了一个问题-保存多少应用程序状态信息才能既保证调试有效,又能够尽量保证minidump文件尽可能小?尽管调试简单的异常访问只需要调用堆栈和局部变量的信息,但是解决更复杂的问题需要更多的信息。例如,我们可能需要查看全局变量的值、检查堆的完整性和分析进程虚拟内存的布局。同时,可执行程序的代码段往往是多余的,开发用的机器上可以很容易找到这些执行程序。
三、Dump文件的使用场景
场景一:对我们程序员来说,当我们的应用程序发布出去,在客户机上线出了问题(崩溃、失去响应、资源消耗过高,性能不理想),由于这些问题不是发生在开发环境下的,这时我们就需要在客户机上想办法抓取dmp文件,拿回来进行分析。总之,Dump文件对我们编程人员,特别是Windows系统上进行C++开发应用的开发人员,进行问题定位非常有帮助。
场景二:windows系统自己出了问题,比如蓝屏了,这时系统会自动产生dump文件,被微软收集分析
一、总体结构
二、文件头
首先文件的最开始的32个字节是Dump文件的文件头,这里包含了Dump文件标识、格式版本、校验和、时间戳和一些标志,
typedef struct _MINIDUMP_HEADER {
ULONG32 Signature;
ULONG32 Version;
ULONG32 NumberOfStreams;
RVA StreamDirectoryRva;
ULONG32 CheckSum;
union {
ULONG32 Reserved;
ULONG32 TimeDateStamp;
};
ULONG64 Flags;
} MINIDUMP_HEADER, *PMINIDUMP_HEADER
上面的结构包含了很多信息,总共32个字节,存放在文件的最开始的位置,下面分别说下各成员:
- Signature---文件标识
4个字节,存放内容是"MDMP"字符串的ASSIC码。可以简单的读取文件的头4个字节是否等于"MDMP"来判断一个文件是否是Dump文件。 - Version---Dump格式的版本
低两字节是MiniDump的版本号,高两字节是一个特定整形值 - NumberofStreams----文件里内存数据流的计数
也就是MiniDump目录表的元素个数。dump文件是以流的形式保存内存数据,各个流的类型不一样。 - StreamDirectoryRVA
流目录表的文件偏移地址,从文件最开始处也就是地址0开始,那么要寻址流目录:0+StreamDirectoryRva
(字节) - CheckSum
文件校验和,可以为0 - TimeDataStamp
时间戳,文件的修改时间 - Flags
一个或多个MINIDUMP_TYPE的枚举值组成的标志,说明本文件里包含了哪些信息。
当我们抓取到Dump文件后,我们抓取的方式对不对,是否包含了我们想要的信息,可不可用,又或这个文件在抓取或传输过程种,有没有损坏,又或者我不想用Windbg进行细致的分析,只想大概了解下异常信息,在这样的需求下,有没有工具帮我们快速浏览Dump文件信息呢,有,今天给大家介绍两款工具。
一、DumpChk.exe
DumpChk是Microsoft 崩溃转储文件检查器工具, 是一个可执行的崩溃转储文件的快速分析程序。可以查看有关转储文件包含摘要信息。 如果转储文件已损坏,无法由调试器打开时,dumpchk 将会告诉我们。当大家安装了Debugging Tools for Windows工具集后,就会有这个程序了。
二、MinidumpExplorer
这个一款图形界面的Dump文件浏览器
- 看清楚是何种异常导致的崩溃.
- 对齐symbol, 找到发生崩溃的函数名字, 以及对应的汇编代码和源代码.
- 列出callstack
- 检查callstack是否合理
- 检查发生崩溃的函数是否得到了正确的参数.
- 检查发生崩溃的函数使用的数据是否正确.
- 结合上面的信息, 构思来龙去脉, 然后用资料来证明, 或者反驳自己的猜想.
- 通过进一步的操作来获取更有意义的资料. 比如激活pageheap后, 重新抓取dump, 或者干脆进行Live debug
ProcDump是一个命令行实用程序,其主要目的是监视应用程序的CPU峰值,并在峰值期间生成崩溃转储,管理员或开发人员可以使用该转储来确定峰值的原因。ProcDump还包括挂起窗口监视(使用与Windows和任务管理器使用的相同的窗口挂起定义)、未处理的异常监视,并且可以基于系统性能计数器的值生成转储。它还可以作为一个通用的进程转储实用程序,可以嵌入到其他脚本中。