您的位置:首页 > 其它

如何在程序异常或者崩溃时产生一个dump文件

2015-01-07 11:39 501 查看
核心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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐