'_beginthreadex()'覆盖了我的全局'未处理的异常过滤器'

时间:2016-10-26 17:47:58

标签: c++ windows visual-studio exception msvcrt

每当发生未处理的异常时,我希望我的应用程序创建转储文件

为此,我使用 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()的情况相同

正如我们所看到的,在未处理异常的情况下,代码将:

  1. 抓住例外,
  2. [可能会向最终用户发出一个消息框],
  3. 致电_exit()
  4. 终止申请

    这样做_beginthreadex()实际上是屏蔽我的全局异常处理程序代码......

    我的问题:
    在未处理异常的情况下,我如何验证我的异常过滤器回调函数 始终被调用,即使对于由_beginthread()创建的线程也是如此/ _beginthreadex()

    感谢任何提示,PazO

0 个答案:

没有答案