C ++中未处理的异常处理程序
Unhandled Exception Handler in c++
我正在开发一个 C++ 库,我希望能够在其中捕获任何未被 try/catch 语句捕获的异常。
我在谷歌搜索时唯一能找到的是一个 catch(...) 块,但那行不通,我希望库能够捕获通常会导致崩溃的任何内容。就像 C# 中未处理的异常处理程序一样。
虽然在 c++ 中似乎没有任何类型的事件处理程序。相反,我在想的是在 SIGSEGV
和 SIGABRT
之类的东西上注册一个信号处理程序,然后当我收到信号时,处理崩溃。
这是最好的方法吗?还有其他选择可以实现我想要实现的目标吗?
我设法找到了一种在某种程度上实现这一点的方法。
正如@user4581301 指出的那样,如果出现可能导致 sigsegv
或 sigabrt
的指针问题或内存问题,我可能无法执行任何操作,就好像发生了这种情况一样主应用程序可能不可逆转地被搞砸了,所以无法做任何远程有用的事情。
但是,如果抛出未被捕获的异常,我找到了捕获它的方法。
当我的库初始化时,我执行以下操作:
if (currentTerminationHandler == nullptr)
{
currentTerminationHandler = std::get_terminate();
std::set_terminate(&unhandledTerminateHandler);
}
unhandledTerminateHandler 方法然后使用 https://www.boost.org/doc/libs/1_65_1/doc/html/stacktrace.html 处的提升堆栈跟踪到 return 记录的回溯。
请注意,当 运行 在 Visual Studio 中执行此操作时,VS 在触发终止处理程序之前捕获崩溃并停止触发终止触发器,因此要绕过此问题,您需要运行 使用 ctrl+F5 以避免在 VS 调试器中 运行ning。
我正在开发一个 C++ 库,我希望能够在其中捕获任何未被 try/catch 语句捕获的异常。
我在谷歌搜索时唯一能找到的是一个 catch(...) 块,但那行不通,我希望库能够捕获通常会导致崩溃的任何内容。就像 C# 中未处理的异常处理程序一样。
虽然在 c++ 中似乎没有任何类型的事件处理程序。相反,我在想的是在 SIGSEGV
和 SIGABRT
之类的东西上注册一个信号处理程序,然后当我收到信号时,处理崩溃。
这是最好的方法吗?还有其他选择可以实现我想要实现的目标吗?
我设法找到了一种在某种程度上实现这一点的方法。
正如@user4581301 指出的那样,如果出现可能导致 sigsegv
或 sigabrt
的指针问题或内存问题,我可能无法执行任何操作,就好像发生了这种情况一样主应用程序可能不可逆转地被搞砸了,所以无法做任何远程有用的事情。
但是,如果抛出未被捕获的异常,我找到了捕获它的方法。
当我的库初始化时,我执行以下操作:
if (currentTerminationHandler == nullptr)
{
currentTerminationHandler = std::get_terminate();
std::set_terminate(&unhandledTerminateHandler);
}
unhandledTerminateHandler 方法然后使用 https://www.boost.org/doc/libs/1_65_1/doc/html/stacktrace.html 处的提升堆栈跟踪到 return 记录的回溯。
请注意,当 运行 在 Visual Studio 中执行此操作时,VS 在触发终止处理程序之前捕获崩溃并停止触发终止触发器,因此要绕过此问题,您需要运行 使用 ctrl+F5 以避免在 VS 调试器中 运行ning。