如果异常将由特定的catch块处理,如何使C throw转储核心

如果抛出的异常将由某个catch块处理,有没有办法在C中抛出C来转储核心?我想要一个类似于当异常达到顶级时g发生的事情.

例如,我想要这样的事情:

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

这样,如果从foo()或其被调用者到达foo()的调用站点抛出的任何异常将导致在throw站点进行核心转储,那么可以看到是谁抛出了使其达到此级别的异常.

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

最佳答案
是的,它可以在Windows中.我不知道Linux,假设它也可以.

我们可以注册一个Exception Handler函数来响应catch之前的throw
这是代码示例:

#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中转储core int.
在调试器获得第一次机会通知之后但在系统开始展开堆栈之前调用VectoredHandler.
如果您的目的只是调试问题,那么您可以依靠调试器功能来处理第一次机会异常,不需要转储应用程序.

为了您的信息,您可能需要在Windows中知道What is a First Chance Exception?以了解Windows如何分派异常.

转载注明原文:如果异常将由特定的catch块处理,如何使C throw转储核心 - 代码日志