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