WinDbg-如何抓取dump文件


這要分兩種情況:

第一種情況:如果是Vista或者是Windows2008操作系統就是一個簡單的事情,在任務管理器中,切換到"進程"選項卡,右鍵點擊你想要創建dump文件的進程,然后選擇"Create Dump File"即可。如果你想要創建dump文件的進程是w3wp.exe,可能會看到有很多w3wp,但不知道哪一個是你要要抓的網站,可以通過下需的命令查看,對於vista或win2008系統使用:%windir%/system32/inetsrv/appcmd list wp 而對於win2k3系統,你可以使用iisapp來查看。

第二種情況:對於win2k3操作系統是沒有上面說到的功能的,當然上面的方法也是不完善的,因為它不能在程序崩潰的那一刻抓取到最適合的dump文件。可以通過adplus命令來抓取。例如:

adplus -hang -pn w3wp.exe -o c:\dumps
該命令立刻把w3wp.exe的full dump抓取到c:\dumps文件夾內。

adplus -hang -p 81388 -o c:\dumps
該命令立刻把81388這個進程的full dump抓取到c:\dumps文件夾內。

adplus -crash -pn w3wp.exe -fullonfirst -o c:\dumps
adplus -crash -p 81388 -fullonfirst -o c:\dumps
該命令會通過監視進程w3wp.exe或81388的運行,在當第一次出現異常時記錄一次完整的dump

adplus -crash -pn w3wp.exe -o c:\dumps
該命令也是在w3wp.exe崩潰時記錄dump,但這是一個mini dump

#一些常用的參數:
-Crash:表示我捕捉的是一個Crash dump。
-p:指定要捕捉的進程ID。 -IIS表示我們捕捉IIS的所有進程。
-quiet:不彈出提示窗口
-fullonfirst:表示我希望在first chance時捕捉完整的dump信息,也就是進程的所有完整信息。
-o :后面跟着dump文件的存放路徑
-c : 指定配置文件

#配置環境變量:
計算機-->屬性-->高級-->環境變量-->系統環境變量-->
_NT_SYMBOL_PATH C:"Windows"symbols
為Path系統環境變量增加C:\Program Files\Debugging Tools for Windows (x86)\

#還能通過指定配置文件來靈活使用adplus,例如可以指定clr發生某種異常時記錄dump等。

#解決在抓取dump過程出現"ActiveX 部件不能創建對象: 'Wscript.shell'" 錯誤的方法,運行如下命令:
regsvr32 %windir%"system32"WSHom.Ocx

#注意:當運行adplus抓取dump后,對應的w3wp.exe進程將會自動回收重啟新的進程

2、分析dump文件。

0:000> .load C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\SOS.dll //加載調試模塊
0:000>!eeheap -gc //查看托管堆的情況(包括大小)
0:000>!dumpheap -min 85000 -stat //顯示大小大於85000的對角的統主信息
0:000>!dumpheap -min 85000 //顯示大小大於85000的對角的統主信息
0:000>!dumpheap -stat //該命令顯示程序中所有對象的統計信息,顯示的大小是對象本身的大小,不包括對象里面值的大小
0:000>!gcroot 0x34e9bee0 //來顯示一個實例的所屬關系
0:000>!dumpheap -mt 790fcb30 //該命令顯示MethodTable 790fcb30的詳細信息
0:000>!DumpArray //查看數組信息
0:000>!ObjSize 012a1ba4 //對象實際在內存中的大小
0:000>lm //查看加載了哪些模塊
0:000>!dumpmt -md 00976d48 //得到類的成員函數詳細信息

-----------------------------------------------------------------------------------

首先說下,程序崩潰的兩種主要現象,了解這兩種現象的核心價值在於,可以更快,更准確的抓取Dump文件。

第一種崩潰:程序在運行中的時候,突然彈出錯誤窗口,然后點錯誤窗口的確定時,程序直接關閉。
  例如“應用程序錯誤”,“C++錯誤之類的窗口”,“程序無響應”,“假死”等,下圖就是一個IE應用程序錯誤的示例圖片:

這種崩潰現象的特點是:
  程序已經異常,在你未點擊出錯窗口的確定或其他按鈕時,所有錯誤信息都還保留在PC的內存中,可以直接抓取Dump文件。當然,如果你知道怎樣操作可以讓程序崩潰,也可以用守株待兔的抓取方法去抓Dump問文件。
推薦使用抓取方法三,因為這個抓取方法可以在你看到錯誤時就第一時間抓取到Dump,只要出現問題時,叫人保留這個出錯窗口,然后你去抓就行了。當然如果你未能及時抓取到這個Dump的話,也可以用其他方法。

第二種崩潰:程序在運行中的時候,窗口或進程突然消失,沒有任何錯誤窗體。
  典型的現象就是IE自動關閉,比如你連續打開幾個IE窗口,關閉其中任意一個窗口時,所有IE窗口都消失了。或者玩着玩着游戲,游戲界面自動消失等。
這種崩潰現象的特點是:
  程序是自動崩潰的,當程序崩潰后,所有錯誤信息就都消失了,如果你要抓取這種崩潰的Dump,就必須先設置好抓取環境,否則是無法抓取到Dump文件的,因此,這種現象用方法一,方法二,方法四都可以,因為方法三是要有報錯界面才抓的了,所以方法三不適用於這種現象。

  這就是目前最常見的兩種程序崩潰現象,接下來和大家分享下程序Dump的方法。

抓取方法一:
該方法特點:
  1、必須指定要抓取的進程或PID,同時程序必須已經在運行,否則無法抓Dump。
  2、必須在出現問題之前,先布置好抓取環境。
  3、正常關閉進程也會出現Dump文件,因此需要確定抓到的Dump是在程序崩潰時生成的。
第一步:下載需要使用的工具:
WinDbg:該工具是抓取Dump的主角。
工具下載1:http://115.com/file/an94sp48
工具下載2:http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.404.msi

第二步:設置WinDbg抓取環境。
先運行可能存在問題的程序,例如IE,如果不先運行程序,則無法抓Dump。
然后將本站提供的WinDbg解壓到任意盤符,例如C盤,使用下面的參數抓取Dump。

C:\WinDbg\adplus.vbs -crash -pn iexplore.exe -o d:


運行該命令后,WinDbg會跳出黑色窗口,用於監控進程的運行狀況,注意不要關閉這個窗口噢,否則Dump就抓不到了。
WinDbg參數說明:
-crash:當程序掛掉的一剎那抓取Dump,這個參數只能抓到程序報錯時的信息,如果程序不報錯,則無法抓到Dump。
-hang:當開啟WinDbg之后就開始抓取Dump,主要用於抓取程序停止響應,但程序未崩潰的情況,例如進程的CPU使用率100%。
詳見微軟知識庫:http://support.microsoft.com/kb/286350/ZH-cn
(如果你搞不明白-crash和-hang的差別,那么推薦使用-crash參數。)
-pn:進程的PID或進程名,如果是進程名,會區分大小寫。
-o:Dump輸出路徑。

第三步:收集Dump文件。
當程序崩潰后,Dump文件會保存在指定的輸出路徑內,例子中的Dump保存路徑就是D盤了,然后打包Dump文件,提交給軟件官方,供官方分析即可。

抓取方法二:
該方法特點:
  1、無需指定要抓取的進程或PID,也不要求設置環境時必須存在進程,只要任意程序崩潰后都可以抓到Dump。
  2、必須在出現問題之前,先布置好抓取環境。
  3、程序正常關閉時,比如點x時,不會生成Dump,只有程序崩潰時才會生成。
第一步:下載需要使用的工具:
WinDbg:該工具是抓取Dump的主角。
工具下載1:http://115.com/file/an94sp48
工具下載2:http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.404.msi

第二步:設置WinDbg抓取環境。
將本站提供的WinDbg解壓到任意盤符,例如C盤,使用下面的參數抓取Dump。

C:\WinDbg\Windbg.exe -I



運行該參數時,WinDbg會彈出一個提示,點擊確定后WinDbg界面會消失,如下圖:

此時就代表環境已經設置好,現在就需要你想方設法讓程序崩潰,比如讓IE崩潰。

WinDbg參數說明:
-I:將WinDbg作為默認的調試工具,注意I必須為大寫,小寫無效。

第三步:收集Dump文件。
在程序崩潰時,WinDbg窗口再次彈出來時,使用以下命令保存Dump文件。

程序代碼 程序代碼
.dump -ma d:\test.dmp


如下圖:

當開始保存Dump文件時,左下角的狀態信息會變成*Busy*,表示WinDbg正在工作,Dump保存完成后會出現“Dump successfully written”這個提示,如下圖:


接下來就是等Dump保存好,然后把dump文件打包提供給軟件官方即可。

抓取方法三:
該方法特點:
  1、可以在程序報錯后,直接抓取Dump文件,不需要額外設置,適用於突然發現報錯,且不確定能否復現問題時抓取Dump,這是一個非常重要的抓取方法,強烈建議大家記住。
第一步:下載需要使用的工具:
ProcessExplorer:該工具是用於定位報錯窗口的進程PID。
工具下載:http://www.clxp.net.cn/mytool/index/System_analysis_Tools/在軍火庫中找到ProcessExplorer即可。
WinDbg:該工具是抓取Dump的主角。
工具下載1:http://115.com/file/an94sp48
工具下載2:http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.404.msi

第二步:使用ProcessExplorer報錯窗口所屬的進程PID(什么是PID請見文章尾部)
先運行ProcessExplorer,然后鼠標左鍵按住界面上的瞄准鏡圖標,然后拖動到報錯的窗口上松開鼠標,如圖:


此時,ProcessExplorer會自動定位到出錯的進程上面,然后記住出錯進程的PID,例如下圖中QQ.exe的PID就是2960。



第三步:運行WinDbg,抓取Dump文件。
運行WinDbg后,依次點擊“File”=》“Attach to a Process”,如下圖:



在彈出的界面中,找到剛才捕捉到的PID,然后點OK。



點完OK后,你就會看到可以抓取Dump的界面啦,再用dump保存參數保存Dump即可。

程序代碼 程序代碼
.dump -ma d:\test.dmp


WinDbg參數說明:
-m:缺省選項,生成標准的minidump, 轉儲文件通常較小,便於在網絡上通過郵件或其他方式傳輸。 這種文件的信息量較少,只包含系統信息、加載的模塊(DLL)信息、 進程信息和線程信息。
-ma:帶有盡量多選項的minidump(包括完整的內存內容、句柄、未加載的模塊,等等),文件很大,但如果條件允許(本機調試,局域網環境), 推薦使用這中dump。
-mFhutwd:帶有數據段、非共享的讀/寫內存頁和其他有用的信息的minidump。包含了通過minidump能夠得到的最多的信息。是一種折中方案。

抓取方法四:
該方法特點:
  1、使用系統自帶的華生醫生來抓取Dump,簡單,但是有時會不靈光,部署的性質有點類似方法二。
第一步:下載需要使用的工具:
雖然華生醫生是系統自帶的工具,但是基本大部分操作系統都把這個工具給精簡掉了,大家可以下載附件中的綠色版,解壓后直接運行即可,運行后會把一切都設置好。
點擊下載華生醫生綠色版(484.87 KB)
[2012-02-12 02:27 AM; 已下載次數:85]


第二步:坐收Dump文件。
  當你運行過本站提供的drwtsn32(華生調試器).exe后,遇到程序崩潰時,會自動生成Dump文件到C:根目錄,文件名為drwtsn32.log和user.dmp,把這2個文件打包提交給官方分析即可。

  至此,WinDbg非常常用的抓程序崩潰Dump的方法基本已經全了,希望大家以后再碰到程序崩潰時,不再是只提供錯誤截圖,而是可以提供Dump供分析!
  另外,網維大師用戶如果遇到IE崩潰問題,可采用以上Dump抓取方法,直接提供Dump文件給在線客服,這樣可提高解決問題的效率,快速幫大家解決問題!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM