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