7

如果抛出的异常将由某个 catch 块处理,有没有办法让 C++ 中的 throw 将核心转储到 throw 站点?当异常到达顶层时,我想要类似于 g++ 发生的事情。

例如,我想要这样的东西:

try {
  bar();
  try {
    foo();
  } catch(...) {
#  pragma dump_at_throw_site
  }
} catch(...) {
  std::cerr << "There was a problem" << std::endl;
}

这样,如果从 foo() 或其被调用者抛出的任何异常到达 foo() 的调用站点,都会在抛出站点导致核心转储,因此人们可以看到是谁将异常抛到了这个级别。

另一方面,由 bar() 抛出的异常将被正常处理。

4

1 回答 1

2

是的,它可以在 Windows 中。我不知道Linux,假设它也可以。

我们可以注册一个异常处理函数来响应throw之前catch 的代码示例:

#include <iostream>
#include "windows.h"
#define CALL_FIRST 1
LONG WINAPI
VectoredHandler(
    struct _EXCEPTION_POINTERS *ExceptionInfo
    )
{
    UNREFERENCED_PARAMETER(ExceptionInfo);
    std::cout <<"VectoredHandler"<<std::endl;
    return EXCEPTION_CONTINUE_SEARCH;
}
int main()
{
    PVOID handler;
    handler = AddVectoredExceptionHandler(CALL_FIRST,VectoredHandler);

    try {
        throw 1;
    }catch(...)
    {
        std::cout <<"catch (...)"<< std::endl;
    }

    RemoveVectoredExceptionHandler(handler);
    std::cout << "end of main"<<std::endl;
    return 0;
}

代码的输出是:

VectoredHandler
catch (...)
end of main

因此,您可以将核心转储到函数VectoredHandler中。在VectoredHandler调试器获得第一次机会通知之后,但在系统开始展开堆栈之前调用 。如果您的目的只是调试问题问题,那么您可以依靠调试器功能来处理第一次机会异常,不需要转储应用程序。

为了您的信息,您可能需要知道什么是第一次机会例外?在 windows 中了解 windows 如何调度异常。

于 2012-09-06T01:53:20.800 回答