默認情況下,Windows配置為當系統發生崩潰時嘗試自動抓取一個當前操作系統的狀態信息。接下來我們將討論系統故障,非應用程序失敗。Dump選項可以通過控制面板中的系統工具來進行設置。我們打開系統屬性—高級選項卡,找到啟動和故障恢復,點擊設置,我們就可以看到Dump文件的相關配置。當系統發生崩潰時,有3類Dump文件可以被捕獲:

- 完全內存轉儲:當崩潰發生時,將捕獲整個物理內存的狀態。此類轉儲文件大小為內存中頁面文件大小+1MB的文件頭。Windows NT4只支持完全內存轉儲,當然這也是Windows Server Systems的默認設置。
- 核心內存轉儲:當崩潰發生時,核心內存轉儲只捕獲物理內存中內核態的頁面文件讀/寫數據。這只是內核態的轉儲,并不包括用戶態進程的頁面。不過,由用戶態進程頁引起系統崩潰是不大可能的,通常都是由內核態引起。核心內存轉儲中包括:當前運行進程、線程和被加載的驅動等相關信息。核心內存轉儲文件大小=操作系統內核態內存占用大小+操作系統為驅動程序分配內存的大小。
- 小內存轉儲:小內存轉儲(又叫Mini-dump)是一個64K的轉儲文件(64位系統和Windows7里是128K,Vista512K),它包括:終止代碼、參數和被加載的驅動列表。主要信息為崩潰時的當前進程、線程和內核堆。
注意:有的情況下我們需要進行完全內存轉儲,手動進行完全內存轉儲為程序停止響應的排錯提供了最為豐富的信息。因為當程序Hang住時,我們需要查看用戶態進程、死鎖等等信息。不過,當你在選擇捕獲哪種Dump文件時,一定要考慮好捕獲出來的文件大小。如上所述,完全內存轉儲文件大小會是在物理內存大小的基礎上+1MB。(筆者8GB內存,再加1MB。恐怖啊……)
前面我們回顧了3種類型的Dump文件,實則在日常的工作中核心內存轉儲是我們系統崩潰和Bug檢查時最常用到的。請記住,核心內存轉儲文件大小僅基于內核態內存占用和驅動內存占用。(在有更多內存的系統上,Dump文件過大是正常的。)目前我們還無法精準的計算核心內存轉儲文件大小,你可以嘗試手動配置核心內存轉儲來查看頁面文件是否足夠大。對于設置最小的核心內存轉儲大小我們有一定的指導方針,但對于最大值目前還沒辦法:
物理內存 最小頁面文件 (Kernel Dump)
128MB 50MB
4GB 200MB
8GB 400MB
>= 8GB 800MB
如果你擔心頁面文件設置過小,無法很好的捕獲核心轉儲,我們唯一的辦法就是通過KB244139所描述的方式使用CrashOnCtrlScroll方法造成手動崩潰。系統重啟之后,我們可以手工查看Dump文件大小。另一種方法是在啟動分區上手動設置2GB+1MB的頁面文件大小(32位系統),這是因為32位操作系統內核態最大地址空間就是2GB。
除了配置正確的頁面文件大小之外,我們也需要確保有足夠的磁盤空間讓Dump文件能夠被正確的寫入。與頁面文件用來捕獲Dump不同,Dump文件可以被寫入其它的本地分區。在保存多個Dump文件時,請取消選擇“覆蓋任何現有文件”。不過請記住,這會給剩余的磁盤空間造成很大的壓力。
下面我們來看Dump文件是如何被產生的。當系統啟動時,會到注冊表HKLM\System\CurrentControlSet\Control\CrashControl 讀取崩潰轉儲選項。所有在圖形界面所做的操作都會修改如下注冊表值:
- 將事件寫入系統日志=LogEvent
- 自動重新啟動= AutoReboot
- 寫入調試信息= CrashDumpEnabled
- 轉儲文件= DumpFile
- 覆蓋任何現有文件= Overwrite

如果你的系統超過2GB內存,在圖形界面中你將不會看到完全內存轉儲選項。其原因在KB274598中進行了描述。但我們可以通過將HKLM\System\CurrentControlSet\Control\CrashControl下的CrashDumpEnabled值設置為1來強制啟用它(改這個值在圖形界面中完全內存轉儲仍不會顯示出來)。如果你需要完全內存轉儲來做更詳盡的排錯,也可以考慮使用Boot.ini中的MAXMEM開關將32位操作系統所使用的內存限制在2GB或更少(可以參考KB108393),此時系統就會將完全內存轉儲選項顯示來。

現在回到Dump文件如何被產生這個話題。一旦轉儲功能被啟用,操作系統會自動寫一個以“Dump_”開頭的磁盤迷你端口驅動到啟動分區,并校驗與創建 Dump文件相關的所有組件。包括:磁盤迷你端口驅動、寫入Dump文件的I/O管理函數和啟動分區的頁面文件。最終所得的校驗結果會被保存起來,每當系統啟動時KeBugCheck函數會重新進行校驗并與之前的結果相比對。如果校驗結果不匹配,將不會有Dump文件被寫入磁盤(因為有破壞磁盤數據的危險);如果檢驗結果匹配,Dump信息會被寫入已經被寫到磁盤啟動分區上的頁面文件當中。文件系統會被完全繞過,因為它也有可能是造成崩潰的原因之一。當SMSS.EXE在啟動過程中開啟內存分頁時,系統會仔細檢查啟動分區頁面文件當中的信息。如果有崩潰信息,這部分頁面文件就會被保護起來。如果啟動過程中的所有或部分啟動分區頁面文件不可用,系統會提示虛擬內存過低(暫時)。啟動進程執行完成之后WINLOGON.EXE會調用SAVEDUMP.EXE進程從頁面文件中抽出崩潰信息,并將Dump文件寫到磁盤上。
在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.dm