VS2010_C++_dump文件监视程式崩溃异常(MFC)

1.dump的作用

在没办法调试程式的情况下,只能通过程式打印的log来排除异常,但有时候log也不行的时候可以导入dump文件,能快速定位到程式崩溃处代码。

2.调用dump操作

(1)我采用在MFC项目【Test】里创建一个按钮【Button2_DumpTest】来实现我的验证:

(2)代码

需要包含头文件: 

#include <Windows.h>
#include <DbgHelp.h>				//Dump头文件
#include <iostream>
#include <vector>
#pragma comment(lib,"dbghelp.lib")	//微软提供,每台电脑都有

函数声明,TestDlg.h:

class CTestDlg : public CDialogEx
{
public:
	afx_msg void OnBnClickedButton2();

//dump 20240620
	void DumpTest()
	{
		Crash();
	}
	 

private:
	void Crash()
	{
		int i = 13;
		int j = 0;
		int k = i / j;	//除数不能为0,人为制造冲突
	}
};

LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException);
void CreateDumpFile(LPCWSTR lpstrDumpFileName, EXCEPTION_POINTERS *pException);

处理未处理异常的回调函数,ApplicationCrashHandler:

LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
	CreateDumpFile(_T("Test.dmp"), pException); //指定路径下生成dmp
	FatalAppExit(-1, _T("Error: Unhandled Exception!")); //or MessageBox, or AfxMessageBox
	return EXCEPTION_EXECUTE_HANDLER;
}

创建Dump文件函数,CreateDumpFile:

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

	//Dump信息
	MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
	dumpInfo.ExceptionPointers = pException;
	dumpInfo.ThreadId = GetCurrentThreadId();
	dumpInfo.ClientPointers = TRUE;

	//写入Dunm文件内容
	MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
	CloseHandle(hDumpFile);
}

调用SetUnhandledExceptionFilter(DbgHelp中的函数):

void CTestDlg::OnBnClickedButton2()
{
	SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
	CTestDlg test;
	test.DumpTest();
}

(3)生成dmp操作

编译后点击【Test_d.exe】程式,选择【Button2_DumpTest】按钮:

就会有Error弹窗提示,同时exe【Test_d.exe】同目录下会生成dmp文件【Test.dmp】:

(4)查看dmp文件

用VS2010打开dmp文件后,可查看“Exception Information”消息判断异常原因,

点击【Actions】里的【Debug with Native Only】可以在本机调试,会主动跳到异常位置:

注:dmp文件需要放到.exe文件和.pdb文件下,同时最后一版程式不能再编译(编译后.pdb文件会改变,导致找不到准确的异常位置)

3.生成dump异常

在MFC项目中,在Debug下能监测到程式的冲突有弹窗提示和生成dmp文件,但是在Release下不能监测到这个冲突并且生成dmp文件。

可能是因为在Release下默认配置了“优化”:【Property Pages--->C/C++--->Optimization--->Optimization:Maximize Speed(/O2)】,此时将【Maximize Speed(/O2)】改成【Disabled/Od】就可生成dmp文件了。

但需注意的是,如果是在正常运行程式时,Release还是需要默认配置【Maximize Speed(/O2)】(优化),改成【Disabled/Od】的操作仅可在验证中开启用于DOE。

(1)Debug默认配置【Disabled/Od】:

 

(2)Release默认配置【Maximize Speed(/O2)】:                

 

(3)修改Release默认配置【Maximize Speed(/O2)】为【Disabled/Od】: 

参考:1.mC++程序生成dump文件并分析dump_release工程不能使用dump吗-CSDN博客

2.C++程序中dump文件生成方法详解_c++ dump-CSDN博客

3.VC++使用dump定位release程序崩溃问题_c++ release会崩溃的程序-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值