使用WinDbg抓取程序報錯的Dump文件



使用WinDbg抓取程序報錯的Dump文件,例如抓取IE崩潰的Dump,教程

前幾天分享了一個關於如何抓藍屏Dump的帖子,今天再和大家分享一個使用WinDbg來抓取程序崩潰的Dump。不過還是先來段廢話,爲什麼要學抓Dump?有啥用?因爲有了Dump後,我們可以很迅速的解決問題,比如說IE崩潰,QQ崩潰,很多時候我們是一點頭緒都沒有的,但是有了WinDbg後,這一切將變的簡單!雖然WinDbg並不能幫你解決問題,但是他可以指導你解決問題的方向!


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

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

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

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

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

抓取方法一:
該方法特點:

  1、必須指定要抓取的進程或PID,同時程序必須已經在運行,否則無法抓Dump。
  2、必須在出現問題之前,先佈置好抓取環境。
  3、正常關閉進程也會出現Dump文件,因此需要確定抓到的Dump是在程序崩潰時生成的。
第一步:下載需要使用的工具:
WinDbg:該工具是抓取Dump的主角。

第二步:設置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%。
(如果你搞不明白-crash和-hang的差別,那麼推薦使用-crash參數。)
-pn:進程的PID或進程名,如果是進程名,會區分大小寫。
-o:Dump輸出路徑。

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

抓取方法二:
該方法特點:

  1、無需指定要抓取的進程或PID,也不要求設置環境時必須存在進程,只要任意程序崩潰後都可以抓到Dump。
  2、必須在出現問題之前,先佈置好抓取環境。
  3、程序正常關閉時,比如點x時,不會生成Dump,只有程序崩潰時纔會生成。
第一步:下載需要使用的工具:
第二步:設置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。

第二步:使用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,簡單,但是有時會不靈光,部署的性質有點類似方法二。
第一步:下載需要使用的工具:
雖然華生醫生是系統自帶的工具,但是基本大部分操作系統都把這個工具給精簡掉了,大家可以下載附件中的綠色版,解壓後直接運行即可,運行後會把一切都設置好。

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

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

最後一個小知識點:什麼是進程PID?
  PID就是各進程的身份標識,程序一運行系統就會自動分配給進程一個獨一無二的PID。進程中止後PID被系統回收,可能會被繼續分配給新運行的程序。
  PID一列代表了各進程的進程ID,也就是說,PID就是各進程的身份標識。
  只要沒有成功運行其他程序,這個pid會繼續分配給當前要運行的程序,如果成功運行一個程序,然後再運行別的程序時,系統會自動分配另一個pid。
要查看PID的話就打開任務管理器--查看-- 選擇列--PID,就可以看到了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章