生產(chǎn)環(huán)境中偶爾會(huì)出現(xiàn)異常問題。WinDbg或GDB是解決這些問題的工具。
調(diào)試工具WinDbg如同醫(yī)生的聽診器,是系統(tǒng)生病時(shí)做問題診斷的逆向分析工具,Dump文件類似于飛機(jī)的黑匣子,記錄著生產(chǎn)環(huán)境程序運(yùn)行的狀態(tài)。本文主要介紹了調(diào)試工具WinDbg和抓包工具ProcDump的使用,并分享一個(gè)真實(shí)的案例。N年前不知誰寫的代碼,導(dǎo)致每一兩個(gè)月偶爾出現(xiàn)CPU飆高的現(xiàn)象。我們先使用ProcDump在生產(chǎn)環(huán)境中抓取異常進(jìn)程的Dump文件,然后在不了解代碼的情況下通過WinDbg命令進(jìn)行分析,最終定位到有問題的那行代碼。一、診斷工具簡(jiǎn)介
1.1 WinDbg
WinDbg是在Windows平臺(tái)下的、強(qiáng)大的用戶態(tài)和內(nèi)核態(tài)調(diào)試工具。相比較于Visual Studio,它是一個(gè)輕量級(jí)的調(diào)試工具,所謂輕量級(jí)指的是它的安裝文件大小較小,但是其調(diào)試功能,卻比VS更為強(qiáng)大。它的另外一個(gè)用途是可以用來分析Dump數(shù)據(jù)。WinDbg是Microsoft公司免費(fèi)調(diào)試器調(diào)試集合中的GUI的調(diào)試器,支持Source和Assembly兩種模式的調(diào)試。WinDbg不僅可以調(diào)試應(yīng)用程序,還可以進(jìn)行Kernel Debug。結(jié)合Microsoft的Symbol Server,可以獲取系統(tǒng)符號(hào)文件,便于應(yīng)用程序和內(nèi)核的調(diào)試。WinDbg支持的平臺(tái)包括x86、IA64、AMD64。雖然WinDbg也提供圖形界面操作,但它最強(qiáng)大的地方還是有著強(qiáng)大的調(diào)試命令,一般情況會(huì)結(jié)合GUI和命令行進(jìn)行操作,常用的視圖有:局部變量、全局變量、調(diào)用棧、線程、命令、寄存器、白板等。其中“命令”視圖是默認(rèn)打開的。
1.2 DebugDiag
DebugDiag最初是為了幫助分析IIS的性能問題而開發(fā)的,它同樣可以用于任何其他的進(jìn)程。DebugDiag工具主要用于幫助解決如掛起、 速度慢、 內(nèi)存泄漏或內(nèi)存碎片,和任何用戶模式進(jìn)程崩潰等問題。該工具包括附加調(diào)試腳本,側(cè)重于互聯(lián)網(wǎng)信息服務(wù)(IIS)應(yīng)用程序、 Web數(shù)據(jù)訪問組件、 COM+和相關(guān)Microsoft技術(shù)、SharePoint和.NET。它提供可擴(kuò)展對(duì)象模型中的COM對(duì)象的形式,并具有一個(gè)內(nèi)置的報(bào)告框架提供的腳本主機(jī)。它由3 部分組成,包括調(diào)試服務(wù)、 調(diào)試器主機(jī)和用戶界面。
1.3 ProcDump
ProcDump是System Internal提供的一個(gè)專門用來監(jiān)測(cè)程序CPU高使用率從而生成進(jìn)程Dump文件的工具。ProcDump可以根據(jù)系統(tǒng)的CPU使用率或者指定的性能計(jì)數(shù)器來針對(duì)特定進(jìn)程生成一系列的Dump文件,以便調(diào)試者對(duì)事故原因進(jìn)行分析。
二、診斷工具下載
- WinDbg x86位版本下載:【】
- WinDbg x64位版本下載:【】
- DebugDiag v2下載:【】
- ProcDump v9.0下載:【】
三、獲取異常進(jìn)程的Dump文件
有以下四種方式獲取Dump文件,具體如下:
3.1 通過【任務(wù)管理器】獲取Dump文件,這樣獲取的是MinDump
3.2 利用WinDbg的adplus獲取Dump文件,這樣獲取的是FullDump
3.3 通過DebugDiag創(chuàng)建.NET異常轉(zhuǎn)儲(chǔ)Dump文件
3.4 通過ProcDump抓取異常線程Dump文件
現(xiàn)在重點(diǎn)介紹通過ProcDump抓取異常線程Dump文件,使用方法如下:
a. 命令行:
procdump [-a] [[-c|-cl CPU usage] [-u] [-s seconds]] [-n exceeds] [-e [1 [-b]] [-f <filter,...>] [-g] [-h] [-l] [-m|-ml commit usage] [-ma | -mp] [-o] [-p|-pl counter threshold] [-r] [-t] [-d <callback dll>] [-64] <[-w] <process name or service name or PID> [dump file] | -i <dump file> | -u | -x <dump file> <image file> [arguments] >] [-? [ -e]b. 實(shí)例:
procdump -c 70 -s 5 -ma -n 3 w3wp
當(dāng)系統(tǒng)CPU使用率持續(xù)5秒超過70%時(shí),連續(xù)抓3個(gè)Full Dump。
procdump Outlook -p "\Processor(_Total)\% Processor Time" 80
當(dāng)系統(tǒng)CPU使用率超過80%,抓取Outlook進(jìn)程的Mini Dump。
procdump -ma outlook -p "\Process(Outlook)\Handle Count" 10000
當(dāng)Outlook進(jìn)程Handle數(shù)超過10000時(shí)抓取Full Dump
procdump -ma 4572
直接生成進(jìn)程號(hào)為4572的Full Dump。
下圖是在WindgbHighCpu進(jìn)程中造成High CPU時(shí)運(yùn)行ProcDump命令的運(yùn)行效果,可以看到在CPU每次持續(xù)5秒達(dá)到5%后就會(huì)生成相應(yīng)的Dump文件,共生成了3份Full Dump文件:
c. 注意:
- ProcDump需要進(jìn)程已經(jīng)啟動(dòng),并且中途不能停止。比如需要抓取IIS Worker Process的High CPU Dump,由于IIS Worker Process默認(rèn)會(huì)配置Idle Timeout = 20 min,即該進(jìn)程在20分鐘內(nèi)沒有任何請(qǐng)求的話就會(huì)自動(dòng)結(jié)束,這種情況下ProcDump也會(huì)自動(dòng)結(jié)束。需要重新運(yùn)行命令。因此如果目標(biāo)程序存在這樣的配置,需要暫時(shí)將該配置取消。
- 有些系統(tǒng)管理員希望能夠運(yùn)行該工具后退出用戶session,ProcDump是做不到的,如果有這種需求可以考慮使用DebugDiag。
- 在調(diào)試High CPU問題的時(shí)候經(jīng)常用到的一個(gè)命令是!runaway,但是有些時(shí)候!runway在ProcDump抓取Dump文件的過程中運(yùn)行不出來,報(bào)錯(cuò)信息如下:
解決的方法是將Debugging Tools for Windows (WinDbg)安裝目錄下的dbg拷貝到所在目錄下,然后再運(yùn)行命令抓取Dump。
四、WinDbg使用方法
操作步驟如下:
4.1 抓取異常程序的Dump文件
4.2 設(shè)置符號(hào)表
符號(hào)表是WinDbg關(guān)鍵的“數(shù)據(jù)庫”,如果沒有它,WinDbg基本上就是個(gè)廢物,無法分析更多問題。所以使用WinDbg設(shè)置符號(hào)表,是必須要走的一步。
a、運(yùn)行WinDbg軟件,然后按【Ctrl+S】彈出符號(hào)表設(shè)置窗。
b、將符號(hào)表地址:SRV*C:\Symbols* 粘貼在輸入框中,點(diǎn)擊確定即可。點(diǎn)擊確定之前,請(qǐng)先確認(rèn)紅色字的文件夾是否已被新建。
注:紅色字表示符號(hào)表本地存儲(chǔ)路徑,建議固定路徑,可避免符號(hào)表重復(fù)下載。
4.3 學(xué)會(huì)打開第一個(gè)Dump文件
當(dāng)你拿到一個(gè)Dump文件后,可使用【Ctrl+D】快捷鍵來打開一個(gè)Dump文件,或者點(diǎn)擊WinDbg界面上的【File=>Open Crash Dump...】按鈕,來打開一個(gè)Dump文件。第一次打開Dump文件時(shí),可能會(huì)收到如下提示,出現(xiàn)這個(gè)提示時(shí),勾選“Don't ask again in this WinDbg session”,然后點(diǎn)否即可。
當(dāng)你想打開第二個(gè)Dump文件時(shí),可能因?yàn)樯弦粋€(gè)分析記錄未清除,導(dǎo)致無法直接分析下一個(gè)Dump文件,此時(shí)你可以使用快捷鍵【Shift+F5】來關(guān)閉上一個(gè)對(duì)Dump文件的分析記錄。
4.4 通過簡(jiǎn)單的幾個(gè)命令學(xué)會(huì)分析Dump文件
分享一個(gè)數(shù)據(jù)庫連接超時(shí)的Dump案例的分析過程:
當(dāng)你打開一個(gè)Dump文件后,可能因?yàn)樘嘈畔?,讓你無所適從,不過沒關(guān)系,我們只需要關(guān)注幾個(gè)關(guān)鍵信息就可以了。
a. 加載SOS擴(kuò)展命令
加載SOS之前,先確定SOS的位置和版本,確定方法如下:
如果安裝了Visual Studio,那么先按照如下步驟打開VS的命令行:
然后,在打開的VS命令行中輸入【where 】,使獲得SOS的位置和版本:
確定完SOS位置和版本號(hào)后,開始加載SOS擴(kuò)展命令:
.load C:\Windows\Micro\Framework64\v4.0.30319\SOS.dll如下圖所示:
b. 使用!clrstack命令來查看當(dāng)前的調(diào)用堆棧信息
如下圖所示:
c. 使用!dso命令來查看堆棧上的所有對(duì)象詳細(xì)信息
如下圖所示:
綜合以上分析可以大膽地猜測(cè)Common.cs 中第16行“Data Source=***;Initial Catalog=***;Persist Security Info=True;User ID=sa;Password=***”的這個(gè)數(shù)據(jù)庫連接字符串應(yīng)該有問題,然后到代碼中相應(yīng)的地方進(jìn)一步確認(rèn)和修改就可以了。
五、一個(gè)真實(shí)案例
分享筆者工作過的一家公司某業(yè)務(wù)系統(tǒng)CPU飆高90%以上的Dump分析過程案例,步驟如下:
5.1 使用ProcDump抓包
5.2 加載SOS擴(kuò)展命令
.load C:\Windows\Micro\Framework\v2.0.50727\5.3 分析
執(zhí)行!runaway命令,查看線程使用CPU時(shí)間情況,如下圖所示。著重分析前面幾個(gè)線程。
執(zhí)行~22s命令,進(jìn)入到線程22,如下圖所示:
執(zhí)行!clrstack命令查看當(dāng)前線程堆棧變量值的信息,從圖中可以猜出大概是ExecuteNonQuery()這方法有點(diǎn)問題,如下圖所示:
再執(zhí)行!dso命令可以查看堆棧上的所有對(duì)象詳細(xì)信息,如下圖所示:
從圖中看,造成CPU飆高的罪魁禍?zhǔn)锥喟胗蒘QL Server執(zhí)行
INSERT INTO [dbo].[tbl_Interface_ProcessLog] (IKey,Username,ClientIP,Module,OrderNo,LogType,Content) VALUES (@IKey,@Username,@ClientIP,@Module,@OrderNo,@LogType,@Content)這條語句時(shí)產(chǎn)生異常引起,然后到源代碼中找出相應(yīng)的語句,經(jīng)過進(jìn)一步的確認(rèn)、修改和重新發(fā)布后就解決了CPU飆高的問題。
至此,掌握幾個(gè)簡(jiǎn)單的WinDbg命令之后,基本上絕大多數(shù)Dump大家都可以獨(dú)立分析了。當(dāng)然WinDbg是個(gè)強(qiáng)大的工具,同時(shí)產(chǎn)生CPU飆高和內(nèi)存泄漏的原因也有很多。如果想分析得足夠準(zhǔn)確,那么就只有多學(xué)多練,多去分析。因?yàn)檎莆誛inDbg分析除了需要懂得幾個(gè)命令之外,經(jīng)驗(yàn)更加重要,最后再補(bǔ)充兩點(diǎn):
- WinDbg不是專門用于調(diào)試.NET程序的工具,它更偏向于底層,可用于內(nèi)核和驅(qū)動(dòng)調(diào)試,特別是對(duì)于某些相當(dāng)疑難的問題調(diào)試有所幫助,例如內(nèi)存泄漏等問題。進(jìn)行普通的.NET程序調(diào)試還是使用微軟專為.NET開發(fā)所提供的調(diào)試工具更方便一些。
- SOS擴(kuò)展命令中最有用的命令是!help,使用該命令可以列出所有可用的SOS擴(kuò)展命令列表,使用!help [SOSCommandName]可以查看每一個(gè)具體擴(kuò)展命令的詳細(xì)使用說明。例如!help dumpheap就可以查看!dumpheap這個(gè)擴(kuò)展命令的具體使用方法。多多利用!help命令可以很快上手SOS。
1.《關(guān)于0x80004002我想說中小型r & ampd團(tuán)隊(duì)體系結(jié)構(gòu)實(shí)踐的生產(chǎn)環(huán)境診斷工具WinDbg》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請(qǐng)聯(lián)系頁腳下方聯(lián)系方式。
2.《關(guān)于0x80004002我想說中小型r & ampd團(tuán)隊(duì)體系結(jié)構(gòu)實(shí)踐的生產(chǎn)環(huán)境診斷工具WinDbg》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來源地址,http://f99ss.com/keji/1956510.html