2011-02-14 78 views
8

我需要從程序獲取崩潰轉儲。我如何得到它?本程序是用C#編寫的。什麼是崩潰轉儲?何時創建?它保存在哪裏? 我如何閱讀?如何獲取崩潰轉儲

+5

操作系統?平臺?語言? – 2011-02-14 13:18:42

+0

你的意思是你需要在應用程序崩潰時創建一個dump *,或者你只需​​要運行正在運行的應用程序的內存轉儲?因爲兩者完全不同。 – 2011-02-14 13:39:36

+2

http://blogs.msdn.com/b/debugger/archive/2009/12/30/what-is-a-dump-and-how-do-i-create-one.aspx - 很好的解釋! – 2013-12-28 20:58:54

回答

21

既然你說C#我假設你正在使用Windows平臺。

crashdump或只是轉儲是在特定時間點進程的完整內存快照和其他相關係統信息。轉儲可以用來調試程序崩潰,掛起,內存和資源泄漏,還可能有更多的問題,我沒有在這裏列出。

在崩潰並掛起的情況下,您想從崩潰轉儲中獲取的第一部分數據將是callstack。這表明崩潰點或操作被阻止的位置,並且從不返回,所以程序坐着並且什麼都不做。

對於資源泄漏,可以在一段時間內收集進程的多個內存轉儲,並檢查內存中哪些對象的增長最多。這可以幫助縮小代碼的哪些部分導致泄漏。要了解有關調試特定問題的更多信息,我強烈建議您使用this blog

有幾種方法可以捕獲轉儲文件。

  1. Procdump(http://technet.microsoft.com/en-us/sysinternals/dd996900.aspx
  2. 的Visual Studio 2010(http://msdn.microsoft.com/en-us/library/vstudio/fk551230(v=vs.100).aspx
  3. 的WinDbg - 不壞,但超過恐嚇其他工具

隨着procdump,你可以簡單地做:

c:\>procdump.exe -ma YourProcessName.exe 

該命令的結果將是YourProcessNa的完整內存快照me.dmp寫入c:\。 -ma開關指定轉儲完整的內存映像。如果你正在調試崩潰或掛起,你可能會離開-ma開關。請記住,如果您去檢查數據結構時沒有完整的內存轉儲,則可能無法獲得有效數據。如果沒有完整的內存轉儲,您仍然可以獲得通常足夠用於崩潰和掛起的調用堆棧數據。我通常在硬盤空間方面的錯誤是便宜的,所以收集完整的轉儲。

Procdump還會按時間間隔或滿足特定條件時自動進行轉儲。請閱讀上面鏈接中的文檔以獲取更多信息。我建議的一個開關是-e

c:\>procdump.exe -ma -e YourProcessName.exe 

而不是立即寫入轉儲它只會在程序崩潰時寫入。

使用Visual Studio 2010,您可以使用調試器附加到進程並保存轉儲文件。 (請記住,當F5調試Visual Studio自動附加的程序時)。當程序處於「中斷狀態」(斷點,未處理的異常,崩潰)時,Debug菜單將可以選擇Save Dump As...。然後,您可以將該轉儲保存在任何你想要的地方。

既然您提到C#,您很可能會收集託管的轉儲文件。最簡單的方法是使用Visual Studio 2010.簡單地,打開您創建的轉儲文件,就像其他文件一樣,然後開始調試。

但是,如果這不是一個選項,您可以隨SOS擴展一起使用VS2008或WinDbg。儘管我強烈推薦Visual Studio 2010,但SOS擴展和WinDbg通常具有相當陡峭的學習曲線。要詳細瞭解SOS,請查看這些MSDN文章herehere

我推薦使用Visual Studio或procdump的另一個原因是他們會收集您期望的轉儲文件。我建議您清除任務管理器的「創建轉儲文件工具」。原因是它會收集64位的32位進程轉儲,這些進程過於難以調試。

1

您也可以嘗試使用WinDbg的

http://www.windbg.org/

崩潰時的RAM內存的處理器的內容和某些部分複製到文件轉儲。該文件在錯誤的關鍵位置創建,可用於調試問題。

這在過去對我有效。這是一個鍵盤快捷方式,可以在Windows中崩潰轉儲。

* Start Registry Editor. 
* Locate the following registry subkey: 
     o HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\i8042prt\Parameters 
* On the Edit menu, click Add Value, and then add the following registry entry: 
     o Name: CrashOnCtrlScroll 
     Data Type: REG_DWORD 
     Value: 1 
* Exit Registry Editor and then restart the computer. 

http://vinaytechs.blogspot.com/2010/01/how-to-get-crash-or-hang-dump.html

1

盧克,崩潰轉儲是目前涉及到應用程序的狀態數據的整袋的碰撞已經發生,傾銷就意味着某個地方記錄所有這些信息,一般在一個文本文件中。

一個基本的方法是在發生異常時記錄整個堆棧跟蹤,以便稍後調查並查看哪種方法失敗並拋出哪個異常,參數值是什麼等等。這不是真正的粉碎垃圾場,但在很多情況下都有很大幫助。

有通過MS有關崩潰轉儲和應用程序崩潰最近開發的東西,我認爲這是有關Windows 7的實際...

在這裏看到:應用程序恢復和重新啓動

http://msdn.microsoft.com/en-us/library/cc948909(v=vs.85).aspx

2

在Windows XP中,你可以創建此工具轉儲文件:

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e089ca41-6a87-40c8-bf69-28ac08570b7e&displaylang=en

一旦安裝,瀏覽到命令行PID是你想要得到的崩潰轉儲進程的PID的安裝目錄,並運行

userdump PID 

(您可以在任務管理器中找到它,但你可能需要將該列添加到標準視圖)。

然後可以在Visual Studio中打開此文件 - 只需確保您已構建符號。

在Windows 7只需右鍵點擊在任務管理器的進程,並選擇「創建轉儲文件」

2

,應使用ADPlus。它帶有用於Windows的調試工具。 它會在其主目錄下創建崩潰轉儲文件夾。之後您可以使用WinDbg分析它們。