使用 SEH 让进程崩溃的更加体面,并记录崩溃信息

代码

#include <windows.h>
#include <DbgHelp.h>
#include<string.h>
#include<iostream>
#pragma comment( lib, "Dbghelp.lib" )
using namespace std;

void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS* pException)
{
	// 创建Dump文件
	HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

	// Dump信息
	MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
	dumpInfo.ExceptionPointers = pException;					// 异常信息
	dumpInfo.ThreadId = GetCurrentThreadId();				// 引发异常的线程id
	dumpInfo.ClientPointers = TRUE;									// 则异常指针位于客户机或崩溃的进程的地址空间中

	// 写入Dump文件内容
	MiniDumpWriteDump(
		GetCurrentProcess(),
		GetCurrentProcessId(), 
		hDumpFile, 
		MiniDumpNormal,					// 只包含捕获进程中所有现有线程的堆栈跟踪所需的信息
		&dumpInfo,								// 异常信息
		NULL,											// minidump文件中不包含用户定义的信息
		NULL											// 不指定 minidump 信息的回调
	);

	CloseHandle(hDumpFile);
}



LONG CrashHandler(EXCEPTION_POINTERS* pException)
{
	MessageBox(NULL, L"这是一次体面的崩溃 :)", L"LYSM", MB_OK);

	wstring strDumpFileName = L"C:\\LYSM.dmp";

	CreateDumpFile(strDumpFileName.data(), pException);

	return EXCEPTION_EXECUTE_HANDLER;
}

int main()
{
	SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashHandler);

	int i = 13;
	int j = 0;
	int m = i / j;

	getchar();
	return 0;
}

效果

在这里插入图片描述在这里插入图片描述


拖入 windbg 分析

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值