【发布时间】:2016-12-04 19:21:33
【问题描述】:
当然,我也希望在使用调试器引发异常后查看堆栈跟踪。通常,当从未捕获到异常时,调试器会在收到SIGABRT 后停止程序,我可以看到整个堆栈跟踪并识别异常的原因。
但是捕获异常后如何诊断异常原因呢?
#include <iostream>
#include <stdexcept>
void foo() {
throw std::runtime_error("An error message");
}
int main() {
try {
foo();
} catch (const std::exception &e) {
std::cerr << e.what(); // add breakpoint here
}
return 0;
}
在 catch 部分添加断点自然会在捕获异常后停止程序,但是堆栈跟踪不包含 foo() 调用,因此无法诊断异常的原因。
请注意,该示例非常简单。对于复杂和嵌套的调用,try 部分中某处发生异常的信息实际上是无用的。而且我不能简单地避免捕获异常,因为如果我没有捕获它,那么它就会被我正在使用的框架捕获并且堆栈跟踪会丢失。
【问题讨论】:
-
这是特定于调试器的。对于 Visual Studio 的 GDB 类型
catch throw,它默认启用。否则,请阅读调试器附带的文档。 -
@Drop 我主要对 GDB 感兴趣。不像在 IDE 中放置断点那么简单,但基本上可以。它停在每个
throw上,所以不是 100% 我想要的,但它非常接近,除非有人有更好的解决方案,否则我可以接受这个作为答案。 -
还有
catch catch和其他catchpoints (src)。看起来这是你需要的。虽然不包括带有回溯的部分。
标签: c++ exception stack-trace