close

 crash-or-hang-dump-analysis-using-windbg-in-windows-platform-by-ksshanmugasundaram-1-638.jpg 

【寫在前面】

藍色當機畫面一直以來是微軟的金字招牌,筆者猶記得國中時第一部個人電腦 – Acer Aspire Pentium 166 with MMX,搭載史上最為暢銷的作業系統 – Windows 95,可惜那時代的 OS 混合了 16 位元 / 32 位元的系統不比現在穩定,出現藍色畫面算是家常便飯,筆者當初年紀小對電腦比較陌生,每每被這畫面嚇的都是褲子一大包,心想:「慘了,五、六萬的電腦就這樣被我搞壞,這下屎定了…」,是後來才漸漸發現原來這不是我的問題啊啊啊~~~

一直到 NT 技術平台Windows New Technology)的發表,採用了純 32 位元 NT 核心的 Windows XP 才比較不容易出現藍屏,不過筆者要強調的是「比較不容易」而不是「不會發生」。

相信各位同學對於下面這畫面應該不陌生,而且對於這樣的狀況絕大多數人所做的第一件事就是:強制斷電關閉電腦,不錯!筆者給你拍拍手,會這招相信你也離 Professional 不遠矣,既然如此,我們何不研究看看是什麼原因導致這藍屏出現呢? 


【何謂藍屏】

藍白當機畫面(Blue Screen of Death,簡稱 BSoD),指的是微軟 Windows 作業系統無法從一個系統錯誤中恢復過來所出現的畫面。

筆者下面就列出微軟各版本作業系統所出現的藍屏畫面當參考。

  • Windows CE

WCE_stop_message.png 

  • Windows 3.1

Win31CHSBLU.png 

  • Windows 95/98/Me

Windows_9X_BSOD.png 

  • Windows XP/Vista/7

Windows_XP_BSOD.png 

  • Windows 8/8.1/10

BSoD_in_Windows_8.png 

時代在進步,就連這藍屏畫面也在進步,而且還會顯示中文呢!以下畫面是 Windows 8 以上版本的藍屏畫面,比起以往全都是看不懂的火星文,是不是可愛逗趣多了? 

IMAG0388.jpg 

這紅色當機畫面就沒看過了吧,這是 Longhorn 還在 Beta 測試階段的紅屏當機(RSoD),不過後來正式版就改回傳統的藍屏,所以這也算是另類經典畫面。

Longhorn_RSoD.png 


【為什麼會藍屏】

原因有很多,最常見就是軟體 DLL 衝突,早期 Windows 沒有很嚴謹的 DLL 版本管理機制,導致新安裝的軟體覆蓋了系統上原有的 DLL 檔,此時就會發生相容性問題而造成程式無法正常執行,嚴重一點就是賞你一個藍屏臉色看。

其他因素還有硬體的故障,記憶體有問題也會出現藍屏,系統過熱導致熱當也會出現藍屏,硬碟毀損壞軌也會出現藍屏,BIOS 設定錯誤也會出現藍屏,驅動程式安裝不正確也會出現藍屏等等,多到筆者不勝枚舉。


【藍屏分析】

這就是本篇的重點,一般來說,藍屏畫面會顯示當下出錯的記憶體值以及暫存器值,我們就可以靠著這些蛛絲馬跡來旁敲側推其藍屏原因。

還有,必須要先去◤系統內容→◤進階→◤啟動及修復→◤設定→確定有開啟系統失敗時自動建立「記憶體傾印」,俗稱叫做「Memory Dump」,這樣我們就可以來當一下事後諸葛。

 2015-11-03 17 03 12.png 


首先我們要先安裝 Windows 偵錯工具,也可以叫做 Debugging Tools for Windows,更簡單的說法是 WinDbg,點擊「sdksetup.exe」進行線上安裝,照著以下圖片步驟設定即可。

  • 選擇安裝至本機電腦。

2015-11-03 15 11 22.png 

  • 微軟於安裝過程中會收集資料當經驗改善,預設即可。

2015-11-03 15 12 09.png 

  • 授權合約,一定要接受才可以安裝。

2015-11-03 15 12 17.png 

  • 這邊其實只要勾選「Debugging Tools for Windows」即可。

2015-11-03 15 13 15.png 

  • 記得保持網路暢通,因為他是線上安裝的版本,所以需要下載主程式。

2015-11-03 15 15 00.png 

  • 完成安裝。

2015-11-03 15 17 15.png 

  • 你會在開始功能表看到一個名為「Windows Kits」的程式集。

2015-11-03 15 19 31.png 

  • 展開程式集找到「WinDbg (X64)」並點擊執行。

2015-11-03 15 19 50.png 

  • 以下就是 WinDbg (X64) 主程式畫面。

2015-11-03 15 21 56.png 

◤ 首先就是要先設置 Symbol Path 的路徑讓 WinDbg (X64) 可以抓取微軟線上資料庫來查詢,如果沒有這 Symbol Path 基本上 WinDbg (X64) 就是個廢材,沒辦法幫助我們分析出更多問題原因。

  • 點擊「File」→「Symbol File Path ...」。

2015-11-04%2010%2012%2008.png 

  • 輸入◤ SRV* C:\Symbols *http://msdl.microsoft.com/download/symbols 後點擊 OK,

2015-11-03 15 22 06.png 

  • 點擊「File」→「Open Crash Dump ...」,選擇你要分析的 Memory Dump。

2015-11-03 15 22 26.png 


【範例說明】

筆者這邊先舉例在我電腦上所發生過的一次當機,當你打開這個 Memory Dump 時應該會感到不知所措,因為上面有太多訊息讓人無所適從,沒關係,我們只要注意幾個關鍵訊息就可以。

  • 首先我們先確認這次當機的作業系統是什麼版本:
    ◤ 筆者這次的範例為 Windows 10 ,Kernel 版本為 10240。

2015-11-03%2015%2025%2000.png 

  • 再往下看可以看到 System Uptime(開機時間):
    ◤ 本範例為 System Uptime : 0 days 0:01:00.768,意思是 0 天 0 小時 1 分 0 秒 768 毫秒時出現藍屏,基本上小於 1 分鐘都是屬於開機藍屏,超過 3 分鐘算是操作程序導致的藍屏。

2015-11-03%2015%2025%2001.png 

  • 重點訊息Probaly caused by(造成藍屏可能的原因):
    ◤ 接下來看到的這一個訊息是比較關鍵的訊息,他主要說明了引發這次藍屏的主要程式或驅動,如下圖是顯示 Probaly caused by:ntkrnlmp.exe 的程式導致藍屏,而後面的括號內是屬於記憶體偏移位址,可能跟原程式代碼的編譯有關,筆者這裡就不自曝其短。

2015-11-03%2015%2025%2002.png 

  • 往往分析 Memory Dump 可不是運氣都那麼好,一眼就可以看出是哪一支程式在搞鬼,所以我們就要藉由一個指令:!analyze -v 來進行分析故障原因。
    ◤ 如下圖那樣直接點擊 !analyze -v 進行分析。

2015-11-03%2015%2025%2003.png 

  • 待分析完成,這裡顯示的是藍屏代碼。
    ◤ 本範例為 INTERNAL_POWER_ERROR (a0),比較熟悉的表示為 0x000000A0。

2015-11-03%2015%2027%2001.png 

  • 這裡是 WinDbg (X64) 給的ㄧ些建議,筆者常用 Google 翻譯來理解其中意思。
    ◤ The power policy manager experienced a fatal error.,翻成中文意思是:電源策略管理器經歷了一個致命的錯誤。雖然翻譯得很機械但至少我們知道這次的錯誤原因跟電源有關。

2015-11-03%2015%2027%2002.png 

  • 這裡就是我們常看到藍屏畫面上的 0x000000A0 後面的那一串括弧內的代碼,當然這對於初學者及包括筆者來說,好像是在看天書一樣,不過看不懂沒關係,這並不是重要訊息,而且隨著藍屏的產生其顯示代碼都不盡相同,就當作是累積分析經驗看看。

2015-11-03%2015%2027%2003.png 

  • 這裡可以看到主機的基本訊息:
    ◤ BIOS 版本、主機板型號等。

2015-11-03%2015%2027%2004.png 

  • 這裡才是主要藍屏代碼,通常在 MSDN 上的藍屏代碼顯示是「0xa0」,而非我們所熟悉的「0x000000A0」。

2015-11-03%2015%2027%2014.png 

  • 這裡顯示的是觸發藍屏的應用程序,有可能是 exe、dat、dll 等並不固定,值得注意是這邊顯示的並不是藍屏真正原因,因為只有使用者的程序去觸發了內核崩潰才會導致藍屏。

2015-11-03%2015%2027%2015.png 

  • 這裡就比較有學問,這裡的訊息是詳細告訴我們導致這次藍屏的主要原因,不過對於初學者及包括筆者來說是很難一下子就理解,需要靠多次的分析 Memory Dump 來累積經驗值,筆者唯一認得的就是 nt! ?? ::OKHAJAOM::`string'+2d6d,在一開始 Probaly caused by 後面括號內的記憶體偏移位址,相信分析久了就會發現其中一些蛛絲馬跡。

2015-11-04%2013%2022%2045.png 

◤ 所以我們來歸納一下上面 Memory Dump 所給的訊息:
 筆者開機 1 分多鐘後一個名為 System 使用者觸發了 ntkrnlmp.exe 程序而導致藍屏,而 ntkrnlmp.exe 這是本身系統內建的程序,由此可知可能是微軟作業系統本身的 Bug。

我們進一步至微軟支援中心以及 Microsoft Community 搜尋看看有沒有類似相關的問題,甚至你也可以使用 Google 來搜尋「0x000000A0」。

  • 當您在從休眠恢復 Windows 8 或 Windows Server 2012"0x000000A0"stop 錯誤,文章連結

2015-11-04%2014%2004%2046.png 

  • 升級win10之後,經常出現休眠之後第二天喚醒時自動重啟,文章連結

2015-11-04%2014%2005%2004.png 

的確,筆者當初是有執行休眠的動作,由此可知這是從休眠再喚醒的一個 Bug,筆者推測應該是 ASUS P8H77-I 的 BIOS 或者驅動程式對於 Windows 10 支援並不完善,導致電源管理機制出了問題,但這部分就必須仰賴主機板廠商的後續支援,不過以華碩官網來看 ASUS P8H77-I 最新作業系統僅支援至 Windows 8.1,所以如果要繼續使用休眠功能的話就必須如下圖關閉快速啟動之功能來解決,標不治本。

2015-11-04%2015%2059%2029.png 


【寫在後面】

現在,同學應該有基本的能力去分析絕大部分的 Memory Dump,這些經驗都是一點一滴累積起來,對於每一個 Memory Dump 也不用太過於糾結其結果,其實我們做這個 Memory Dump 分析不過是從中觀察出一些規則或是規律而已,例如你分析了 10 個 Memory Dump,其中 5、6 個都指向同一個問題,剩下的五花八門摸不清,這時候你只要把指向同一個問題的原因給解決就好,其他應該是作業系統本身的問題,不然微軟怎麼會一天到晚都在發行 Hot-Fix,也不會有 Service Pack 包出現。

隨著作業系統的精進,老實說筆者從 Windows 8 使用以來沒有遇過因系統內核崩潰導致當機,有的也僅是過熱造成的當機而已,微軟的 NT 核心技術演進至今已經是 10.0 版(微軟為了方便識別,名稱由原本的 NT 6.4 → NT 10.0),筆者相信往後的作業系統只會越來越穩定,而終有一天可以跟藍白畫面說掰掰!

希望啦……


【免責聲明】

1. 本人提供的所有資源均是在網上搜集。任何涉及商業盈利目的均不得使用,否則產生的一切後果將由您自己承擔!

2. 僅供個人測試無販售行為及獲得任何利益!

3. 凡交流會員請於下載後24小時以內將檔案刪除!

4. 滿意者請購買正版並尊重智慧財產權!

5. 如作為其它用途,皆與作者無關!


【下載連結】

◤ Windows 10 偵錯工具 (WinDbg):微軟官方載點

◤ 其他版本請前往微軟網站查看:WDK 與 WinDbg 下載



arrow
arrow

    林阿光 發表在 痞客邦 留言(3) 人氣()