1. 程式人生 > >使用WinDbg抓取程式報錯的Dump檔案,例如抓取IE崩潰的Dump

使用WinDbg抓取程式報錯的Dump檔案,例如抓取IE崩潰的Dump



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

今天將和大家介紹2種程式崩潰的現象4種dump抓取方法

第一種崩潰:有報錯介面

程式在執行中的時候,突然彈出錯誤視窗,然後點錯誤視窗的確定時,程式直接關閉。例如“應用程式錯誤”,“C++錯誤之類的視窗”,“程式無響應”,“假死”等,下圖就是一個IE應用程式錯誤的示例圖片:
2012-02-12_011715-0.jpg
這種崩潰現象的特點是:

程式已經異常,在你未點擊出錯視窗的確定或其他按鈕時,所有錯誤資訊都還保留在PC的記憶體中,可以直接抓取Dump檔案。當然,如果你知道怎樣操作可以讓程式崩潰,也可以用守株待兔的抓取方法去抓Dump問檔案。

推薦使用抓取方法三,因為這個抓取方法可以在你看到錯誤時就第一時間抓取到Dump,只要出現問題時,叫人保留這個出錯視窗,然後你去抓就行了。當然如果你未能及時抓取到這個Dump的話,也可以用其他方法。

第二種崩潰:程式視窗自動消失或自動關閉

程式在執行中的時候,視窗或程序突然消失,沒有任何錯誤窗體。典型的現象就是IE自動關閉,比如你連續開啟幾個IE視窗,關閉其中任意一個視窗時,所有IE視窗都消失了。或者玩著玩著遊戲,遊戲介面自動消失等。

這種崩潰現象的特點是:

程式是自動崩潰的,當程式崩潰後,所有錯誤資訊就都消失了,如果你要抓取這種崩潰的Dump,就必須先設定好抓取環境,否則是無法抓取到Dump檔案的,因此,這種現象用方法一,方法二,方法四都可以,因為方法三是要有報錯介面才抓的了,所以方法三不適用於這種現象。

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

抓取方法一:

該方法特點:

1、必須指定要抓取的程序或PID,同時程式必須已經在執行,否則無法抓Dump。

2、必須在出現問題之前,先佈置好抓取環境。

3、正常關閉程序也會出現Dump檔案,因此需要確定抓到的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%。

詳見微軟知識庫: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抓取環境。

找到Windbg安裝路徑,並將windbg以“-I”引數執行,注意“I”是大寫的。

C:\WinDbg\Windbg.exe -I

2012-02-12_011715-1.png

執行該引數時,WinDbg會彈出一個提示,點選確定後WinDbg介面會消失,如下圖:此時就代表環境已經設定好,現在就需要你想方設法讓程式崩潰,比如讓IE崩潰。
2012-02-12_011715-2.png

WinDbg引數說明:

-I:將WinDbg作為預設的除錯工具,注意I必須為大寫,小寫無效。

第三步:收集Dump檔案。

在程式崩潰時,WinDbg視窗再次彈出來時,使用以下命令儲存Dump檔案。

.dump-ma d:\test.dmp

如下圖:
2012-02-12_011715-3.png

當開始儲存Dump檔案時,左下角的狀態資訊會變成*Busy*,表示WinDbg正在工作,Dump儲存完成後會出現“Dump successfully written”這個提示,如下圖:
2012-02-12_011715-4.png

接下來就是等Dump儲存好,然後把dump檔案打包提供給軟體官方即可。

抓取方法三:

該方法特點:

1、可以在程式報錯後,直接抓取Dump檔案,不需要額外設定,適用於突然發現報錯,且不確定能否復現問題時抓取Dump,這是一個非常重要的抓取方法,強烈建議大家記住。

第一步:下載需要使用的工具:

第二步:使用ProcessExplorer報錯視窗所屬的程序PID(什麼是PID請見文章尾部)

先執行ProcessExplorer,然後滑鼠左鍵按住介面上的瞄準鏡圖示,然後拖動到報錯的視窗上鬆開滑鼠,如圖:
2012-02-12_011715-5.png
此時,ProcessExplorer會自動定位到出錯的程序上面,然後記住出錯程序的PID,例如下圖中QQ.exe的PID就是2960。
2012-02-12_011715-6.png

第三步:執行WinDbg,抓取Dump檔案。

執行WinDbg後,依次點選“File”=》“Attach to a Process”,如下圖:
2012-02-12_011715-7.png

在彈出的介面中,找到剛才捕捉到的PID,然後點OK。
2012-02-12_011715-8.png

點完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,就可以看到了。

相關推薦

使用WinDbg程式Dump檔案例如IE崩潰Dump

 前幾天分享了一個關於如何抓藍屏Dump的帖子,今天再和大家分享一個使用WinDbg來抓取程式崩潰的Dump。有了Dump後,我們可以很迅速的解決問題,比如說IE崩潰,QQ崩潰,很多時候我們是一點頭緒都沒有的,但是有了WinDbg後,這一切將變的簡單!雖然WinDbg

windows 10 下pip install 【PermissionError: [WinError 32] 另一個程式正在使用此檔案程序無法訪問。】

1、在windows 10 下使用 pip 3 執行 pip install pathos 報錯 Exception: Traceback (most recent call last):   File "C:\ProgramData\Anaconda3\lib\s

php 解決file_get_contents函式資料問題

大家用file_get_contents這個php函式抓取資料,可能出現各種莫名其妙的錯,小編今天就把我曾經報錯解決的方式總結如下: 方法一:找到php.ini檔案,修改如下: 1、找到extension=php_openssl.dll這一行,去掉前面的‘;’ 2、找到

生成程式崩潰dump檔案使用windbg除錯

1,目的 有時候程式在客戶那裡崩潰了,你程式也沒有什麼有效的log日誌能記錄到崩潰的細節,那這實在是一件很麻煩的事情。 你得向客戶反覆瞭解操作內容並希望能在自己這裡重現,這個過程想想都很痛苦吧。。 使用下面的方法,能在程式崩潰時生成一個自己的dump檔案,記錄了崩潰時的一

關於Spyder中執行pyqt程式kernel died, restarting的問題解決

Spyder的確是一款體驗不錯的IDE,不過最近在其中反覆執行或除錯有關pyqt的程式碼時,總是會提示”kernel died,restarting”,這就需要等待一段時間,核心重啟之後才能執行程式,這會消耗我們不少的時間和興致,後來在stackoverflow和github上找到了Spyd

程式404xxx.css或xxx.js找不到伺服器快取問題

小程式報錯如下: 1.小程式報404錯誤,xxx.css或xxx.js檔案找不到,是伺服器快取問題。伺服器需要清理快取,不然會出現小程式後臺管理系統內容已經更新,可是訪問不了 2.我是用vue框架寫的小程式後臺管理系統,npm run build之後把dist裡面的stat

【原創】Windows上應用程式常用分析方法總結

在日常使用Windows的過程中,經常會遇到應用程式不能正常啟動、關閉等使用問題。對於Windows來說,解決這些問題的方法比較多,大多時候我們可以通過百度或谷歌搜尋來解決。但更多的時候,我們需要找出背後的原因,也要掌握分析問題和解決問題的方法。 分析應用程式異常的問題,一般的出發點有兩個,第一從應用程式本

python3.x執行程式AttributeError: 'dict' object has no attribute 'iteritems'

python3.x中執行程式報錯 AttributeError: 'dict' object has no attribute 'iteritems' classCount={} classCount.iteritems() 原因: {}.iteritems()是python2.x

程式的型別

一般我們執行程式碼的時候,在控制檯報錯會相應的顯示你錯誤的行數,找到那一行,查詢你相應的錯誤     1、xxx is not defined   xxx 沒有定義       2、xxx is

【已解決!】spark程式:java.lang.IndexOutOfBoundsException: toIndex = 9

該篇文章意於記錄報錯,也給遇到相同問題的小夥伴提供排錯思路!但是本人也沒有什麼好的解決方法,如果有,我會更新此文章 問題已經解決,請大家拉到最下面↓↓↓↓↓ 記錄下報錯: 寫了段spark程式碼,然後報錯了 2018-07-30 17:19:28,854 WARN [task-re

微信小程式:id 屬性值格式錯誤。如不能以數字開頭。

出現這個報錯時,相信很多人都排除過自己標籤上寫的id是否有以數字命名的,如果你排除了發現並沒有,但是這個報錯還是存在,那麼我接下來分享的這個情況或者能報到你 這次我也遇到這個報錯,最終找出問題所在 這裡的scroll-into-view屬性是scroll-view元件中的,這裡涉及到錨點知

Java開發HBase程式:HADOOP_HOME or hadoop.home.dir are not set.

Java開發HBase程式報錯:HADOOP_HOME or hadoop.home.dir are not set. 1.報錯 16:36:44.271 [main] DEBUG org.apache.hadoop.util.Shell - Failed to detect a

VS2017 檔案包含不能在當前內碼表(936)中表示的字元。請將該檔案儲存為 Unicode 格式以防止資料丟失

尤其程式碼是從linux平臺複製過來: 報錯如圖: 更有甚者基本函式都報錯: 當下檢查發現if else break case等基本函式並無問題時,報錯行數明顯不一致等一定要注意文件編碼格式, 最簡單的辦法是用notepad++,逐個將.

VS中C++程式:應輸入宣告

在程式碼編寫的過程中,VS報錯:“應輸入宣告”。 比如在“if”或者一個已經定義好的變數下面有錯誤的紅線出現,滑鼠挪上去之後,就會顯示“應輸入宣告”。 1、前面有用“//”註釋資訊 //D:test\object\ int a = 1; 在一行註釋的最後有一個右斜槓,有可能系統將

Mac OS 使用PyCharm 啟動Python Django程式 解決方案

報錯資訊圖片 報錯資訊文字 django.core.exceptions.ImproperlyConfigured: Requested setting USE_I18N, but settings are not configured. You must either define

欄位為date型別執行程式

前言 資料庫欄位設定為時間型別就報錯,提示的很明顯,說格式不正確,下邊是解決方案,希望能幫到各位。 解決方案 @Temporal(TemporalType.TIMESTAMP) @Column(name = "buildingdate") @XmlJavaTypeAda

為什麼python對空格縮排要求這麼高?縮排稍微不對就!因為Python用縮排代替了其他程式語言的begin 和 and

為什麼python對縮排要求這麼高? 縮排不對就很容易報錯! 因為,Python用縮排代替了其他程式語言的begin 和 and。 取決於它的設計者想要更加簡潔的一種程式語言! 許多計算機程式語言使用字元(例如花括號{和})或者關鍵字(例如begin和end)來劃分程式碼段。 在這些語言

SharePoint建立web應用程式"This page can’t be displayed" 建立site collection

建立web應用程式(web application)的時候,發現一直loading最後顯示”This page can’t be displayed”,當我重新整理頁面的時候發現web application已經建立好了,於是就想著create site col

nginx搭建php程式解決---TP框架

1、TP框架中 出現如下錯誤:      訪問網站 http://192.168.0.204/ STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/51620d75af91aa77adc53082d1113d54.php錯誤

部署php程式:站點已關閉

場景: 之前把公司線上的php原始碼包拿到筆記本的虛擬機器上測試部署,部署完成後通過瀏覽器訪問總是出現站點已關閉 原因:把線上php程式配置檔案config.php裡面的資料庫連線資訊改成了筆記本虛擬機器的資料庫連線資訊,所有報錯 解決:把config.php裡面的資料庫連線資訊 重新改回來即可,就是說拿