每当发生未处理的异常时,我希望我的应用程序创建转储文件。
为此,我使用 Windows 中的SetUnhandledExceptionFilter()
函数,为其提供我自己的异常过滤器回调函数,每当任何线程无法调用时都应该调用它处理异常。我的回调是创建转储文件,大部分时间都可以正常工作。
问题是,有时我的异常过滤器回调函数 未被调用,即使未处理的异常确实发生。
经过一些调试后我发现了原因:
_beginthreadex()
中的Visual Studio 2012
实现将处理来自此线程的任何未处理的异常:
来自Visual Studio 2012
的代码,'thread.c' - _beginthreadex()
的实现:
__try
{
( (void(__CLRCALL_OR_CDECL *)(void *))(((_ptiddata)ptd)->_initaddr) )
( ((_ptiddata)ptd)->_initarg );
_endthread();
}
__except ( _XcptFilter(GetExceptionCode(), GetExceptionInformation()) )
{
/*
* Should never reach here
*/
_exit( GetExceptionCode() );
} /* end of _try - _except */
[顺便说一句 - _beginthread()
和_beginthreadex()
的情况相同
正如我们所看到的,在未处理异常的情况下,代码将:
_exit()
,这样做_beginthreadex()
实际上是屏蔽我的全局异常处理程序代码......
我的问题:
在未处理异常的情况下,我如何验证我的异常过滤器回调函数 始终被调用,即使对于由_beginthread()
创建的线程也是如此/ _beginthreadex()
?
感谢任何提示,PazO