  等級:蜘蛛俠 文章:1057 積分:6309 註冊:2010-09-23 |
Vista用戶請類似操作。 對于原版操作系統,以上設置是默認的(除了禁止自動重新啟動)。 對于第4點中的寫入調試信息列表內容,現給出以下參照釋義: (以上三種轉儲文件的大小依次增大,關于三者的比較不在本文討論范圍之內,筆者僅推薦設置為“小內存轉儲”或者“核心內存轉儲”,一般性錯誤“小內存轉儲”就足夠了,如不能完好分析請選擇“核心內存轉儲”。為了數據的豐富性,您也可以直接選擇“核心內存轉儲”,但筆者強烈不推薦完全內存轉儲。) 值得注意的是,為了確保崩潰時自動生成內存轉儲文件,您可能還須啟用虛擬內存頁面文件。特別地,當您選擇記錄核心內存轉儲時,您必須啟用虛擬內存頁面文件,而且由于核心內存轉儲文件的大小取決于該機器上操作系統和所有活動驅動程序已經分配的內核模式內存的數量,因此沒有很好的辦法來預測內核內存轉儲的大小。下表僅給出該情況下的參考虛擬內存大小設置值: 另外,除了頁面文件占用的磁盤空間,內存轉儲文件(*.DMP)的生成位置所在的磁盤還要有足夠的空閑空間來提取這個轉儲文件,否則一樣會“生成不了”(實際上是丟失了)。 設置好這些之后,一旦您的系統發生藍屏崩潰,系統就會在以上設置中選中的相應內存轉儲文件類型下對應的目錄處生成轉儲文件。您所要做的就是立刻拿出利器——啟動WinDbg進行分析。 筆者在此將結合一個實例進行詳細說明,過程中包含了WinDbg調試藍屏用到的一些命令,這些命令將不再額外整理,請于閱讀過程中注意識記。 首先,您要配置WinDbg將要使用的調試符號文件(Symbol File)的位置。什么是調試符號文件呢?符號文件隨DLL文件或者EXE文件建立時產生,提供包含在可執行文件和動態鏈接庫 (DLL) 中的函數的占位空間。此外,符號文件還可以表示達到失敗點的函數調用路線圖。當我們使用各種Microsoft工具調試應用程序時,必須擁有符號信息,這樣才能正確分析出問題根源。那我們該如何設置調試符號文件的位置呢?我們既可以從微軟官網下載完整的符號文件包(同位于WinDbg下載頁面),也可以使用微軟的符號文件服務器(Microsoft Symbol Server)。筆者推薦后者,因為一次分析所要用到的符號文件局限于有限的幾個而已,使用后者可以讓程序自動下載,既節省時間,又可以確保符號文件是最新的并且是正確的。在WinDbg中點擊“File”菜單,選擇“Symbol File Path …”,在打開的對話框中輸入 復制代碼 后點擊“OK”按鈕即可。當然,還有一步就是再次點擊“File”菜單,選擇“Save Workspace”來保存當前的設置。 設置了符號文件之后,您就可以進行內存轉儲文件的分析了。同樣點擊“File”菜單,這次要選擇“Open Crash Dump …”,然后通過文件打開對話框打開生成的待分析的內存轉儲文件。本例中設置的是核心內存轉儲類型,于是應該定位至“%SystemRoot%”(即系統盤Windows文件夾下),打開MEMORY.DMP文件。但是筆者已經事先將其轉移至“E:\Memory Dump\MEMORY.DMP”,因此在后續的圖片中,您看到的是這個地址。此時WinDbg會滾動顯示一些信息并且會稍有掛起的感覺,直到從微軟符號文件服務器下載完分析這個崩潰文件所需要的所有符號文件。 在上圖中,我們看到就是這個打開的調試器命令窗口(Debugger Command Window)(已經將符號文件加載完畢,待命),我們先看看位于底部的區域6,這個小的長方條就是WinDbg的命令輸入處(Command Entry),它又分為兩個區域,左邊顯示“0: kd>”的是提示區,右邊空白區是命令輸入區。當剛打開這個窗口而符號文件尚未下載/加載完畢時,提示區域會什么都不顯示,而命令輸入區域將顯示“Debuggee not connected”。直到符號加載完畢,窗口中顯示出最后一行“Followup: MachineOwner”才會變為空閑狀態。在空閑狀態時,它將顯示為與上圖中類似的模樣。為什么說類似呢?因為這個空閑待命提示根據調試類型、計算機處理器硬件配置不同,比如此例中,進行的是內核調試,于是顯示“kd>”(kernel debug),系統為多(核)處理器,因此在“kd>”之前還顯示一個“0:”,表明當前位于編號為0的處理器。在執行了某個命令之后,如果命令需要處理的任務較多(如“!analyze -v”),提示區域將顯示為忙碌狀態的“*BUSY*”,一旦顯示為這個狀態,您不論輸入什么命令都不會立即執行,而是等待變為空閑狀態時延緩執行。 如上圖所示,圖中區域1處將顯示打開的這個內存轉儲文件的物理路經;區域2處顯示的則是當前加載的符號文件的位置,本例中表明是從微軟服務器下載;區域3共有三行,顯示的為系統信息,第一行表明了系統為Windows XP,內核版本為2600(SP3),多處理器(2顆),32位,第二行表明了系統類型為NT系統,客戶端系統,第三行表明系統的詳細版本標識;區域4共兩行,第一行表明該內存轉儲文件生成的時間,也就是系統崩潰的具體時間,本例中(這是去年12月得到的一個崩潰轉儲文件,現用作本例進行說明)為星期六(Sat),12月(Dec)27日,22:56:31.062,2008年,格林尼治標準時間東八區(GMT+8),第二行顯示的是崩潰時自系統啟動以來,系統共運行了0天4小時5分15.797秒。區域5是很關鍵的錯誤信息,它的第一行僅在加載符號文件遇到錯誤時顯示,此例中,它告訴我們“對于BaseTDI.SYS文件,模塊已經加載完畢但卻不能夠為其加載符號文件”,如果之前配置了正確的符號文件路徑,這就告訴我們BaseTDI.SYS不是微軟公司的文件,而是第三方驅動程序文件,這很可能是引起錯誤的原因,值得關注但須進一步分析。區域5的第二行是WinDbg自動分析的結果,它告訴我們,引起崩潰的原因(Probably caused by:)很可能是HookUrl.sys文件。一般情況下,這就是引起錯誤的罪魁禍首了,但是也有不少的例外,最典型的就是顯示一個微軟自己的文件在此處,您可要注意了,為了避免枉殺無辜,最好進一步分析來看看都有哪些模塊牽扯在崩潰的最后一刻,這樣就能夠保證審判無誤了!進一步分析的命令可以從“!analyze -v”開始。 我們既可以在命令輸入區域手動鍵入命令 !analyze -v 復制代碼 ,也可以在上圖中的區域7所示位置單擊藍色的這個命令。之后,提示區域將顯示為“*BUSY*”,WinDbg將分析一段時間直到將結果顯示完畢并再次轉為空閑狀態。下面我們根據一張例圖闡釋執行“!analyze -v”后顯示的各種結果: WinDbg經過自動的分析,可能會顯示上圖中區域1處所示第一行的錯誤檢查說明(Bug Check Interpretation),而第二行則給出了詳細的解釋,從圖中信息看得出,此例錯誤由于“驅動程序在隊列工作項目完成之前卸載”造成的。這個“DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS”就應該是顯示在藍屏上方的錯誤說明字樣,后面的Arguments1~4就是藍屏時停止代碼后面的四個參數。圖中區域2所示的BUGCHECK_STR是WinDbg中分了類別的錯誤檢查(Bug Check)的一項,此例中為0xCE,也是停止代碼的分類簡寫,我們在命令輸入區執行 .bugcheck 復制代碼 命令,可以得到停止代碼及其參數,這和上圖的區域1、藍屏上的信息是一致的。本例中可以得到如下結果: 0: kd> .bugcheck Bugcheck code 000000CE Arguments bacb0a4e 00000008 bacb0a4e 00000000 我們在Bugcheck code值前補上“0x”就可以得到藍屏上的信息“***STOP: 0x000000CE (bacb0a4e, 00000008, bacb0a4e, 00000000)”。當然,關于這個錯誤如果您想了解更多,一個是可以在微軟在線幫助和支持網站上搜索字符串“0x000000CE”,再就是可以利用上圖中區域2的BUGCHECK_STR值“0xCE”執行 .hh bug check 0xCE 復制代碼 命令,在打開的窗口左欄右下角點擊“Display”按鈕。如果要在WinDbg中顯示一個停止代碼或者錯誤檢查類的詳細說明(以此錯誤為例),鍵入命令 !analyze -show 0x000000CE 復制代碼 或者 !analyze -show 000000CE 復制代碼 ,也可以是 !analyze -show 0xCE 復制代碼 。區域3中顯示的就是二審判決的重要信息——線程堆棧信息。特別注意紅色框內的部分,第一行是“WARNING: Frame IP not in any known module. Following frames may be wrong.”意思就是“警告:堆棧幀IP(InstructionPtr,僅x86處理器,用于決定幀的堆棧回朔的指令指針)不存在于任何已知的模塊中,下面的幀可能出現錯誤”。這個意思的解釋已超出本文討論范圍,筆者僅告訴大家,這行文字下面的一行右側的模塊是系統藍屏崩潰時刻使用的最后一個模塊(除了Windows內核最后調用KeBugCheckEx犧牲自己,就是警告文字上方的三行),往往就是它引起了崩潰!我們來細看。大家如果了解了堆棧的數據結構或是Windows內存分配機制就應該知道,Windows為 線程分配額外內存時是從高地指向低地址進行的,就是說,藍色區域3中的堆棧信息我們得倒過來由下往上看,這樣才是系統崩潰之前的一刻內核態函數的調用和傳遞情況,比如此例,系統內核執行體(nt!,即Ntoskrnl.exe)通過函數IopfCallDriver調用了BaseTDI,然后BaseTDI又調用了HookUrl.sys(Unloaded_字樣表示未加載),再然后就藍屏了。那么在這最后一刻就涉及到了兩個非Windows內核的模塊——BaseTDI以及HookUrl.sys。之所以要進行這個“二審判決”,就是要避免一種情況——萬一HookUrl.sys與BaseTDI是來自兩個公司或者兩個軟件的模塊,而最后加載的HookUrl.sys是沒有問題的,出錯是因為BaseTDI給HookUrl.sys傳遞了格式錯誤或者已被破壞的、或者非法的參數信息,HookUrl.sys接受此無效數據而引發了崩潰。如果我們不看線程棧,就根據之前的“Probably Cause by:HookUrl.sys”進行判決,我們很有可能枉殺無辜而讓兇手逍遙法外。只有通過線程棧我們才能發現另一個驅動程序BaseTDI也被牽連進來。(在應用程序崩潰不致系統崩潰的調試分析中,由于處于用戶態,WinDbg自動分析結果中的“Probably Cause by:”幾乎都是錯誤的。在這種情況下,使用!thread命令是不能顯示出任何信息的,因為這個命令僅對內核態的崩潰調試有效,然而kb命令也顯示不出有用的信息,只有用“~*kb”來顯示詳細的全部線程棧才可能發現問題根源,有的時候還需配合其他命令,本文不作討論) 當然,如果您熟練以后,覺得沒有必要使用“!analyze -v”命令的話,可以直接使用
 發送圖片到手機  發送圖片到手機
[url=http://www.www.nmeme.com/]街舞視頻[/URL] [url=http://www.gongjijindaikuan.info/]公積金貸款[/URL] [url=http://www.xuexifangfa.info/]學習方法[/URL] [url=http://www.huishenghuiying.info/]會聲會影12[/URL] [url=http://www.shenmeyisi.info/]什么意思[/URL] [url=http://www.nannvpk.info/]男女[/URL] [url=http://www.xueshengluntan.info/]學生論壇[/URL] [url=http://www.guanggunjie.info/]guanggunjie[/URL] [url=http://www.wuxianluyou.info/]無線路由[/URL] [url=http://www.faxingsheji.info/]發型設計[/URL] [url=http://www.zhongguoyinhang.info/]zhongguoyinhang[/URL] [url=http://www.soufangwang.info/]soufangwang[/URL] [url=http://www.wailianba.info/]外鏈吧[/URL] [url=http://www.shapan.info/]沙盤[/URL] [url=http://www.zhongguodianxin.info/]zhongguodianxin[/URL] [url=http://www.win7zhuti.info/]win7主題[/URL] [url=http://www.cad2007.info/]cad2007[/URL] [url=http://www.xietingfeng.info/]xietingfeng[/URL] [url=http://www.photoshopjiaocheng.info/]photoshop教程[/URL] [url=http://www.dianyingwang.org/]電影網[/URL] |
|
|
|