使用SetUnhandledExceptionFilter捕获OpenMP异常

时间:2011-04-12 12:46:26

标签: c++ windows openmp

我使用SetUnhandledExceptionFilter设置了异常处理程序,工作正常。但是,如果我从OpenMP代码中抛出异常,我得到标准的“应用程序崩溃”窗口并且不调用处理程序 - 但是,我可以附加一个调试器就好了,看到调用堆栈以_CxxThrowException结束并且继续进入KernelBase.dll!RaiseException。我知道在并行区域内抛出异常的OpenMP程序是错误的,但我仍然希望得到崩溃转储。在这种情况下如何调用我的异常处理程序?

应该是可能的,特别是当调试器在崩溃后连接到应用程序时,会出现“未处理异常”窗口(即我可以得到一个很好的堆栈跟踪和东西。)这是在Windows 7上使用VC ++ 2010

(最终,每个线程实际上都调用了我的异常处理程序。如果它崩溃,我选择'Debug',然后继续处理每个未处理的异常,最终会调用处理程序,它还会设法写出一个有意义的小型转储.Wtf ?)

1 个答案:

答案 0 :(得分:2)

有趣。走出困境,我敢打赌OpenMP并发运行时不支持SetUnhandledExceptionFilter(它适用于“标准”线程),并没有集成到结构化异常处理的这个特性中。

请注意MSDN page on Exception Handling in the Concurrency Runtime

中的此警告

To prevent abnormal termination of your application, make sure that your code handles exceptions when it calls into the runtime. Also handle exceptions when you call into external code that uses the Concurrency Runtime, for example, a third-party library.

也许您可以尝试以上面概述的异常处理方式包装OpenMP内容,然后查看是否可以重新打包并抛出它(在OpenMP上下文之外)以被过滤器捕获?