WinDbg是微軟發布的一款相當優秀的源碼級(source-level)調試工具,可以用于Kernel模式調試和用戶模式調試,還可以調試Dump文件。它能夠通過dmp文件輕松的定位到問題根源,可用于分析藍屏、程序崩潰(IE崩潰)原因,是我們日常工作中必不可少的一個有力工具,學會使用它,將有效提升我們的問題解決效率和準確率。
在DotNet方面WinDbg是調試分析SSCLI的最佳工具,同時可以和SOS擴展一起調試分析.net程序。
配置WinDbg:
運行WinDbg->菜單->File->Symbol File Path->按照下面的方法設置_NT_SYMBOL_PATH變量:
在彈出的框中輸入“C:\MyCodesSymbols; SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols”(按照這樣設置,WinDbg將先從本地文件夾C:\MyCodesSymbols中查找Symbol,如果找不到,則自動從MS的Symbol Server上下載Symbols)。另一種做法是從這個Symbol下載地址中http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx,下載相應操作系統所需要的完整的Symbol安裝包,并進行安裝,例如我將其安裝在D:\WINDOWS\Symbols,在該框中輸入“D:\WINDOWS\Symbols”。(這里要注意下載的Symbols的版本一定要正確,在我的Win2003+Sp1上,我曾經以為安裝Win2003+Sp2的Symbols可能會?!咙c,但結果證明我錯了,用WinDbg打開可執行文件時,提示“PDB symbol for mscorwks.dll not loaded;Defaulted to export symbols for ntdll.dll”的錯誤,我有重新裝上Win2003+Sp1的Symbols, 現在一切運行正常^_^)
使用WinDbg:
WinDbg提供了圖形界面和命令行兩種運行方式。這里介紹使用圖形界面的WinDbg來調試應用程序:
File->OpenExecutable->可以選擇一個可執行文件進行調試;
File->Attache to a Process->可以選擇一個運行中的進程,并對其進行調試;
至此,我們就可以在上圖中用紅色方框標記的文本框中輸入各個功能指令了(有關指令的幫助文檔,可以參考:Help->Contents->Debugging Tools for Windows->Debuggers->Debugger Reference,該目錄下列集了所有指令機器功能說明!)。
分析一些dmp文件:
分享一個8E藍屏dmp案例的分析過程:
當你打開一個dmp文件后,可能因為太多信息,讓你無所適從,不過沒關系,我們只需要關注幾個關鍵信息即可。
第一個關鍵信息:System Uptime(開機時間):
通過觀察這個時間你就可以知道問題是在什么時候出現的,例如時間小于1分鐘基本可以定位為開機藍屏,反之大于一分鐘則可證明是上機后或玩的過程中出現問題了。
接下來用一個簡單的例子來學習簡單的dmp分析,下圖中System Uptime: 0 days 0:14:23.581,意思是0天(days)0小時14分23秒581毫秒時出現藍屏了,看來是上機沒多久就藍屏了,這位顧客很悲催……
那么是什么導致藍屏的呢?接下來我們就要注意第二個關鍵信息了!
第二個關鍵信息:Probaly caused by(造成藍屏可能的原因)
這個信息是相對比較重要的一個信息,如果你運氣好的話,通過這個信息基本上可以看到導致藍屏的驅動或者程序名稱了,就像下圖一樣,初步的分析已經有了結果,Probaly caused by后面顯示的是一個名為KiMsgProtect.sys的驅動文件導致藍屏,這個文件就是恒信一卡通的一個關鍵驅動。因此藍屏則很有可能和一卡通有關。
括號中驅動文件名后面的+號代表的是偏移地址,假如多個dmp文件的驅動文件名一樣,且偏移地址也一樣,則問題原因極有可能是同一個,這個偏移地址與匯編有關,這里不多做介紹。
其實,對于分析藍屏dmp并不是每次運氣都那么好,假如剛剛打開dmp文件未看到明確的藍屏原因時,我們就需要借助一個命令來進一步分析dmp,這個命令就是:!analyze -v,這個命令能夠自動分析絕大部分藍屏原因。當初步分析沒有結果時,可以使用該命令進一步分析故障原因,當然你也可以直接點擊鏈接樣式的!analyze -v來進行執行該命令,為了讓大家更直觀的看懂里面的信息,大家可以直接看圖片中的注釋信息。
看了這么多信息之后,這個藍屏dmp到底是怎么回事呢?根據dmp給出的信息,應該是:顧客上機0天(days)0小時14分23秒581毫秒時,一個名為PinyinUp.exe觸發了KiMsgProtect.sys這個驅動的一個Bug,導致藍屏。
那么PinyinUp.exe和KiMsgProtect.sys都是哪個廠商的?一般要知道這個信息,只能去用戶的機器上找了,我去找了之后發現PinyinUp.exe是搜狗輸入法的自動升級程序,KiMsgProtect.sys是恒信一卡通這個計費軟件的驅動,所以這個dmp表示出來的意思看上去是搜狗拼音和恒信一卡通搞在一起,出了問題!當然排除方法很簡單,把搜狗輸入法的自動升級程序刪除掉,再看看是否仍然有藍屏問題發生就ok了!
學到這里,基本上已經可以分析絕大部分dmp文件了,但是分析藍屏dmp要比較謹慎,對信息需要重新驗證一次才更加保險,驗證方法很簡單,在WinDbg的命令輸入框內,輸入!process命令,就可以驗證觸發藍屏的程序到底是否正確了。