筆記:Windows App Crash 與 Dump、.NET Crash Handler
1️⃣ Windows App Crash Dump
預設情況
Windows App crash 時不一定會自動產生 dump。
Windows Error Reporting (WER):
可產生 minidump,存放位置:
%LOCALAPPDATA%\CrashDumps C:\ProgramData\Microsoft\Windows\WER\ReportArchive若沒有啟用 LocalDumps 設定,dump 可能不會留下。
強制生成 Dump(未驗證)
註冊表設定 LocalDumps
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps] "DumpFolder"=hex(2):43,00,3a,00,5c,00,64,00,75,00,6d,00,70,00,00,00 "DumpType"=dword:00000002DumpFolder→ 指定 dump 存放資料夾DumpType→ 1 = minidump, 2 = full dump
使用 ProcDump 自動生成 dump
命令範例:
procdump.exe -ma -e -x C:\dumps ConsoleApp6.exe-ma→ full dump-e→ 當遇到未處理例外時產生 dump-x C:\dumps→ dump 存放資料夾ConsoleApp6.exe→ 要啟動並監控的程式
2️⃣ .NET 程式自訂 Crash Handler
概念
可在程式內捕捉未處理的例外,並生成 dump
使用:
AppDomain.CurrentDomain.UnhandledException捕捉全域未處理例外P/Invoke 呼叫 MiniDumpWriteDump 寫出 dump
範例程式(未驗證)
AppDomain.CurrentDomain.UnhandledException += (s, e) =>
{
string dumpPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
$"CrashDump_{DateTime.Now:yyyyMMdd_HHmmss}.dmp");
using (var fs = new FileStream(dumpPath, FileMode.Create, FileAccess.Write, FileShare.None))
{
var currentProcess = Process.GetCurrentProcess();
MiniDumpWriteDump(currentProcess.Handle, (uint)currentProcess.Id,
fs.SafeFileHandle.DangerousGetHandle(), MINIDUMP_TYPE.MiniDumpWithFullMemory,
IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
}
};
MiniDumpWriteDump可選 flag 生成不同類型 dump:MiniDumpNormal→ 小型 dumpMiniDumpWithFullMemory→ full memory dump
dump 會存放在程式目錄,方便 crash 後分析。
用途
對桌面 App (Console / WPF / WinForms) 都適用
可結合 ProcDump 做雙重保護(程式內捕捉 + 外部監控)
3️⃣ 建議做法
對重要 App,啟用 LocalDumps 或 ProcDump 監控
對 .NET App,可在程式內加
UnhandledExceptionhandler +MiniDumpWriteDumpdump 生成後,用 WinDbg + SOS / C# extension 分析記憶體與 crash stack
