◆錯誤分析:通常是由故障驅動引起的(如羅技MouseWare 9.10和羅技鼠標9.24驅動)。同時,有缺陷的內存、損壞的虛擬內存文件和壹些軟件(如多媒體軟件、殺毒軟件、備份軟件和DVD播放器軟件)也會導致這種錯誤。
◇解決方法:檢查最新安裝或升級的驅動(如果藍屏出現類似“acpi.sys”的文件名,肯定是驅動問題)和軟件;測試內存是否有問題;進入“恢復控制臺”,到虛擬內存頁面文件Pagefile.sys所在的分區,執行“del pagefile.sys”命令刪除頁面文件;然後在頁面文件所在的分區執行“chkdsk /r”命令;進入Windows後重置虛擬內存。如果妳在上網的時候遇到這個藍屏,而且妳只是在下載和上傳很多數據(比如網遊和BT下載),那應該是網卡的驅動,妳需要升級它的驅動。WinDbg是免費軟件,其微軟官方下載地址指的是延伸閱讀。具體項目是為Windows 32/64位版本安裝調試工具。
使用WinDbg分析崩潰時的內存轉儲文件的前提是,您希望系統在崩潰時自動生成壹個內存轉儲文件,如下所示:
1.單擊開始,然後單擊運行。
2.類型controlsysdm.cpl。
復制代碼
,然後單擊確定。您將打開系統屬性,請切換到高級選項卡。結果如下圖所示:
3.在高級選項卡上,單擊啟動和恢復部分中的設置。這將打開啟動和恢復對話框,如下圖所示:
4.在調試信息列表中選擇“小內存轉儲(64 KB)”或“核心內存轉儲”,這樣系統崩潰時會自動生成相應的內存轉儲文件。如果您不希望藍屏只是閃爍,而是希望在手動重新啟動計算機之前清楚地看到它,請清除“系統故障”部分中自動重新啟動(R)項目前的復選框。然後單擊確定。
5.在啟動和恢復對話框中,單擊確定。
6.單擊確定關閉系統屬性對話框。
7.在系統設置更改對話框中,如果要立即重新啟動計算機,請單擊是;如果希望以後重新啟動計算機,請單擊“否”。
註意:?
Vista用戶也請這樣做。?對於原操作系統,以上設置為默認(禁止自動重啟除外)。?對於第4點中的書面調試信息列表的內容,給出以下參考解釋:
(以上三個轉儲文件的大小依次增加,它們之間的比較超出了本文的範圍。作者只建議設置為“小內存轉儲”或“核心內存轉儲”,壹般錯誤“小內存轉儲”就夠了。如果不能完全分析,請選擇“核心內存轉儲”。對於數據的豐富性,也可以直接選擇“核心內存轉儲”,但我強烈推薦完全內存轉儲。)
值得註意的是,為了確保在崩潰時自動生成內存轉儲文件,您可能還需要啟用虛擬內存分頁文件。特別是,當您選擇記錄核心內存轉儲時,您必須啟用虛擬內存分頁文件,並且因為核心內存轉儲文件的大小取決於操作系統和該機器上所有活動驅動程序已經分配的內核模式內存量,所以沒有好的方法來預測核心內存轉儲的大小。下表僅給出了這種情況下的參考虛擬內存大小設置值:
另外,除了頁面文件占用的磁盤空間,內存轉儲文件(*。DMP)應該有足夠的空閑空間來提取這個轉儲文件,否則它將“未生成”(實際上丟失)。
設置好這些設置後,壹旦妳的系統出現藍屏死機,系統會在上述設置中選擇的對應內存轉儲文件類型下的對應目錄下生成壹個轉儲文件。妳要做的就是馬上拿出利器——啟動WinDbg進行分析。
筆者在這裏用壹個例子來詳細說明,這個例子包含了WinDbg調試藍屏時使用的壹些命令。這些命令不再另行安排,閱讀時請註意記憶。
首先,您需要配置WinDbg將使用的調試符號文件的位置。什麽是調試符號文件?符號文件是隨著DLL文件或EXE文件的建立而生成的,這些文件為可執行文件和動態鏈接庫(DLL)中包含的函數提供了空間。此外,符號文件還可以表示到故障點的函數調用路線圖。當我們使用各種微軟工具調試應用程序時,必須要有符號信息,這樣才能正確分析問題的根源。那麽我們如何設置調試符號文件的位置呢?我們可以從微軟官方網站(都在WinDbg下載頁面)下載完整的符號文件包,也可以使用微軟符號服務器。我推薦後者,因為分析中使用的符號文件有限。使用後者可以使程序自動下載,既節省了時間,又保證了符號文件是最新的、正確的。在WinDbg中點擊“文件”菜單,選擇“符號文件路徑……”,在打開的對話框中輸入。
復制代碼
然後點擊“確定”按鈕。當然,另壹個步驟是再次點擊“文件”菜單,選擇“保存工作區”來保存當前的設置。
設置符號文件後,您可以分析內存轉儲文件。點擊“文件”菜單,這次選擇“打開崩潰轉儲…”,然後通過文件打開對話框打開生成的內存轉儲文件進行分析。在本例中,設置了核心內存轉儲類型,因此您應該導航到“%SystemRoot%”(即系統盤的Windows文件夾下)並打開內存。DMP檔案。但是我已經轉移到“E:\內存轉儲\內存。DMP”,所以在下面的圖片中,妳會看到這個地址。這時WinDbg會滾動顯示壹些信息,感覺有點懸,直到從微軟符號文件服務器下載完分析這個崩潰文件所需的所有符號文件。
在上圖中,我們看到的是調試器命令窗口(符號文件已經加載並準備就緒)。我們先來看看底部的6區。這個小矩形條就是WinDbg的命令入口,分為兩個區域,左邊顯示“0: KD >”。是提示區,右邊空白區是命令輸入區。當這個窗口剛剛打開,符號文件還沒有下載/加載時,提示區什麽都不會顯示,命令輸入區會顯示“Debuggee not connected”。在符號加載之前,窗口中顯示的最後壹行“Followup: MachineOwner”將變為空閑。空閑時會出現類似上圖的情況。為什麽說類似?因為這個idle standby提示根據調試類型和電腦處理器的硬件配置不同,比如在這種情況下進行內核調試,所以顯示“KD >”。(內核調試),系統是多核處理器,所以在“KD >”之前還顯示了壹個“0:”表示當前位於編號為0的處理器中。執行壹個命令後,如果該命令需要處理更多的任務(如"!Analyze -v”),提示區在繁忙狀態下會顯示為“*BUSY*”。壹旦在這種狀態下顯示,無論妳輸入什麽命令,都不會立即執行,而是在空閑時延遲執行。
如上圖所示,打開的內存轉儲文件的物理路徑會顯示在圖中的1區域;區域2顯示了當前加載的符號文件的位置,在這種情況下表示它是從微軟服務器下載的;區域3***有三行,顯示系統信息。第壹行表示系統是Windows XP,內核版本是2600(SP3),有兩個多處理器(32位)。第二行表示系統類型為NT系統和客戶端系統,第三行表示系統的詳細版本標識。4***區有兩條線路。第壹行表示內存轉儲文件生成的時間,即系統崩潰的具體時間。在本例中(這是去年65438+2月獲得的壹個崩潰轉儲文件,現在用作本例的說明),是周六(星期六),65438+2月27日(十二月),22: 56: 3655。區域5是壹個關鍵錯誤信息,它的第壹行僅在加載符號文件時顯示。在這種情況下,它告訴我們“對於BaseTDI。SYS文件,該模塊已加載,但無法為其加載符號文件。如果之前配置了正確的符號文件路徑,它會告訴我們BaseTDI。SYS不是微軟的文件,而是第三方的驅動文件,這很可能是錯誤的原因,值得註意,但需要進壹步分析。5區的第二行是WinDbg自動分析的結果,告訴我們崩潰的原因(很可能是由:)很可能是HookUrl.sys文件。壹般情況下,這是錯誤的罪魁禍首,但也有很多例外。最典型的就是在這裏顯示壹個微軟自己的文件。妳要註意了。為了避免濫殺無辜,最好能進壹步分析,看看墜機最後時刻涉及到哪些模塊,這樣才能保證審判正確!用於進壹步分析的命令可以從“!分析-v”開始。
我們可以在命令輸入區域手動鍵入命令
!分析-v
復制代碼
,也可以在上圖7區顯示的位置點擊藍色命令。之後提示區會顯示為“*BUSY*”,WinDbg會分析壹段時間,直到顯示結果,再次轉為空閑狀態。讓我們來解釋壹下“的實現!analyze -v之後顯示的各種結果:
自動分析後,WinDbg可能會在上圖1區域顯示的第壹行顯示錯誤檢查解釋,第二行給出詳細解釋。從圖中的信息可以看出,這個錯誤是由於“隊列工作項完成前卸載了驅動程序”造成的。這個“driver _ unloaded _ without _ canceling _ pending _ operations”應該是藍屏上面顯示的錯誤描述,下面的參數1~4是藍屏顯示時stop代碼後面的四個參數。圖中2區顯示的BUGCHECK_STR是WinDbg中的分類bug檢查之壹,這裏是0xCE,也是stop代碼的分類縮寫,我們在命令輸入區執行。
。錯誤檢查
復制代碼
命令,可以得到stop代碼及其參數,與上圖中1區域和藍屏的信息壹致。在此示例中,可以獲得以下結果:
0:KD & gt;。錯誤檢查
錯誤檢查代碼000000CE
參數BAC B0 a 4 e 00000008 BAC B0 a 4 e 00000000
通過在錯誤檢查代碼值前添加“0x”,我們可以在藍屏上看到消息“* * * stop:0x 0000000 ce(bacb0a4e,0000008,BAC B0 a 4 e,000000)”。當然,如果您想了解更多有關此錯誤的信息,可以在Microsoft在線幫助和支持網站上搜索字符串“0x000000CE”,然後您可以使用上圖中區域2中的BUGCHECK_STR值“0xCE”來執行它。
。hh錯誤檢查0xCE
復制代碼
命令,單擊打開窗口左欄右下角的“顯示”按鈕。如果您想在WinDbg中顯示壹個停止代碼或錯誤檢查類的詳細描述(以這個錯誤為例),請鍵入命令。
!分析-顯示0x000000CE
復制代碼
或者
!分析-顯示000000CE
復制代碼
,也可以是
!分析-顯示0xCE
復制代碼
。3區顯示的是二審判決的重要信息——線程棧信息。請特別註意紅框中的部分,第壹行是“警告:幀IP不在任何已知模塊中。以下幀可能是錯誤的。表示“警告:堆棧幀IP(InstructionPtr,僅限x86處理器,用於確定幀堆棧回撤的指令指針)在任何已知模塊中都不存在,後續幀可能有錯誤”。對這壹含義的解釋超出了本文的範圍。作者只告訴妳這壹行下面壹行右邊的模塊是系統藍屏崩潰時最後使用的模塊(除了Windows內核最後調用KeBugCheckEx犧牲自己,也就是警告文字上面的三行),經常導致崩潰!讓我們仔細看看。如果妳知道堆棧的數據結構或者Windows的內存分配機制,妳應該知道當Windows為線程分配額外的內存時,它是從高地指向低地址的。也就是說我們要從下往上看藍色區域3的堆棧信息,就是系統崩潰前壹刻內核態函數的調用和轉移。例如,在這種情況下,系統內核執行器(nt!也就是Ntoskrnl.exe)通過函數IopfCallDriver調用BaseTDI,然後BaseTDI調用Hooke rurl . sys(unloaded _這個詞的意思是卸載),然後屏幕就藍屏了。然後在這最後的時刻,涉及到了兩個非Windows內核模塊——base TDI和HookUrl.sys。之所以這樣“二審判決”是為了避免壹種情況——萬壹HookUrl.sys和BaseTDI是兩家公司或者兩個軟件的模塊,最後加載的HookUrl.sys是沒有問題的。該錯誤是因為BaseTDI向HookUrl.sys傳遞了錯誤的格式或損壞或非法的參數信息,而HookUrl.sys接受了這些無效數據,導致了崩潰。如果不看線程棧,我們就按照前面的“可能原因by: hook URL”來判斷。sys”,而我們很可能會濫殺無辜,讓兇手逍遙法外。只有通過線程棧才能發現另壹個驅動BaseTDI也參與其中。(在應用崩潰而不導致系統崩潰的調試分析中,“可能原因:”在WinDbg的自動分析結果中幾乎總是錯誤的,因為它處於用戶模式。在這種情況下,使用!Thread命令不能顯示任何信息,因為這個命令只對內核崩潰調試有效。但是,kb命令不能顯示任何有用的信息。只有用“~*kb”詳細顯示所有線程棧,才能找到問題的根源,有時還需要其他命令,本文不討論)。
當然,如果妳精通的話,妳覺得沒必要用”!Analyze -v "命令,可以直接使用。
!線
復制代碼
或者
千字節
復制代碼
該命令顯示核心線程堆棧信息,以進行第二次判斷。現在,嫌疑人的目標是BaseTDI和HookUrl.sys,現在,我們來看看他們是什麽,是哪個公司,是哪個程序模塊。(從之前不能從微軟服務器自動加載符號文件就可以知道他們壹定是第三方驅動。)
使用命令
lm kv m Basetdi *
復制代碼
(使用lm (List Module)命令、kernel K選項、detailed V選項和參數m,以及包含通配符*的字符串BaseTDI,列出當時在內核模式下加載的包含字符BaseTDI的所有驅動程序文件詳細信息。用通配符代替完整的文件名後綴可以避免信息的限制,這樣我們可能會找到多個相關的模塊來提供更多的診斷線索),我們得到如下結果:
從圖中的藍框中,我們可以看到只有壹個名為BaseTDI的文件。SYS,該文件的路徑位於System32\Drivers下,屬於名為“產品名稱:瑞星PFW (PFW =個人防火墻)”的程序組件,軟件公司的註冊商標為“LegalTrademarks:瑞星”。如果不知道文檔的英文描述信息,可以百度壹下。當然,作者沒有突出顯示的信息(如文件時間戳、版本、校驗和等。)也很有用。例如,如果您查看文件版本,您可能會發現軟件已經提供了壹個更新的文件來解決這個問題。同樣,我們使用
lm kv m hookurl*
復制代碼
在內核模式下顯示包含HookUrl的文件及其詳細信息。結果如下:
該圖是壹個不令人滿意的結果,因為如突出顯示的部分所示,這個模塊沒有被加載,所以沒有記錄任何信息。但是我們有百度,不用擔心,妳看看百度就知道了。搜了壹下HookUrl.sys,發現這也是瑞星個人防火墻的壹個文件。這個案例其實就是著名的“瑞星個人防火墻升級到2009版時觸發藍屏”。可以通過關鍵詞“瑞星防火墻2009升級導致藍屏”搜索百度。截至目前,瑞星官方並未對此事件給出任何官方回復。雖然不是每個用戶都有這個問題,但是很多用戶都反映過,瑞星也不承認這是軟件缺陷。只有官方卡卡論壇上壹個不知道是不是工作人員的人發帖要求大家遇到藍屏時上傳內存轉儲文件。說到這裏,我又對瑞星失望了,不過可以看出分析藍屏內存轉儲文件有多有用!
在這裏,我還想給出兩個可能用來獲取更多信息的命令。壹個是
!進程0 0
復制代碼
,可以列出當時運行的所有進程的技術信息;另壹個是
!伏特計
復制代碼
可以顯示當時虛擬內存的使用情況,對於分析系統是否耗盡了虛擬內存、換頁內存池還是不換頁內存池,結合進程列表查找可能的內存泄漏錯誤非常有用,但不在本文討論範圍內。
最後,我們來看看在以下兩種特殊情況下,如何使用WinDbg進行調試和分析:
第壹種情況是系統掛起,即“系統崩潰”和“系統無響應”。在這種情況下,系統無法自動生成內存轉儲文件,妳也不可能操作本地軟件找出是什麽東西掛起了系統。此時,我們需要手動使系統崩潰,以生成內存轉儲文件。為此,在系統掛起之前,打開註冊表編輯器並導航到。
HKEY _ LOCAL _ MACHINE \ System \ current control set \ Services \ I 8042 port \ Parameters
復制代碼
在該項下,創建壹個名為。
CrashOnCtrlScroll
復制代碼
的DWORD鍵值(註意大小寫),並將其設置為1,然後重新啟動以應用此更改。壹旦系統掛起,您可以通過按住右Ctrl鍵並按兩次ScrollLock鍵來生成停止代碼為0x 000000 E2(manually _ initiated _ crash)的手動崩潰。得到內存轉儲文件後,按照上面的方法進行分析。請註意,這種方法對於插入USB端口的USB鍵盤無效。(筆記本電腦很多鍵盤都是通過PS/2接口連接的,所以有效。)
第二種情況,進不了系統就會自動崩潰,也無法提取內存轉儲文件。在這種情況下以及有特定需要時,可以采用雙機調試的方法。我們把崩潰的機器稱為“目標機器”,把用來連接“目標機器”進行調試的機器稱為“調試主機”。調試主機必須安裝WinDbg。
首先,我們需要在兩臺機器之間建立連接。在WinDbg的新版本中,有三種方法可以連接到目標機器。第壹種方式是通過COM口連接,使用Null-Modem,即COM對接線——兩端帶孔的RS232線;第二種是使用IEEE 1394線纜連接,但是這種連接需要兩臺機器運行相同版本的至少Windows XP系統;第三種方式是使用專用的USB 2.0調試線纜連接,不是普通的USB線纜,而是內置硬件芯片支持調試的線纜,而且這種方式要求目標機至少運行Windows Vista。使用這三種連接方式進行雙機調試,需要在目標機上進行相應的設置調整。有關詳細信息,請參考WinDbg幫助文件。這裏只討論第壹種連接模式的設置,因為這是XP及以上系統默認支持的最簡單的模式。此時,我們假設兩臺機器已經用COM電纜連接起來。
其次,在調試主機上啟動WinDbg並準備好符號文件後,我們展開文件菜單並選擇內核調試…,這將打開以下內核調試對話框:
默認情況下,打開COM連接模式的配置頁。這裏的“波特率”和“端口”需要根據下壹步的工作模式進行配置。
最後壹步,我們可以啟動目標機器,在啟動Windows之前按下F8,在啟動菜單中選擇“調試模式”。這樣傳輸速率默認設置為19200,端口也默認設置為COM2,我們要按照上壹步的這個設置點擊“確定”。XP修改Boot.ini,Vista修改Bootcfg,調試指定端口和傳輸速率請參考WinDbg幫助文件,此處不再贅述。當目標機壹起啟動Windows時,信息可以顯示在位於調試主機中的WinDbg中,然後按照本文介紹的方法進行調試。另外,對於上述系統掛起,也可以采用這種雙機調試,還有新的命令。
。碰撞
復制代碼
強制目標機在其本地硬盤生成崩潰轉儲,可以在系統重啟時提取,當然也可以使用。
。dump /m COM.dmp
復制代碼
命令在調試主機WinDbg所在的目錄下生成壹個名為“COM.dmp”的小內存轉儲文件(命令中的文件名可以改成別的)。
編輯此段落
防止電腦藍屏的九大技巧
1定期手動備份重要的註冊表文件,避免系統出錯後未能及時用備份文件替換而導致不可挽回的錯誤。
2盡量避免非正常關機,減少重要文件的丟失。比如。vxd.dll檔案。
對於普通用戶來說,只要能正常運行,就不需要升級顯卡和主板的BIOS和驅動,避免升級帶來的危害。
定期檢查優化後的系統文件,運行系統文件檢查器檢查文件丟失情況,校對版本。檢查步驟見前面相關介紹。
5減少無用軟件的安裝,盡量不要手動卸載或刪除程序,減少非法替換文件和文件指向錯誤的發生。
6如果內存不是特別大,其管理程序也很優秀,盡量避免同時運行大型程序。如果聽MP3時發現有沙沙聲,基本可以判斷故障是內存不足造成的。
7定期使用殺毒軟件進行全面掃描,清除病毒。
不要去壹些不熟悉的網站,也不要點擊壹些網站上誘人的圖片和中獎消息。
定期升級操作系統、軟件和驅動程序。
再多說壹點話,............慢慢來。哈╮ (╯ ▽ ╰) ╭《苦孩子》