</p> 下面我们来看Dump文件是如何被产生的。当系统启动时,会到注册表HKLMSystemCurrentControlSetControlCrashControl 读取崩溃转储选项。所有在图形界面所做的操作都会修改如下注册表值:
: {# b, P* V) k7 x4 N# {5 n5 }2 I 将事件写入系统日志=LogEvent
$ I' v, {3 L/ g4 h0 E$ K6 o 自动重新启动= AutoReboot: J% a7 h6 U3 H% {
写入调试信息= CrashDumpEnabled8 w* i5 `" Z1 O. y: }1 s S' M
转储文件= DumpFile
, r( o( S1 Q: J3 z$ d2 u2 B9 l 覆盖任何现有文件= Overwrite中华考试网(www.Examw。com) v: U' H3 a: V3 g8 n
如果你的系统超过2GB内存,在图形界面中你将不会看到完全内存转储选项。其原因在KB274598中进行了描述。但我们可以通过将 HKLMSystemCurrentControlSetControlCrashControl下的CrashDumpEnabled值设置为1来强制启用它(改这个值在图形界面中完全内存转储仍不会显示出来)。如果你需要完全内存转储来做更详尽的排错,也可以考虑使用Boot.ini中的MAXMEM 开关将32位操作系统所使用的内存限制在2GB或更少(可以参考KB108393),此时系统就会将完全内存转储选项显示来。) [% s+ x: h F' \ w. ]. x. ]
现在回到Dump文件如何被产生这个话题。一旦转储功能被启用,操作系统会自动写一个以“Dump_”开头的磁盘迷你端口驱动到启动分区,并校验与创建Dump文件相关的所有组件。包括:磁盘迷你端口驱动、写入Dump文件的I/O管理函数和启动分区的页面文件。最终所得的校验结果会被保存起来,每当系统启动时KeBugCheck函数会重新进行校验并与之前的结果相比对。如果校验结果不匹配,将不会有Dump文件被写入磁盘(因为有破坏磁盘数据的危险);如果检验结果匹配,Dump信息会被写入已经被写到磁盘启动分区上的页面文件当中。文件系统会被完全绕过,因为它也有可能是造成崩溃的原因之一。当SMSS.EXE在启动过程中开启内存分页时,系统会仔细检查启动分区页面文件当中的信息。如果有崩溃信息,这部分页面文件就会被保护起来。如果启动过程中的所有或部分启动分区页面文件不可用,系统会提示虚拟内存过低(暂时)。启动进程执行完成之后WINLOGON.EXE会调用 SAVEDUMP.EXE进程从页面文件中抽出崩溃信息,并将Dump文件写到磁盘上。2 z: o. ]4 W, m( j
在Windows Server 2003上,某些过程可能会有不同,请参考KB886429。当Server启动之后,Windows会要求在启动分区上创建一个和物理内存相同大小的临时文件。如果磁盘空间不足,Dump还是会生成,不过会被系统缩减大小。在创建Dump操作过程的初期,会话管理子系统 (SMSS.EXE)就会介入验证内存Dump信息是否有效。如果Dump信息有效,SMSS.EXE会将Dump文件重命名为Dumpxxx.tmp,进而存储Dumpxxx.tmp 到启动分区并设置HKLM/System/CurrentControlSet/Control/CrashControl/MachineCrash下的TempDestination和DumpFile值。 SAVEDUMP.EXE便会读取这2个值,并在判定文件的有效性之后将Dumpxxx.tmp 保存成Memory.dmp。 |