深入理解Windows Vista內核三:改進的故障處理由于設備驅動存在錯誤、或者硬件存在問題,,抑或是操作系統(tǒng)本身 的原因,,當系統(tǒng)遇到無法恢復的內核模式錯誤時,Windows會顯示臭名卓著的“藍屏死機”,,隨后強行中止系統(tǒng),,以防止磁盤出現數據沖突,同時根據系統(tǒng)配 置的情況,,還會把部分或者全部的物理內存寫入到一個故障轉儲文件(crash dump file),。內存轉儲文件很有用,因為當我們死機后重啟系統(tǒng)時,,微軟的在線故障分析服務(OCA)可以對其進行分析,,以便找到問題的根源。如果我們愿意,, 還可以自己用Microsoft Debugging Tools for Windows自己進行故障分析,。 盆盆評注:有關如何用Debug工具分析系統(tǒng)故障的知識,可以參考張銀魁老師的Webcast,。 然而舊版本的Windows,,直到會話管理器進程(%Systemroot%\System32\Smss.exe)對頁面文件進行初始化以后, 才可以啟用故障轉儲文件的支持,。也就是說,,在這以前,如果發(fā)生了嚴重的系統(tǒng)故障而導致系統(tǒng)藍屏,,并不會生成轉儲文件,。而大量設備驅動程序是在 Smss.exe進程啟動之前進行初始化,所以早期的系統(tǒng)故障并不會觸發(fā)轉儲文件的創(chuàng)建,,所以對這些故障進行排錯就非常困難,。 盆盆評注:有關Windows 2000/XP啟動過程的介紹,可以參考張銀魁老師的Webcast,。 而Windows Vista則大大提前了可以創(chuàng)建轉儲文件的時間?,F在,在所有啟動類型為“boot”的驅動程序啟動以后,而在所有啟動類型為“system”的驅動程序 啟動以前,,就可以初始化轉儲文件的支持,。有了這個改進,當我們在系統(tǒng)引導階段遇到死機崩潰的故障,,微軟OCA服務就可以幫助診斷這個問題,。而且, Windows Vista以64KB的塊級別往轉儲文件里填充數據,,而老版本的Windows則是以4KB為單位,。這樣大容量的內存轉儲文件,就能夠以十倍的速度生成,。 盆盆評注:啟動類型為“boot”,,是指由ntldr或者引導管理器加載的驅動程序。這些驅動程序比較重要,,如果沒有啟動的話,,Windows將無法繼續(xù)引導,。啟動類型為“system”,,是指內核初始化過程中啟動的驅動程序,。 在Windows Vista中,應用程序的故障處理也得到了很好的改進,。在舊版本的Windows中,,當應用程序發(fā)生故障時,會執(zhí)行一個專門的處理程序 (unhandled exception handler),,以對這種無法正常處理的例外進行處理,。例外處理程序會加載微軟的應用程序錯誤報告(AER)進程(%Systemroot%System32\Dwwin.exe),并且顯示對話框,,提示該程序出錯,,并詢問是否需要把錯誤報告發(fā)送給微軟。然而,,如果該進程在崩潰時,,主線程的堆 棧被破壞,例外處理程序會在執(zhí)行時崩潰,,導致其進程被內核終止,,結果是程序窗口一閃而過,根本沒有顯示任何錯誤報告對話框,。 Windows Vista則將錯誤處理從崩潰進程的上下文中移走,,而交由一個新的服務來處理,就是Windows Error Reporting(WER)服務,。該服務運行在服務宿主進程中,, 是以DLL文件的形式實現的(%Systemroot%\System32\Wersvc.dll)。當應用程序發(fā)生故障時,它還是會執(zhí)行例外處理程 序,,但是例外處理程序會給WER服務發(fā)送一個消息,而由WER服務加載WER錯誤報告進程(%Systemroot%\System32Werfault.exe),,以顯示錯誤報告對話框,。如果因為主線程的堆棧被破壞而導致例外處理程序崩潰,例外處理程序就會反復地執(zhí)行崩潰,、崩潰執(zhí)行,,最 終把線程所有堆棧空間消耗干凈,,當內核處于這個狀態(tài)的時候,,就會給WER服務發(fā)送故障通知消息。 盆盆評注:服務宿主進程,,就是指svchost進程,。 我們可以在以下四張圖片中看到兩種實現方法的對比。這些圖片顯示Accvio.exe進程和錯誤報告進程之間的關系,,Accvio.exe進程是一
個故障測試程序,,可以觸發(fā)一個應用程序崩潰。Windows
Vista中新的錯誤處理機制意味著應用程序不再會悄無聲息地中止,,而妨礙我們向微軟發(fā)送錯誤報告,,以便幫助軟件開發(fā)商改進他們的產品。
盆盆評 注:從圖1中可以看出,,Windows XP的錯誤報告進程dwwin是由發(fā)生錯誤的應用程序所啟動,,如果該應用程序的主線程堆棧被破壞,會導致無法彈出錯誤報告,。而圖3顯示Windows Vista的錯誤報告進程WerFault是由svchost進程啟動的(實際上是由svchost進程里的WER服務所加載),,這樣的相對獨立機制,可 以確保應用程序的錯誤都能被系統(tǒng)所捕獲,。
已發(fā)表
2007年3月25日 18:06
作者
ahpeng
|
|