骨灰級Windows實用教程:如何在一分鐘內(nèi)解決Windows 10的崩潰問題
譯文【51CTO.com快譯】當(dāng)我剛開始使用Windows 10時,我就能夠在不使用谷歌搜索電源按鈕圖標(biāo)的情況下關(guān)閉筆記本電腦;這可以說是相對于Windows 8的很大的一個改進(jìn)。于是,我的下一個興趣點轉(zhuǎn)到:當(dāng)操作系統(tǒng)崩潰時,即產(chǎn)生藍(lán)屏死機(jī)(Blue Screen of Death,后文簡稱“BSOD”)時(參考下圖),應(yīng)當(dāng)怎么辦。
本文將向你展示如何設(shè)置你系統(tǒng),以便當(dāng)它出現(xiàn)問題時,你可以盡快找到大多數(shù)故障發(fā)生的原因。
藍(lán)屏
在Windows 10中,藍(lán)屏看起來與Windows 8/8.1一個模樣。藍(lán)屏中顯示的仍然是皺眉的圖形表情以及顯示消息“Your PC ran into a problem . . .”不過,此屏幕看起來比原始的藍(lán)屏更友好一些。但是,一個真正友好的屏幕顯示會告訴你問題的原因以及如何修復(fù)它。藍(lán)屏問題其實不會很難,因為大多數(shù)藍(lán)屏死機(jī)引起的原因經(jīng)常是由于第三方驅(qū)動程序的錯誤行為所導(dǎo)致的,而這些行為很容易被MS Windows調(diào)試器所識別。
對于早期版本的操作系統(tǒng),請參閱以下內(nèi)容:
- Windows 8:文章《如何盡快解決Windows 8崩潰問題》和幻燈片《如何解決Windows 8崩潰問題》;
- Windows 7:《幾分鐘解決Windows 7崩潰問題》;
- Windows XP/2000:文章《如何盡快解決Windows崩潰問題》。
必須明確的是,本文論及的是系統(tǒng)崩潰問題,而不是應(yīng)用程序崩潰或系統(tǒng)掛起。在系統(tǒng)完全崩潰時,操作系統(tǒng)會總結(jié)性提示某種對象出現(xiàn)了錯誤(如內(nèi)存損壞),繼續(xù)操作可能會導(dǎo)致嚴(yán)重的或災(zāi)難性的結(jié)果。因此,操作系統(tǒng)試圖關(guān)閉,并盡可能做到干凈地結(jié)束——在該過程中保存系統(tǒng)狀態(tài)信息——然后以一種刷新環(huán)境和帶有待分析的調(diào)試信息重新啟動(如果設(shè)置成這樣做的話)。
為什么Windows 10會崩潰
可以肯定的是,自1985年問世以來,Windows特征及規(guī)模不斷發(fā)展壯大并越來越穩(wěn)定。然而,盡管操作系統(tǒng)中內(nèi)置了保護(hù)機(jī)制,崩潰現(xiàn)象仍然不斷發(fā)生。
Windows歷來都是以“層保護(hù)模式”著稱,而Windows 10操作系統(tǒng)也不例外。Windows 10運行于兩個層模式下:一個是用戶模式(Ring 3層);另一個是內(nèi)核模式(Ring 0層)。這個設(shè)計思想是很容易理解的:在內(nèi)核模式下運行核心操作系統(tǒng)和設(shè)備驅(qū)動程序代碼,而在用戶模式下運行軟件應(yīng)用程序和用戶模式驅(qū)動程序。因此,應(yīng)用程序想要訪問操作系統(tǒng)服務(wù)和硬件的話,它們必須要調(diào)用充當(dāng)代理服務(wù)的Windows服務(wù)。因此,通過阻止用戶模式代碼直接訪問到內(nèi)核模式,操作系統(tǒng)操作就會普遍得到保障。
問題是:內(nèi)核模式代碼出錯了!在大多數(shù)情況下,由于在內(nèi)核模式下活動的第三方驅(qū)動程序發(fā)生了錯誤的調(diào)用,例如對并不存在的內(nèi)存的訪問或者改寫操作系統(tǒng)代碼,導(dǎo)致系統(tǒng)故障。當(dāng)然,Windows本身是很少出現(xiàn)故障的。
Windows 10崩潰時,從哪里尋求幫助
當(dāng)出現(xiàn)BSOD問題時,你可以通過很多地方進(jìn)行求助。下面列出其中的幾個幫助去處。例如,ConfigSafe網(wǎng)站能夠告訴你是什么驅(qū)動程序發(fā)生了變化,而AutorunCheck網(wǎng)站會告訴你哪些Windows自動運行設(shè)置已被更改。這兩處幫助資源都能夠有效地幫助你探測出導(dǎo)致系統(tǒng)失敗的罪魁禍?zhǔn)?。此外,每個人都應(yīng)該擁有一本《Windows Internals》;它簡直是每個網(wǎng)絡(luò)管理員和首席信息官應(yīng)該參考的“圣經(jīng)”,尤其是本書第二部分的第14章“崩潰轉(zhuǎn)儲分析”(Crash Dump Analysis)更值得你認(rèn)真閱讀。
當(dāng)我問Mark Russinovic(《Windows Internals》作者之一):為什么網(wǎng)絡(luò)管理員或首席信息官(而不是程序員)應(yīng)該閱讀這本書?他說,“如果是由你管理Windows系統(tǒng),但你卻不知道進(jìn)程和線程的區(qū)別,不知道Windows如何管理虛擬內(nèi)存和物理內(nèi)存,不知道內(nèi)核模式驅(qū)動程序可導(dǎo)致系統(tǒng)崩潰,那么你正在妨礙你自己。因此,理解這些概念對于充分理解故障轉(zhuǎn)儲及能夠發(fā)現(xiàn)相關(guān)線索是至關(guān)重要的。
所以,WinDbg工具能夠提供系統(tǒng)出錯時有關(guān)系統(tǒng)狀態(tài)的數(shù)據(jù),而《Windows Internals》則更能夠把那些神秘的數(shù)據(jù)變成可操作的信息,從而進(jìn)一步幫助你解決問題。
幫助你發(fā)現(xiàn)BSOD的部分參考網(wǎng)站
何謂內(nèi)存轉(zhuǎn)儲?
所謂“內(nèi)存轉(zhuǎn)儲”,是指在系統(tǒng)崩潰時系統(tǒng)內(nèi)存中內(nèi)容的拷貝或快照。轉(zhuǎn)儲文件非常重要,因為它們可以顯示:在系統(tǒng)出問題時誰正在做什么。轉(zhuǎn)儲文件因其內(nèi)容的特別性而很難解析,除非你知道要尋找什么。
Windows 10可以產(chǎn)生五種類型的內(nèi)存轉(zhuǎn)儲文件,下面針對每一種作有關(guān)描述。
1.自動內(nèi)存轉(zhuǎn)儲
位置:%SystemRoot%\Memory.dmp ;
大?。翰僮飨到y(tǒng)內(nèi)核大小。
自動內(nèi)存轉(zhuǎn)儲是你安裝Windows 10時的默認(rèn)選擇選項。它是為了支持“系統(tǒng)托管”頁面文件配置而創(chuàng)建的。這種“系統(tǒng)托管”頁面文件配置已被更新,以便減少在磁盤上的頁面文件大小(主要針對小型SSD),但也有益于使用大容量RAM的服務(wù)器。自動內(nèi)存轉(zhuǎn)儲選項將生成一個內(nèi)核內(nèi)存轉(zhuǎn)儲;不同的是,當(dāng)你選擇“自動”(Automatic)方式時它允許SMS進(jìn)程減少頁面文件大小——小于RAM的大小。
如果你想檢查或編輯你的系統(tǒng)分頁文件大小,請切換到以下位置(并請參考下面圖形示意):
“Windows10按鈕—控制面 板—系統(tǒng)與安全—系統(tǒng)—高級系統(tǒng)設(shè)置—性能—設(shè)置——高級——修改”。
2.活動內(nèi)存轉(zhuǎn)儲
位置:%SystemRoot%\Memory.dmp
大小:三倍于內(nèi)核大小或者自動轉(zhuǎn)儲文件的大小。
活動內(nèi)存轉(zhuǎn)儲是微軟最近研制出的新模式。盡管比完全內(nèi)存轉(zhuǎn)儲尺寸小得多,但其尺寸大約也是內(nèi)核轉(zhuǎn)儲大小的三倍。這是因為它包括內(nèi)核空間和用戶空間兩個部分。在我的測試系統(tǒng)上,我使用了4GB RAM+英特爾酷睿i7 64位處理器配置運行Windows 10,活動內(nèi)存轉(zhuǎn)儲大約占了1.5GB。因為有時需要傳送轉(zhuǎn)儲文件,所以我對其進(jìn)行了壓縮,減小到大約500MB。
3.完整內(nèi)存轉(zhuǎn)儲
位置:%SystemRoot%\Memory.dmp
大?。阂寻惭b的RAM尺寸+1MB。
完整(或全部)內(nèi)存轉(zhuǎn)儲使用最大的轉(zhuǎn)儲文件,因為它包含了所有的Windows操作系統(tǒng)使用的物理內(nèi)存。你可以假定該文件約等于已安裝的RAM的大小。隨著許多系統(tǒng)都各自占用多個GB的存儲空間,這會迅速導(dǎo)致出現(xiàn)存儲問題,尤其是當(dāng)你面對比偶爾系統(tǒng)崩潰更多的場合時。一般來說,請盡量使用自動轉(zhuǎn)儲文件方案。
4.內(nèi)核內(nèi)存轉(zhuǎn)儲
位置:%SystemRoot%\Memory.dmp
大小:約等于被核心模式組件所占用的物理內(nèi)存大小。
內(nèi)核轉(zhuǎn)儲所用文件大小約等于Windows 10內(nèi)核所占用RAM的大小,在我的測試系統(tǒng)上大約占700MB。進(jìn)一步壓縮的話,將減小近80%,約為150MB。內(nèi)核轉(zhuǎn)儲文件的優(yōu)點之一是,它包含分析所需要的二進(jìn)制文件。默認(rèn)情況下,內(nèi)核轉(zhuǎn)儲設(shè)置會創(chuàng)建一個核心轉(zhuǎn)儲文件,只保存最新的內(nèi)容并為每個事件創(chuàng)建一個小型轉(zhuǎn)儲。
5.小內(nèi)存轉(zhuǎn)儲(又稱小型轉(zhuǎn)儲)
位置:%SystemRoot%\Minidump
大?。涸趚86平臺上至少占64K,在x64平臺上至少占128KB(在我的Windows10測試PC上使用約279K)。
小型轉(zhuǎn)儲能夠提供特定的內(nèi)存頁面,其中的數(shù)據(jù)包含出故障時寄存器指向的位置,同時還包含出錯線程的堆棧信息。導(dǎo)致它們這么小的原因是,它們并不包含任何失敗時仍處在內(nèi)存中的二進(jìn)制或可執(zhí)行文件。但是,這些文件對于調(diào)試器的后續(xù)分析是極其重要的。
【提示】有關(guān)Windows 10其它類似的參考文章有:《如何探測Windows10中攜帶了錯誤的設(shè)備驅(qū)動程序》和《導(dǎo)致Windows 10藍(lán)屏的原因是什么?》。
只要你在創(chuàng)建了轉(zhuǎn)儲文件的計算機(jī)上進(jìn)行調(diào)試,WinDbg程序就可以在系統(tǒng)根目錄文件夾(除非在轉(zhuǎn)儲文件創(chuàng)建后系統(tǒng)更新改變了二進(jìn)制文件)中找到上述內(nèi)容。另外,調(diào)試器應(yīng)該能夠通過SymServ(微軟的符號文件在線存儲)自動找到它們。除非用戶作了更改,通常Windows 10會被設(shè)置為最新事件創(chuàng)建自動轉(zhuǎn)儲文件,并針對每一個崩潰的事件創(chuàng)建小型轉(zhuǎn)儲,為系統(tǒng)生命周期內(nèi)所有系統(tǒng)崩潰事件提供歷史記錄。
配置Windows 10生成合適內(nèi)存轉(zhuǎn)儲
打開“控制面板”程序并切換到“啟動與恢復(fù)”窗口:
“Windows10按鈕—控制面板—系統(tǒng)與安全—系統(tǒng)—高級系統(tǒng)設(shè)置—啟動與恢復(fù)—設(shè)置——自動內(nèi)存轉(zhuǎn)儲”。
在最后的窗口“啟動與恢復(fù)”中,請選擇“自動內(nèi)存轉(zhuǎn)儲”選項(如下圖所示),并勾選“自動重新啟動”(通常這兩個選項都是Windows 10下的默認(rèn)設(shè)置)。
安裝WinDbg
系統(tǒng)要求:為了進(jìn)行基于WinDbg的崩潰分析而安裝一臺PC,你將需要以下內(nèi)容:
- 32位或64位Windows 10:這取決于運行調(diào)試器的處理器,你可以使用32位或64位調(diào)試工具。請注意,轉(zhuǎn)儲文件是基于x86平臺還是基于x64平臺上生成的并不重要。
- WinDbg:這是Windows 10提供的Windows SDK的Windows調(diào)試工具部分,你可以從微軟網(wǎng)站免費下載。
- 硬盤空間:大約250MB的硬盤空間(不包括用于轉(zhuǎn)儲文件或符號文件的存儲空間)。
- 互聯(lián)網(wǎng):在線互聯(lián)網(wǎng)連接
下載WinDbg:從微軟網(wǎng)站下載sdksetup.exe(約1.2MB)。注意,此下載將直接啟動安裝程序,你將從中選擇要安裝的組件。你可以轉(zhuǎn)到微軟網(wǎng)站的硬件開發(fā)人員中心頁面,然后向下滾動到“Get debugging tools”,然后選擇“Debugging Tools for Windows 10 (WinDbg)”(下面的“A”項),也可以啟動立即下載(下面的“B”項)。
A)微軟硬件開發(fā)中心(https://msdn.microsoft.com/en-us/windows/hardware/hh852365);
B)自動下載(http://go.microsoft.com/fwlink/p/?LinkId=536682)。
空間需求:你可以忽略“Estimated disk space required”選項,直到你取消選擇不需要的工具。請確保取消選擇所有除了“Debugging Tools for Windows”以外的選項,其中包括內(nèi)核和用戶模式調(diào)試器,以及幫助和使用工具提示信息等。除非你想進(jìn)行編程,否則你并不需要安裝其他模塊;這樣,你將節(jié)省大量的磁盤空間。在這臺測試機(jī)中安裝所占用的磁盤空間最大從2.5GB到最小大約250MB。
運行sdksetup.exe:在系統(tǒng)中安裝軟件開發(fā)工具包(SDK),你將使用它來分析內(nèi)存轉(zhuǎn)儲文件。請記住,它可以是一臺運行另一個版本的Windows系統(tǒng)(并不需要一定運行Windows 10)的32位或64位計算機(jī)。關(guān)鍵步驟如下:
1.啟動sdksetup.exe。
2.指定安裝位置:默認(rèn)安裝位置是C:\Program Files (x86)\Windows Kits\10\。你可以選擇默認(rèn),還可以選擇另一個位置來定義你想安裝的軟件路徑。
3.接受或者拒絕Windows隱私問題。
4.接受許可協(xié)議。
5.取消選擇除了選項“Debugging Tools for Windows”外的所有內(nèi)容。
“符號”到底有多重要?
安裝完WinDbg后,但在調(diào)用轉(zhuǎn)儲文件之前,你需要符號表文件。符號文件相對于軟件很像高速公路上的出口標(biāo)記;它們會告訴你所在地是哪里——如果你停下車來的話。其實,它們只不過是把源代碼編譯成可執(zhí)行文件(從高級語言變成機(jī)器代碼)過程中的一種副產(chǎn)品而已。在此過程中,編譯器使用一組標(biāo)識符、標(biāo)識符在程序中的位置以及屬性信息創(chuàng)建符號文件。
然而,程序不需要此信息來執(zhí)行,所以符號通常存儲在一個單獨的文件中。這將減少可執(zhí)行文件的大小,從而導(dǎo)致占用較少的磁盤空間和更快的加載與運行速度。此外,這些符號文件通常不是與操作系統(tǒng)或應(yīng)用程序一起發(fā)行的。那么,問題在于:當(dāng)一個程序?qū)е孪到y(tǒng)出現(xiàn)故障問題時,操作系統(tǒng)只知道問題在其中出現(xiàn)的十六進(jìn)制地址,但不知道那里是誰以及他在做什么。幸運的是,微軟提供了對SymServ的訪問,這一舉措最終解決了問題。
當(dāng)打開某一內(nèi)存轉(zhuǎn)儲時,WinDbg會查看可執(zhí)行文件(如.exe,.dll等)并提取有關(guān)版本信息。然后,它創(chuàng)建一個到微軟網(wǎng)站上的SymServ的請求,其中包括版本信息和描述信息的精確的符號表位置信息。正如前面提到的,它不會針對你正在進(jìn)行故障排除的特定操作系統(tǒng)下載所有的符號;它將只下載它所需要的內(nèi)容。
在我們的示例情況下,即是針對Windows 10 PC系統(tǒng),符號文件對應(yīng)的文件夾總共有22MB大小。在運行眾多的崩潰測試后,該文件夾大約占35MB。在另一個系統(tǒng)上,我運行了來自于多臺不同個人電腦的若干測試結(jié)果發(fā)現(xiàn):上述文件夾大小仍然不足100MB。因此,只需記住,如果你打開來自于其他機(jī)器(可能使用Windows操作系統(tǒng)的其他變種)上的文件,你的文件夾可能會繼續(xù)增長。
或者,你可以選擇下載和存儲來自微軟網(wǎng)站的完整的符號文件。在這樣做之前,請注意:針對每一個符號包,你應(yīng)該保留至少1GB的可用磁盤空間。這是因為,除了存儲文件所需的空間外,你也需要空間來存儲臨時文件。即使在今天硬盤成本很低的情況下,使用的空間仍然值得注意。
- 每一個x86符號包可能需要750MB或者更多的硬盤空間。
- 每一個x64符號包可能需要640MB或者更多的硬盤空間。
符號程序包都是非累積性的,除非另行說明;否則,如果你使用的是Windows 10的SP2版本,那么,在你為SP2安裝符號程序之前,你需要針對原始的RTM版本和SP1版本也都安裝對應(yīng)的符號包程序。
【提示】如果你想下載符號文件并想把它們保存到本地,那么請務(wù)必讀一下網(wǎng)址https://msdn.microsoft.com/en-us/windows/hardware/gg463028.aspx處提供的資料。
SymServ(又名:SymSrv/符號表服務(wù)器),是一個極為重要的服務(wù),由微軟免費提供,用于確保準(zhǔn)確的內(nèi)存轉(zhuǎn)儲分析。要想使用這個服務(wù),你只需配置一下WinDbg來定位這個服務(wù),則SymServ就會自動檢索特定于提供轉(zhuǎn)儲內(nèi)容的確切版本W(wǎng)indows的符號。而且,在分析完一臺機(jī)器中的轉(zhuǎn)儲文件后,如果你從另一臺機(jī)器上調(diào)用一個轉(zhuǎn)儲文件,那么WinDbg和SymServ都將自動檢索相應(yīng)于該版本的操作系統(tǒng)的符號。
配置WinDbg
從上面的Windows 10界面上,選擇Windows 10按鈕,然后選擇“WinDbg |更多| 以管理員運行”。
然后,你會看到一個有幾個菜單項和一個空白主窗口區(qū)域的窗口。打開轉(zhuǎn)儲文件之前,你必須告訴WinDbg在哪里可以找到符號文件。
配置WinDbg:把Windows轉(zhuǎn)儲文件與適當(dāng)?shù)姆栁募P(guān)聯(lián)起來不僅是知道正運行的操作系統(tǒng)的版本號的問題。操作系統(tǒng)存在無數(shù)種變體,這并不是一個顯而易見的事實。唯一可以肯定哪個文件是正確的方式是讓SymServ幫你找到它。
設(shè)置符號文件路徑:Windows存在大量的符號表文件,因為每一個版本、每一次更新、每一個補(bǔ)丁程序和無數(shù)的一次性變體都會各自產(chǎn)生一個新文件。而使用錯誤的符號來評價一個轉(zhuǎn)儲文件將像使用波士頓地圖來導(dǎo)航舊金山一樣糟糕。
進(jìn)入如下路徑:
srv*c:\cache*http://msdl.microsoft.com/download/symbols
在上面命令的*c:\cache*位置處,請確保替換成你想要存儲符號的位置。
在本例中,我們使用“c:\symbols”。然后選擇【OK】。
【注意】請確保你的防火墻允許訪問msdl.microsoft.com,而不僅僅是網(wǎng)址www.microsoft.com。
如果你沒有可查看的內(nèi)存轉(zhuǎn)儲,怎么辦呢?請不要擔(dān)心。你可以自己生成一個!是的:你可以導(dǎo)致你的系統(tǒng)崩潰,并且安全地這樣做。有好幾種不同的方式可以實現(xiàn)這一目的,但最好的方法是使用一種稱為NotMyFault的由Russinovich研發(fā)的工具。
你可以從網(wǎng)址https://download.sysinternals.com/files/NotMyFault.zip處下載NotMyFault,你也可以從圖書《Windows Internals》宣傳網(wǎng)站的鏈接處http://technet.microsoft.com/en-us/sysinternals/bb963901.aspx下載。該工具中包括了一個選項允許加載行為錯誤的驅(qū)動程序(這需要系統(tǒng)管理特權(quán))。下載之后,你可以在桌面上創(chuàng)建一個相應(yīng)的快捷方式來簡化訪問。
【提示】圖書《Windows Internals》第二部分的第14章完全涵蓋了NotMyFault工具的使用說明,還有更重要的崩潰轉(zhuǎn)儲分析。
【警告】使用NotMyFault將創(chuàng)建一個系統(tǒng)崩潰,但是我在使用該工具時從未出現(xiàn)過問題。不過,在實際應(yīng)用中也不敢做任何保證,特別是在計算機(jī)領(lǐng)域。所以,請準(zhǔn)備好你的系統(tǒng),讓任何需要訪問它的人注銷幾分鐘。把任何包含你可能失去信息的文件都保存一下,然后關(guān)閉所有應(yīng)用程序。適當(dāng)準(zhǔn)備后,然后關(guān)閉這臺機(jī)器,重新啟動,你會注意到一個小型轉(zhuǎn)儲和一個內(nèi)核(或你選擇的任何大小)轉(zhuǎn)儲都應(yīng)該已經(jīng)創(chuàng)建成功。
打開轉(zhuǎn)儲文件
定位轉(zhuǎn)儲文件:在Windows系統(tǒng)中轉(zhuǎn)儲文件位于兩個地方,具體取決于你打開的類型︰
- 所有轉(zhuǎn)儲文件(除了小型轉(zhuǎn)儲外)都位于c:\Windows\MEMORY.DMP;
- 小型轉(zhuǎn)儲類型對應(yīng)的轉(zhuǎn)儲文件位置:c:\Windows\Minidump\[實際的Minidump文件名]
請注意,不像其他命名為MEMORY.DMP的其他類型的轉(zhuǎn)儲文件一樣,小型轉(zhuǎn)儲會被自動單獨命名;因此,不會覆蓋以前的文件。這是一個不錯的特性,因為它們的體積都很小。
打開轉(zhuǎn)儲文件:要打開你選擇的文件,請選擇命令“File | Open Crash Dump”。
如果你看到如下提示,請立即停止:
*** WARNING: Unable to verify timestamp for ntoskrnl.exe *** ERROR: Module load completed but symbols could not be loaded for ntoskrnl.exe
這是很重要的。當(dāng)你在WinDbg輸出的開始附近看到這兩行消息時,這意味著你不會得到你需要的分析結(jié)果。當(dāng)“Bugcheck Analysis”自動運行并顯示下面的消息后,剛才的說法將被進(jìn)一步證實。
當(dāng)你看到下面的消息:
“*** ERROR: Symbol file could not be found. Defaulted to export symbol for ntkrnlmp.exe. . .”
這意味著,WinDbg找不到文件的ntkrnlmp.exe(Windows OS內(nèi)核本身)正確的符號位置,也就無法進(jìn)行正確的分析。
***** Kernel symbols are WRONG. Please fix symbols to do analysis
導(dǎo)致上述錯誤的原因可能存在如下幾種:
- 沒有提供路徑或者路徑錯誤:沒有提供指向符號文件的路徑或者路徑不正確(可以檢查一下誤輸入空格等筆誤)。請檢查“Symbol Path”(參考上圖中的“Setting symbol file path”)部分。
- 連接失敗:請檢查你的互聯(lián)網(wǎng)連接,以確保它可以正確工作。
- 訪問被阻止:防火墻阻止訪問符號文件或文件在檢索過程中損壞。請確保沒有防火墻阻止訪問msdl.microsoft.com(它可能只會允許www.microsoft.com訪問)。
請注意,如果防火墻最初阻擋WinDbg下載一個符號表,那么這可能導(dǎo)致一個損壞的文件。如果取消防火墻阻止并嘗試再次下載符號文件后仍不能工作,則說明該文件仍然是損壞的。最快的解決方法是:關(guān)閉WinDbg,刪除符號文件夾(你最有可能設(shè)置在c:\symbols這個位置),并取消防火墻阻止。然后,重新打開WinDbg和轉(zhuǎn)儲文件。調(diào)試器將重新創(chuàng)建此文件夾并重新下載符號。切記:不要馬上進(jìn)行分析,直到確保更正此問題。
如果你看到以下錯誤,那么請不用擔(dān)心:
*** WARNING: Unable to verify timestamp for myfault.sys *** ERROR: Module load completed but symbols could not be loaded for myfault.sys
這意味著,調(diào)試器尋找在文件myfault.sys上的信息。然而,由于它是一個第三方的驅(qū)動程序,所以它內(nèi)部根本就沒有符號,因為微軟不會存儲所有的第三方驅(qū)動程序(【說明】myfault.sys是由屬于微軟旗下的SysInternals網(wǎng)站提供的,但它肯定不是一個常規(guī)的微軟產(chǎn)品。在我們的示例應(yīng)用中,它用于代表第三方驅(qū)動程序)。關(guān)鍵是,你可以忽略此錯誤消息。典型情況下,軟件供應(yīng)商不會與驅(qū)動程序一起提供相應(yīng)的符號文件,而且他們也沒有必要針對你的目的而提供;而在沒有這些符號文件情況下,你仍然可以找出存在問題的驅(qū)動程序。
觀察為什么Windows 10會崩潰
假設(shè)一切都很順利,那么你只需要打開WinDbg產(chǎn)生的轉(zhuǎn)儲文件來確定操作系統(tǒng)和二進(jìn)制文件,找到正確的符號表文件、下載所需的文件并進(jìn)行基本的分析即可。如果這是WinDbg首次運行在此系統(tǒng)上,或你正在查看一個來自于另外一個系統(tǒng)(你從未在其上為轉(zhuǎn)儲文件加載過文件)的轉(zhuǎn)儲文件,那么,這可能需要花費一點時間。在接下來的問題分析中,進(jìn)度可能會加快,因為大部分或所有需要的符號都已經(jīng)存在于硬盤上了。
接下來,我們所分析的信息范圍包括:WinDbg的版本,打開的轉(zhuǎn)儲文件的位置和名稱,正在使用的符號搜索路徑,以及一點總結(jié)性分析。
在我們的示例中,我們知道“Probably caused by : myfault.sys”這一行提示是正確的,因為它正好是NotMyFault驅(qū)動程序的名稱。
通常情況下,在診斷Windows崩潰的原因時還需要更多的信息。例如,你可能已經(jīng)認(rèn)出某某驅(qū)動程序,但你可能不確信它是最新的版本;你也有可能還沒有識別出驅(qū)動程序或知道誰開發(fā)的此程序;或者在其他情況下,某某驅(qū)動程序?qū)嶋H上可能正好來自微軟自己并關(guān)聯(lián)到操作系統(tǒng)內(nèi)核,這使得它不太可能成為嫌疑程序。要了解更多信息,你通常需要的都是兩個如下命令。
!analyze –v與lmvm
命令比較
多年來,微軟公司一直繼續(xù)改進(jìn)和完善WinDbg。例如,在上面列出的兩個命令可以同時被輸入到WinDbg屏幕底部“kd >”提示符命令窗口中?,F(xiàn)在,這兩個命令都可以通過在WinDbg界面中選擇一個熱鏈接而啟動
使用!analyze –v
使用命令!analyze –v的輸出將提供有關(guān)系統(tǒng)崩潰事件的更詳細(xì)的說明信息。在我們的示例程序中,分析結(jié)果已經(jīng)準(zhǔn)確地描述了測試驅(qū)動程序(myfault.sys)的行為。在此,測試程序指示此測試驅(qū)動程序在訪問一個很高級別的中斷地址。
命令!Analyze –v的輸出結(jié)果DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
在這里,程序試圖以過高的中斷請求級別(IRQL)訪問一個可分頁(或完全無效)地址。這通常是由于驅(qū)動程序使用了不正確的地址所導(dǎo)致的。
注意,BUCKET_ID_FUNC_OFFSET是到可疑模塊的基地址的距離,而問題代碼正駐留于此地址處。
最重要的部分是,被WinDbg命名的可疑模塊是myfault;既然我們知道這是一個第三方驅(qū)動程序,那么它很有可能就是“罪犯”。
為了獲得一幅更好的圖片來觀察當(dāng)操作系統(tǒng)出現(xiàn)問題時究竟發(fā)生了什么事情,我們不妨來觀察一下堆棧中的信息。
觀察調(diào)試器顯示的堆棧輸出一直是很重要的,因為它能夠顯示出哪個程序處于活動狀態(tài),是否是它正在做的操作導(dǎo)致了系統(tǒng)的崩潰。當(dāng)觀察堆棧時,總是要觀察堆棧最右端存在的任何第三方驅(qū)動程序,并且要永遠(yuǎn)記住堆棧是以逆時間順序顯示的。因此,事件發(fā)生的順序是從底部到頂部;隨著每個新的任務(wù)由系統(tǒng)執(zhí)行,它會顯示在頂部,把以前的動作壓入堆棧中。在下圖展示的堆棧中,你可以看到NotMyFault/myfault正處于活動狀態(tài)。緊接著驅(qū)動程序的最后一項活動,Windows 10聲明了一個PageFault,然后是一個BugCheck,從而停止了系統(tǒng)的執(zhí)行(藍(lán)屏)。
在技術(shù)會議上,我常用的一個比方是:堆棧遍歷好比是你踏入一個房間,而此房間中剛剛發(fā)生了一宗謀殺案,你發(fā)現(xiàn)地板上躺著死者尸體,而有人正站在他的旁邊,手中還握著正冒煙的手槍。這并不意味著他就一定是兇手,但他肯定是頭號嫌疑犯。
NotMyFault/myfault模塊處于活動狀態(tài)
假設(shè)我們需要關(guān)于可疑模塊的更多的信息,那么我們可以運行命令lmvm。請參考下圖。
使用lmvm [模塊名]
現(xiàn)在,既然我們已經(jīng)有了一個可疑的模塊,那么再更多地了解有關(guān)它的信息就很重要了。這里有兩個關(guān)鍵點:第一,確保它確實是一個第三方模塊;第二,確定它是否是一個過時的模塊。lmvm命令能夠告訴我們這兩種信息以及更多的內(nèi)容(請見上圖)。例如,我們可以看到:模塊的制造商是SysInternals,它有一個時間戳是2012年4月。
當(dāng)然,我們知道SysInternals已經(jīng)被微軟并入。然而,該模塊幾乎就不是一個內(nèi)核操作系統(tǒng)驅(qū)動程序,所以它正好可以作為我們的演示目的來擔(dān)當(dāng)?shù)谌津?qū)動程序這一角色。而且,也不太可能出現(xiàn)一個只有四年壽命的驅(qū)動程序就需要更新。如果這是真實的情況,例如,驅(qū)動程序是一個視頻驅(qū)動程序,那么幾乎可以肯定一定會存在一個帶有補(bǔ)丁的更新的驅(qū)動程序。從lmvm工具中,你會知道應(yīng)該同哪一個供應(yīng)商聯(lián)系以更新有關(guān)驅(qū)動程序和信息;當(dāng)然,有可能是要安裝一個更新的版本。
雖然大多數(shù)BSOD錯誤容易歸因于第三方驅(qū)動程序,但有些并不那么清楚。在這些情況下,原因可能是從因系統(tǒng)過熱導(dǎo)致機(jī)箱風(fēng)扇故障到錯誤的內(nèi)存模塊等任何情況。
我們不妨來回顧一下:那些沒有明確或一致原因的系統(tǒng)崩潰通常都是由內(nèi)存問題引起的。進(jìn)行內(nèi)存檢查存在兩種值得推薦的方法:一種是使用Windows 10內(nèi)存診斷程序;另一種是使用Memtest86。
Windows有罪嗎?
也許沒有。多年來,許多人都責(zé)怪Windows操作系統(tǒng)的崩潰問題,而事實上,由于Windows自身原因?qū)е卤罎⒌那闆r極少。通常情況下,當(dāng)把Windows中的某代碼塊命名為culprit時,通常是其他一些驅(qū)動程序發(fā)出請求要求Windows組件執(zhí)行一項操作卻傳遞了一個錯誤的指令,例如告訴它寫入一個并不存在的內(nèi)存地址等。在這種情況下,操作系統(tǒng)通常被視為“持有確鑿證據(jù)的罪犯”,但其實他只是按照吩咐的去做了;這使得識別請求的初始發(fā)起者往往成為一項艱巨的任務(wù)。
防病毒、備份和其他實用程序怎么樣呢?人們常??吹较衲切┓啦《竞蛡浞莨ぞ哌@樣的驅(qū)動程序正是使用了類似于“culprit”這樣的命名。然而,他們可能不是真正的“壞蛋”。這種實用程序必須處于活動狀態(tài),因為它們必須時刻關(guān)注文件變化活動;這意味著,無論發(fā)生了什么事情,都會經(jīng)常在堆棧上發(fā)現(xiàn)它們的蹤跡。
不管你是否使用谷歌搜索引擎找到了一個名字為“culprit”的罪魁禍?zhǔn)?,你所遇到的任何問題都有可能已被其他人經(jīng)歷過,而且在互聯(lián)網(wǎng)上存在無數(shù)的地方可能提供相應(yīng)的幫助信息。
最后,當(dāng)你發(fā)現(xiàn)你將能夠很快在沒有其他幫助并免費解決大多數(shù)BSOD問題時,你閱讀本文以及設(shè)置WinDbg的時間將會很好地得到賠償。請記?。鹤屑?xì)研究一下《Windows Internals》將會極大擴(kuò)展你的新發(fā)現(xiàn)技能。
原文標(biāo)題:Hardcore Windows: How to solve Windows 10 crashes in less than a minute,作者:Dirk A.D. Smith
【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】