在《MiniDump文件生成(一)》中简单的介绍了一下怎样在程序崩溃的时候生成供调试使用的DMP文件,本文将详细的介绍一下MINIDUMP_TYPE中的每一种类型以及针对每一种类型所生成的DMP文件中将包含哪些特定信息。
首先来看一下,Windows对MINIDUMP_TYPE结构的定义
1. MiniDumpNormal
这是最常见的一种类型,通常情况下是函数MiniDumpWriteDump的默认值。使用该选项所生成的DMP文件中将包含如下信息:
1)系统信息。包括操作系统的版本号、SP版本号以及CPU的一些基本信息。
2)进程信息。包括进程ID,进程的创建时间、发生异常的时间。
3)模块信息。包括进程所加载的所有可执行模块的信息(加载地址、大小、完整的文件名、版本号等)。
4)线程信息。包含进程所属的每一线程的信息(线程ID、优先级...)。
5)线程栈。包含每一个线程的线程栈。
6)指令集。对于每一个线程,包含EIP前后256B的指令数据。
7)异常信息。
2. MiniDumpWithFullMemory
该选项是除了MiniDumpNormal之外的另一个较常用的选项。使用该选项,当前进程地址空间中的每一个可读的页都将包含在所生成的DMP文件中。
使用该选项的好处是:可以查看进程地址空间中的任何内容,包括栈中的数据,分配在堆上的数据以及PEB和TEB;
使用该选项不好的地方是,生成的DMP文件很大,通常会有几十M。
3. MiniDumpWithPrivateReadWriteMemory
使用该选项,只有进程的私有页(不和其它进程共享的页面)会被包含在生成的DMP文件中。具体包括:堆、栈中的数据,PEB和TEBs。
4. MiniDumpWithIndirectlyReferencedMemory
使用该选项,MiniDumpWriteDump会扫描每个线程的线程栈,寻找具有如此特征的指针,该指针指向进程地址空间中的可读页面;对于每一个找到的、具有上述特征的指针,MiniDumpWriteDump将该指针前后1024B的数据,指针前256B、指针后768B,写入生成的DMP文件中。
使用该选项生成的DMP文件可以用来分析“heap corruption”异常。
使用该选项需要注意:MiniDumpWriteDump并不区分扫描到的数据是真正的指针还是普通的变量值,例如:
MiniDumpWriteDump扫描得到一个值:0x02000(一个局部变量),而0x2000恰好是一个具有上述特征的指针,那么MIniDumpWriteDump将会不做区分的将0x01FFF~0x2300,共1024B的数据写入生成的DMP文件中。
5. MiniDumpWithDataSegs
使用该选项,当前进程加载的所有可执行模块的可写数据段将被写入到生成的DMP文件中。如果想在DMP文件中查看全局变量而又不想用MiniDumpWithFullMemory,那么可以是要该选项。
6. MiniDumpWithCodeSegs
使用该选项,当前进程加载的所有可执行模块的代码段将被写入生成的DMP文件中。
7. MiniDumpWithHandleData
使用该选项,在进程发生异常的那一刻,进程句柄表中的所有句柄信息将被写入生成的DMP文件中。
8. MiniDumpWithThreadInfo
使用该选项,如下的线程扩展信息将被写入生成的DMP文件中:
1)线程的创建时间、执行时间(包括用户态和内核态的执行时间)
2)线程的起始地址;
3)线程的派生关系。
9. MiniDumpWithProcessThreadData
使用该选项,生成的DMP文件将包含PEB和TEB以及它们所引用的内存空间所包含的数据。
10. MiniDumpWIthFullMemoryInfo
使用该选项,进程虚拟内存的布局信息将被写入到生成的DMP文件中。使用该方式对所生成的DMP文件的大小依赖于进程虚拟内存的布局----每一个具有相似属性的页面都将在生成的DMP文件中写入48B的数据。
11. MiniDumpWithoutOptionalData
使用该选项,可以过滤掉一些不必要的数据已减少生成的DMP文件的大小。规则如下:
1)只包含具有MiniDumpNormal属性的数据;
2)如果声明了MiniDumpWithoutOptionalData,那么即使下述选项显式声明,相应的数据也不会被写入到生成的DMP文件中:
MiniDumpWithFullMemory, MiniDumpWithIndirectlyReferenced, MiniDumpWithPrivateReadWriteMemory
3)该选项不会影响下述选项的结果:
MiniDumpWithProcessThreadData, MiniDumpWithThreadInfo, MiniDumpWIthHandleData, MiniDumpWithDataSegs, MiniDumpWIthCodeSegs,MiniDumpWithFullMemoryInfo.
12. MiniDumpFilterMemory
使用该选项,栈中的数据在写入生成的DMP文件之前,只保留恢复调用栈的数据而将其它的数据置0。这将导致根据生成的DMP文件只能恢复调用栈而不能查看发生异常是的函数调用参数和局部变量信息。
使用该方式不能减少生成DMP文件的大小。
13. MiniDumpFilterModulePath
使用该选项,所生成的DMP文件之包含进程加载的模块的文件名而不包含模块的全路径。
14. MiniDumpScanMemory
该选项与MiniDumpCallback共同使用来确定是否将某一特定模块以及该模块的信息写入到所生成的DMP文件中。
(待续...)