MINIDUMP_TYPE详解

MINIDUMP_TYPE 枚举类型详解

一、MINIDUMP_TYPE 的作用

相信大家都知道我们可以使用minidump文件来记录Windows程序崩溃时的信息,其是一种内存转储,其第一代原型是一种“全用户转储(Full User Dump)”,里面包含了全部的进程内存信息。显然在大多数情况下我们都没必要获取全部的内存信息,而且存储全部内存信息的代价就是超大的磁盘占用,常常会有几百M甚至几个G,这使得要将dump文件反馈给开发人员就十分不方便。
于是在WindowsXP中微软制定了新的转储机制,这就是Minidump,默认情况下MiniDump包含了可以恢复程序崩溃现场的必要信息,并可以查看崩溃现场的局部变量值,此时的dump文件一般只有几十KB到几M,名副其实确实非常mini。
但是minidump的mini是通过删除过多的内存信息来达到的,而有些时候,我们想要的信息并不在默认的minidump转储范围内,这时候我们就需要自定义minidump所存储的信息了。
微软定义了MINIDUMP_TYPE枚举值,使得我们可以定制minidump文件转储的内容,当然随着内容的增加,mindump文件的大小也会增加,所以我们有必要知道哪些是我们需要的,哪些是于我们无用的。

二、MINIDUMP_TYPE详解

MINIDUMP_TYPE的定义如下:

typedef enum _MINIDUMP_TYPE {
  MiniDumpNormal                          = 0x00000000,
  MiniDumpWithDataSegs                    = 0x00000001,
  MiniDumpWithFullMemory                  = 0x00000002,
  MiniDumpWithHandleData                  = 0x00000004,
  MiniDumpFilterMemory                    = 0x00000008,
  MiniDumpScanMemory                      = 0x00000010,
  MiniDumpWithUnloadedModules             = 0x00000020,
  MiniDumpWithIndirectlyReferencedMemory  = 0x00000040,
  MiniDumpFilterModulePaths               = 0x00000080,
  MiniDumpWithProcessThreadData           = 0x00000100,
  MiniDumpWithPrivateReadWriteMemory      = 0x00000200,
  MiniDumpWithoutOptionalData             = 0x00000400,
  MiniDumpWithFullMemoryInfo              = 0x00000800,
  MiniDumpWithThreadInfo                  = 0x00001000,
  MiniDumpWithCodeSegs                    = 0x00002000,
  MiniDumpWithoutAuxiliaryState           = 0x00004000,
  MiniDumpWithFullAuxiliaryState          = 0x00008000,
  MiniDumpWithPrivateWriteCopyMemory      = 0x00010000,
  MiniDumpIgnoreInaccessibleMemory        = 0x00020000,
  MiniDumpWithTokenInformation            = 0x00040000,
  MiniDumpWithModuleHeaders               = 0x00080000,
  MiniDumpFilterTriage                    = 0x00100000,
  MiniDumpValidTypeFlags                  = 0x001fffff
} MINIDUMP_TYPE;
  • MiniDumpNormal
    仅包含捕获进程中所有线程的堆栈跟踪的必要信息。其值是0,也就是无论MINIDUMP_TYPE取何值,该选项都会包含其中。

  • MiniDumpWithDataSegs
    包含来自所有加载模块中的可写数据段,此选项会使minidump文件显著增大,对每个模块的控制使用了MODULE_WRITE_FLAGS枚举类型的ModuleWriteDataSeg枚举值。
    如果我们希望查看全局变来那个值,但有不想使用MiniDumpWithFullMemory,可以使用此选项。

  • MiniDumpWithFullMemory
    包含进程中所有可以访问的内存信息,原始内存信息包含在文件的末端,所以不用原始内存信息可以直接映射数据结构。但是该选项会造成minidump文件非常巨大。
    使用该选项可以查看存储在栈上、堆上、模块数据段的所有数据。甚至还可以看到线程和进程环境块(Process Environment Block和Thread Environment Bolck, PEB和TEB)的数据。这些没有公开的数据结构可以给我们的调试提供无价的帮助。

  • MiniDumpWithHandleData
    包含生成dump文件时活跃的系统句柄的高级别信息。
    使用该选项minidump会包括故障时刻进程故障表里面的所有句柄。可以用WinDbg的!handle来显示这些信息。

  • MiniDumpFilterMemory
    栈内存的内容会在保存到minidump前被过滤,除了重建栈跟踪所必须的指针,其他都会被用0数据覆盖。即调用栈可以被重建,但是所有局部变量和函数参数的值都是0。
    此选项只影响线程栈占用内存的内容。其他内存(比如堆)不受影响。如果使用了MiniDumpWithFullMemory,这个标志就不起作用了。

  • MiniDumpScanMemory
    栈内存的内容是经过扫描的,保留栈中引用了的模块。如果一个模块被栈引用,MINIDUMP_CALLBACK_OUTPUT结构体中存储的ModuleWriteFlags将被设置为ModuleReferencedByMemory。
    此选项可以帮助我们节约minidump占用的空间。它会把调试不需要的可执行模块去掉。但是需要和MiniDumpCallback函数紧密合作。

  • MiniDumpWithUnloadedModules
    包含最近被卸载的模块的由操作系统维护的信息。
    winServer2003 SP1和WinXP SP2之后,操作系统才会维护最近卸载模块信息。
    该选项要求DbgHelp 5.1以上版本。

  • MiniDumpWithIndirectlyReferencedMemory
    包含本地或其他栈引用数据的内存页,此选项会显著增大minidump文件大小。
    MiniDumpWriteDump检查线程栈内存中的每一个指针。这些指针可能指向线程地址空间的其他可读内存页。一旦发现这样的指针,程序会读取指针附近1024字节的内容存到minidump中(指针前的256字节和指针后的768字节)。
    该选项要求DbgHelp 5.1以上版本。

  • MiniDumpFilterModulePaths
    过滤内存信息中的模块路径,只保留模块名称。此选项可以保护用户的隐私比如用户名、重要的目录等,但可能阻止系统定位图像文件,应当谨慎应用在特殊环境。
    该选项要求DbgHelp 5.1以上版本。

  • MiniDumpWithProcessThreadData
    包含操作系统中每个进程的每个线程的完整信息。
    此选项使minidump会包含线程和进程环境块内容(PEB和TEB)的内存页,可以通过WinDbg的!peb和!teb命令来查看。同时,也包括了另外一些它们也用的内存页(例如,环境变量和进程参数保存的位置,通过TlsAlloc分配的TLS空间)。不过,有一些PEB和TEB引用的内存被忽略了,例如,通过__declspec(thread)分配的线程TLS数据。如果确实需要,就不得不使用MiniDumpWithFullMemory或者MiniDumpWithPrivateReadWriteMemory来获得。
    该选项要求DbgHelp 5.1以上版本。

  • MiniDumpWithPrivateReadWriteMemory
    扫描虚拟地址空间,将可读写的私有内存页(PAGE_READWRITE)包含到minidump文件中,这使我们可以察看栈、堆甚至TLS的数据。PEB和TEB也包括在里面。
    注意此选项并不包含共享内存页内容、可执行模块代码、数据段等,不包括代码段节省了minidump文件大小,但我们不能查看内存映射文件内容,及全局变量。所以该选项常与其他选项组合使用。
    该选项要求DbgHelp 5.1以上版本。

  • MiniDumpWithoutOptionalData
    去掉minidump转储文件中不在“基准转储内存区域”中的数据,这样可以尽量避免dump文件中出现用户的隐私数据,但是并不能完全避免。
    应用此选项,只有MiniDumpNormal指定的内存会被保存,其他内存相关的设置(MiniDumpWithFullMemory, MiniDumpWithPrivateReadWriteMemory, MiniDumpWithIndirectlyReferencedMemory)即使指定也会失效。
    该选项不会影响:MiniDumpWithProcessThreadData, MiniDumpWithThreadInfo, MiniDumpWithHandleData, MiniDumpWithDataSegs, MiniDumpWithCodeSegs, MiniDumpWithFullMemoryInfo的行为。
    该选项要求DbgHelp 6.1以上版本。

  • MiniDumpWithFullMemoryInfo
    包含整个内存区域的信息,该选项会使minidump包含进程虚拟内存不举的完整信息。
    可以通过WinDbg的!vadump和!vprot命令查看。
    该选项要求DbgHelp 6.1以上版本。

  • MiniDumpWithThreadInfo
    包含线程的状态信息。对每个线程都会提供线程时间(创建时间,执行用户代码和内核代码的时间)、入口地址、相关性。
    WinDbg中,可以通过.ttime命令查看线程时间。
    该选项要求DbgHelp 6.1以上版本。

  • MiniDumpWithCodeSegs
    包含加载的可执行模块的代码段和代码相关部分,以捕捉可执行内容。对于每个模块的控制使用MODULE_WRITE_FLAGS枚举类型的ModuleWriteCodeSegs 枚举值。
    该选项要求DbgHelp 6.1以上版本。

  • MiniDumpWithoutAuxiliaryState
    关闭二级附加内存内容收集。

  • MiniDumpWithFullAuxiliaryState
    将附加数据内容提供者的状态信息存入minidump文件,该选项会增大minidump文件大小。

  • MiniDumpWithPrivateWriteCopyMemory
    扫描虚拟地址空间,将写入页面的副本(PAGE_WRITECOPY)的内存包含进dump文件。
    该选项要求DbgHelp 6.1以上版本。
    该选项要求DbgHelp 6.1以上版本。

  • MiniDumpIgnoreInaccessibleMemory
    忽略无法访问的内存。例如当指定了MiniDumpWithFullMemory,如果生成dump的方法无法读取某些内存区域,minidump生成会就失败。但是如果你指定了该选项,dump生成方法就会忽略不可访问的内存区域,并继续生成minidump。需要注意的是不可访问的内存区域不包含在dump文件中。
    该选项要求DbgHelp 6.1以上版本。

  • MiniDumpWithTokenInformation
    添加安全标记相关的数据。该选项使!token扩展在处理用户模式( user-mode)的模块时生效。
    该选项要求DbgHelp 6.1以上版本。

  • MiniDumpWithModuleHeaders
    添加模块头相关数据。
    该选项要求DbgHelp 6.1以上版本。

  • MiniDumpFilterTriage
    添加过滤分类的相关数据。
    该选项要求DbgHelp 6.1以上版本。

  • MiniDumpValidTypeFlags
    表示每个标记都是有效的。

参考:
1.微软官方说明
2.DoubleLi的博客文章《minidump详细介绍》

你可能感兴趣的:(minidump,内存转存储)