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