SetUnhandledExceptionFilter不能生成dump文件的处理

        windows要生成dump文件,网上都是说用SetUnhandledExceptionFilter。这个是可以的,但是对于栈错误,比如:

char a[5] = {0};
delete a;

这样的崩溃,是没有办法生成DUMP文件。

        网上的说法是CRT会在后续取消SetUnhandledExceptionFilter什么的,要用钩子hook才能把后续CRT的操作屏蔽掉,就能生成dump文件了。网上的hook代码一般是x86的,加上x64关键词才能找到64位的这个hook。

        但是我用这个hook,还是不能对上述代码生成dump文件。又操作了一通什么信号什么的,还是无果。

        网上看到一个AddVectoredExceptionHandler,但是语焉不详。终于在折腾一通以后,专注考虑AddVectoredExceptionHandler了。其实AddVectoredExceptionHandler的使用很简单,把之前SetUnhandledExceptionFilter的那个函数指针,强转指针类型作为第二参数传给AddVectoredExceptionHandler即可。AddVectoredExceptionHandler的第一个参数则给一个非0数字即可。

        如此做,就能捕捉上述代码导致崩溃,并生成dump文件了。但是要过滤掉两个错误码:

LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
{
	// 这里做一些异常的过滤或提示
	// if (IsDebuggerPresent())
	// {
	// 	return EXCEPTION_CONTINUE_SEARCH;
	// }
	if (0x40010006 == lpExceptionInfo->ExceptionRecord->ExceptionCode
		|| 0x4001000A == lpExceptionInfo->ExceptionRecord->ExceptionCode)
	{
		return EXCEPTION_CONTINUE_SEARCH;
	}
	
	return GenerateMiniDump(lpExceptionInfo);
}

       

        实际环境中还有不少异常需要过滤,所以最好自定义两个处理函数,一个是veh,处理好过滤,另外一个是seh,已经是最后的UnhandledException了,基本就不需要过滤了。

        但是据说单进程内dump自身还是有隐患,最好是做一个守护进程来dump,这个下一步再说了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值