强大的dmp文件

#include <Windows.h>
#include <DbgHelp.h>
#include <iostream>
#include <vector>
#include <tchar.h>


#pragma comment(lib, "dbghelp.lib")

using namespace std;

//Dump用捕获windows程序生成的异常,而且把对应的dump文件放到工程对应的位置上去,即可还原当时的运行现象
//最主要的函数, 生成Dump
static void DumpMiniDump(HANDLE hFile, PEXCEPTION_POINTERS excpInfo)
{
	if (excpInfo == NULL) //如果没有传入异常, 比如是在程序里面调用的, 生成一个异常
	{
		// Generate exception to get proper context in dump
		__try 
		{
			OutputDebugString(_T("raising exception\r\n"));
			RaiseException(EXCEPTION_BREAKPOINT, 0, 0, NULL);
		} 
		__except(DumpMiniDump(hFile, GetExceptionInformation()),EXCEPTION_CONTINUE_EXECUTION) 
		{
		}
	} 
	else
	{
		OutputDebugString(_T("writing minidump\r\n"));
		MINIDUMP_EXCEPTION_INFORMATION eInfo;
		eInfo.ThreadId = GetCurrentThreadId(); //把需要的信息添进去
		eInfo.ExceptionPointers = excpInfo;
		eInfo.ClientPointers = FALSE;

		// 调用, 生成Dump. 98不支持
		// Dump的类型是小型的, 节省空间. 可以参考MSDN生成更详细的Dump.
		MiniDumpWriteDump(
			GetCurrentProcess(),
			GetCurrentProcessId(),
			hFile,
			MiniDumpNormal,
			excpInfo ? &eInfo : NULL,
			NULL,
			NULL);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	// 创建一个Dump文件
	int code;
	HANDLE hFile = CreateFile( _T("MiniDump.dmp"), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 
	__try 
	{
		// 把自己实现的main函数包装一下, 放在try .. except 块中. 这样出现了异常可以自动生成dump
		int *p;
		p = (int*)0x100; 
		*p = 0; //写0x100地址, 这个是非法的
	}
	__except( code=GetExceptionCode(), DumpMiniDump(hFile, GetExceptionInformation() ),       EXCEPTION_EXECUTE_HANDLER ) 
	{	//出现了异常, 记录异常的code, 生成dump!!
		printf("%x\n", code);
		wchar_t msg[512];
		wsprintf(msg, L"Exception happened. Exception code is %x", code);
		MessageBox(NULL, msg, L"Exception", MB_OK); //显示消息给用户
	}
	CloseHandle( hFile ); //关闭Dump文件
	getchar();
	return 0; 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值