默认情况下Windows配置为当系统发生崩溃时尝试自动抓取一个当前操作系统的状态信息接下来我们将讨论系统故障非应用程序失败Dump选项可以通过控制面板中的系统工具来进行设置我们打开系统属性—高级选项卡找到启动和故障恢复点击设置我们就可以看到Dump文件的相关配置当系统发生崩溃时有类Dump文件可以被捕获 完全内存转储当崩溃发生时将捕获整个物理内存的状态此类转储文件大小为内存中页面文件大小+MB的文件头Windows NT只支持完全内存转储当然这也是Windows Server Systems的默认设置 核心内存转储当崩溃发生时核心内存转储只捕获物理内存中内核态的页面文件读/写数据这只是内核态的转储并不包括用户态进程的页面不过由用户态进程页引起系统崩溃是不大可能的通常都是由内核态引起核心内存转储中包括当前运行进程线程和被加载的驱动等相关信息核心内存转储文件大小=操作系统内核态内存占用大小+操作系统为驱动程序分配内存的大小 小内存转储小内存转储(又叫Minidump)是一个K的转储文件(位系统和Windows里是KVistaK)它包括终止代码参数和被加载的驱动列表主要信息为崩溃时的当前进程线程和内核堆 注意有的情况下我们需要进行完全内存转储手动进行完全内存转储为程序停止响应的排错提供了最为丰富的信息因为当程序Hang住时我们需要查看用户态进程死锁等等信息不过当你在选择捕获哪种Dump文件时一定要考虑好捕获出来的文件大小如上所述完全内存转储文件大小会是在物理内存大小的基础上+MB(笔者GB内存再加MB恐怖啊……) 前面我们回顾了种类型的Dump文件实则在日常的工作中核心内存转储是我们系统崩溃和Bug检查时最常用到的请记住核心内存转储文件大小仅基于内核态内存占用和驱动内存占用(在有更多内存的系统上Dump文件过大是正常的)目前我们还无法精准的计算核心内存转储文件大小你可以尝试手动配置核心内存转储来查看页面文件是否足够大对于设置最小的核心内存转储大小我们有一定的指导方针但对于最大值目前还没办法 物理内存 最小页面文件 (Kernel Dump) < MB MB < GB MB < GB MB >= GB MB 如果你担心页面文件设置过小无法很好的捕获核心转储我们唯一的办法就是通过KB所描述的方式使用CrashOnCtrlScroll方法造成手动崩溃系统重启之后我们可以手工查看Dump文件大小另一种方法是在启动分区上手动设置GB+MB的页面文件大小(位系统)这是因为位操作系统内核态最大地址空间就是GB 除了配置正确的页面文件大小之外我们也需要确保有足够的磁盘空间让Dump文件能够被正确的写入与页面文件用来捕获Dump不同Dump文件可以被写入其它的本地分区在保存多个Dump文件时请取消选择覆盖任何现有文件不过请记住这会给剩余的磁盘空间造成很大的压力 下面我们来看Dump文件是如何被产生的当系统启动时会到注册表HKLMSystemCurrentControlSetControlCrashControl 读取崩溃转储选项所有在图形界面所做的操作都会修改如下注册表值 将事件写入系统日志=LogEvent 自动重新启动= AutoReboot 写入调试信息= CrashDumpEnabled 转储文件= DumpFile 覆盖任何现有文件= Overwrite 如果你的系统超过GB内存在图形界面中你将不会看到完全内存转储选项其原因在KB中进行了描述但我们可以通过将HKLMSystemCurrentControlSetControlCrashControl下的CrashDumpEnabled值设置为来强制启用它(改这个值在图形界面中完全内存转储仍不会显示出来)如果你需要完全内存转储来做更详尽的排错也可以考虑使用Bootini中的MAXMEM开关将位操作系统所使用的内存限制在GB或更少(可以参考KB)此时系统就会将完全内存转储选项显示来 现在回到Dump文件如何被产生这个话题一旦转储功能被启用操作系统会自动写一个以Dump_开头的磁盘迷你端口驱动到启动分区并校验与创建Dump文件相关的所有组件包括磁盘迷你端口驱动写入Dump文件的I/O管理函数和启动分区的页面文件最终所得的校验结果会被保存起来每当系统启动时KeBugCheck函数会重新进行校验并与之前的结果相比对如果校验结果不匹配将不会有Dump文件被写入磁盘(因为有破坏磁盘数据的危险);如果检验结果匹配Dump信息会被写入已经被写到磁盘启动分区上的页面文件当中文件系统会被完全绕过因为它也有可能是造成崩溃的原因之一当SMSSEXE在启动过程中开启内存分页时系统会仔细检查启动分区页面文件当中的信息如果有崩溃信息这部分页面文件就会被保护起来如果启动过程中的所有或部分启动分区页面文件不可用系统会提示虚拟内存过低(暂时)启动进程执行完成之后WINLOGONEXE会调用SAVEDUMPEXE进程从页面文件中抽出崩溃信息并将Dump文件写到磁盘上 在Windows Server 上某些过程可能会有不同请参考KB当Server启动之后Windows会要求在启动分区上创建一个和物理内存相同大小的临时文件如果磁盘空间不足Dump还是会生成不过会被系统缩减大小在创建Dump操作过程的初期会话管理子系统(SMSSEXE)就会介入验证内存Dump信息是否有效如果Dump信息有效SMSSEXE会将Dump文件重命名为Dumpxxxtmp进而存储Dumpxxxtmp到启动分区并设置HKLM/System/CurrentControlSet/Control/CrashControl/MachineCrash下的TempDestination和DumpFile值SAVEDUMPEXE便会读取这个值并在判定文件的有效性之后将Dumpxxxtmp保存成Memorydmp |