在實際開發(fā)中,經常遇到程序崩潰閃退或者卡死的問題,在遇到這種問題的時候,往往很難捕捉異常,且日志也無法正常記錄到問題發(fā)生的位置。在Windows操作系統(tǒng)中,dump文件就可以記錄并保存程序崩潰時的快照,今天我們通過一個小例子,簡述一種生成dump文件的方法,僅供學習分享使用,如有不足之處,還請指正。

閃退場景
在下面例子中,我們有一個WinForm程序,在FormMain的構造方法中,制造一個除零異常,此異常會導致程序閃退,如下所示:
namespace TestDump
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
throw new DivideByZeroException();
}
}
}
在我們啟動程序時,雙擊軟件,然后發(fā)現(xiàn)程序“轉了幾圈,就消失了”,程序并沒有啟動起來。當然,上述只是我們的一個小例子,實際工作中,我們并不會制造這么愚蠢的異常出來。
異常分類
根據(jù)異常發(fā)生和處理的機制不同,主要分為如下兩類:
- 托管異常:托管異常是由 .NET 運行時管理的異常,它們通常在托管代碼中拋出并處理。例如,在 C# 中使用 try-catch 塊捕獲的異常就是托管異常。這些異常通常由 .NET 的類庫拋出,例如 ArgumentNullException, IndexOutOfRangeException 等。
- 非托管異常:非托管異常是由操作系統(tǒng)或其他非 .NET 代碼(如調用本地庫或使用 P/Invoke 調用 Windows API)拋出的異常。這些異常不是由 .NET 運行時直接管理的,因此需要使用特定的技術來捕獲和處理。
在實際應用中,托管異常容易識別和處理;非托管異常通常需要結合使用托管和原生代碼的技術來處理。
什么是dump文件?
Dump文件是一種包含了程序運行時的內存、寄存器狀態(tài)、堆棧跟蹤等信息的文件,通常用于調試和故障排查。當程序崩潰或發(fā)生異常時,操作系統(tǒng)或程序自身可能會生成一個Dump文件,以便開發(fā)者或技術支持人員能夠分析程序崩潰的原因,并采取相應的修復措施。
- 程序的內存映像:即程序在崩潰時內存中的數(shù)據(jù)和代碼的狀態(tài)。
- 寄存器狀態(tài):包括CPU的寄存器在崩潰時的值,這些值對于理解程序崩潰時的上下文非常關鍵。
- 堆棧跟蹤:記錄了程序崩潰時執(zhí)行的函數(shù)調用序列,有助于確定程序崩潰的具體位置。
不同的操作系統(tǒng)和程序可能會生成不同格式的Dump文件。例如,在Windows操作系統(tǒng)中,應用程序崩潰時可能會生成`.dmp`文件,而在Linux系統(tǒng)中,則可能會生成`core`文件。開發(fā)者或技術支持人員可以使用專門的調試工具來打開和分析這些Dump文件,以便找到并修復導致程序崩潰的問題。
生成dump文件
在 Windows 操作系統(tǒng)中,可以將 Windows 錯誤報告 (WER) 配置為在應用程序崩潰時生成轉儲。具體步驟如下:
在Windows左下角搜索框輸入“regedit”打開注冊表編輯器,如下所示:在注冊表中,依次打開“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps”,然后創(chuàng)建三個字段,如下所示:
- DumpFolder:表示Dump生成的目錄,此值的類型為REG_EXPAND_SZ(可擴充字符串)。
- DumpCount:表示最多生成dump文件的數(shù)量。此值為DWORD的32位整數(shù),默認設置為10
- DumpType:生成的Dump文件類型:0:自定義類型,1:MiniDump,2:Full Dump。此值為DWORD的32位整數(shù)
具體如下圖所示:
注冊表也可以通過以下命令創(chuàng)建:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpFolder /t REG_EXPAND_SZ /d "C:\mydumps" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpType /t REG_DWORD /d 2 /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpCount /t REG_DWORD /d 10 /f
pause
復制上述命令,保存在一個后綴為.bat的文件中,然后右擊選擇“以管理員身份運行”即可。如下所示:

分析dump文件
?通過上述步驟,當程序發(fā)生崩潰時,就會在指定的目錄生成dump文件,如下所示:

如果就簡單的.net程序閃退生成的dump文件,可以在Visual Studio 2022中打開dump文件,然后點擊“運行診斷分析”,如下所示:

Visual Studio 2022會自動定位到發(fā)生閃退的異常所在位置,如下所示:

在“診斷分析”頁面,點擊“分析”,可以查看分析結果,然后點擊結果,即可看到分析摘要中顯示的具體異常信息。

當然上述分析只是針對相對簡單的崩潰異常分析,如果復雜的閃退場景,則需要借助專業(yè)的調試工具,如WinDbg等,本文暫不討論。
閱讀原文:原文鏈接
該文章在 2025/6/23 15:13:00 編輯過