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,这个下一步再说了。
2万+

被折叠的 条评论
为什么被折叠?



