1. 程式人生 > >如何在程式異常或者崩潰時產生一個dump檔案

如何在程式異常或者崩潰時產生一個dump檔案

核心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;
}