如何在程式異常或者崩潰時產生一個dump檔案
阿新 • • 發佈:2019-02-11
核心API是:
CreateFile()
MinDumpWriteDump()
需要包含標頭檔案:
#include <DbgHelp.h>
#pragma comment(lib, "dbghelp.lib")
程式碼如下:
// test_dump.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdlib.h> #include <string> #include <Windows.h> #include <DbgHelp.h> #pragma comment(lib, "dbghelp.lib") #define _CRT_SECURE_NO_WARNINGS LONG WINAPI MyCustomUnhandledFilter(struct _EXCEPTION_POINTERS *lpExceptionInfo) { LONG iRet = EXCEPTION_EXECUTE_HANDLER; TCHAR szDumpFileName[MAX_PATH] = {0}; SYSTEMTIME st = {0}; GetLocalTime(&st); wsprintf(szDumpFileName, _T("%04d-%02d-%02d-%02d-%02d-%02d.dmp"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wMinute); HANDLE hDumpFile = CreateFile(szDumpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hDumpFile == INVALID_HANDLE_VALUE) { DWORD dwErrorID = GetLastError(); printf("Failed to create dump file, error ID: %d\n", dwErrorID); return iRet; } MINIDUMP_EXCEPTION_INFORMATION MindumpExceptionInfo = {0}; MindumpExceptionInfo.ThreadId = GetCurrentThreadId(); MindumpExceptionInfo.ExceptionPointers = lpExceptionInfo; MindumpExceptionInfo.ClientPointers = FALSE; BOOL bRet = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &MindumpExceptionInfo, NULL, NULL); if(bRet) { printf("Succeeded to create dump file!\n"); } else { printf("Failed to create dump file!\n"); } CloseHandle(hDumpFile); return iRet; } void crash(void) { int i = 1; int j = 0; //!!程式崩潰的地方 i /= j; } int _tmain(int argc, _TCHAR* argv[]) { SetUnhandledExceptionFilter(MyCustomUnhandledFilter); char buf[10]; memset(buf, 0, sizeof(buf)*sizeof(char)); crash(); strcpy_s(buf, "123456789"); MessageBox(NULL, _T("程式出錯了嗎?"), _T(""), MB_OK); system("pause"); return 0; }