提问人:Mazen Ak 提问时间:11/4/2021 最后编辑:Mazen Ak 更新时间:11/17/2021 访问量:417
在 catch 块之前抛出异常后如何打印堆栈跟踪(堆栈展开)
How to print stacktrace once an exception is thrown before the catch block (stack unwinding)
问:
假设我们有以下代码:
#include <exception>
void funcA() {
funcB();
}
void funcB() {
funcC();
}
void funcC() {
funcD();
}
void funcD() {
throw std::runtime_error("Exception!!"); //3
}
void funcE() {
int * p;
delete p; //4
}
int main (int argc, char **argv) {
try {
funcA(); //1
} catch (std::exception exc) {
std::cerr << exc.what() << endl; //2
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
我想以多线程有效的方式打印带有引发的异常的行号的堆栈跟踪。
在过去的几天里,我一直在检查人们正在做的解决方案和方法,但不幸的是,在我的情况下没有任何用处。例如,我可以使用boost库或任何其他库,但这里的问题是我必须捕获异常才能执行此操作,如果您的代码有数百个嵌套函数,则此方法效率不高。你不能只是把它们都一遍,然后把每一个都包起来,然后分别处理它们。boost::stacktrace::stacktrace()
//2
try-catch
所以基本上我需要做的是,如果抛出异常,我应该能够在'//2中打印异常的堆栈跟踪//3
我知道堆栈展开及其工作原理,但据我所知,每当您的代码到达 catch 块时,这意味着异常堆栈已被展开并且您无法获取它。如果我错了,请纠正我!
有没有办法在解开异常堆栈之前至少添加类似于中间件的东西?还是我必须手动完成?
编辑:
此外,当我可以时会发生什么是内存访问异常,但从未捕获此异常。有没有办法捕获此类异常,或者至少在崩溃之前打印其堆栈跟踪?funcE()
注意:
我在 Linux 和 macOS、带有硅 Web 框架的 C++11 上运行我的代码。 这是一个大系统,所以我正在尝试实现一些可以在整个系统中使用的日志记录机制。
答:
我发布这个是为了防止有人遇到同样的问题并想要一个快速有用的答案。
我最终使用这个要点覆盖了主要的 C++ 抛出异常行为
我更改了函数中的一些内容以解决我自己的问题,并用于获得更易于人类阅读的堆栈跟踪。__cxa_throw
boost::stacktrace
上一个:展开导致分段故障
评论
runtime_error
runtime_error
try-catch
try catch