在 Java/C# 异常中提供堆栈/函数跟踪这一事实非常有用。有没有一种方便的方法可以在 C++ 中执行此操作,或者我是否必须将额外的数据烘焙到每个方法/函数中?
大多数调试器都可以设置为在每次引发异常(任何异常或没有处理程序的异常)时暂停程序,以便您可以观察调用堆栈。
此外,如果您的代码仅引发您控制的类的异常您可以将用于转储调用堆栈的代码放入这些类构造函数中。
如果您正在考虑向异常添加元数据,您可以考虑使用 boost 异常处理。 boost::exception 允许在抛出异常后向其添加信息。
一些操作系统 API 提供堆栈跟踪,我知道 Windows API 有 StackWalk64 或类似的东西可以进行堆栈跟踪。
但是,如果您不能依赖这样的东西,那么您几乎所能做的就是发送调试版本,或者手动执行。
以编程方式从异常中检索堆栈跟踪:
P2490 已被 C++26 接受,将添加
[[with_stacktrace]]
和 std::stacktrace::from_current_exception
。
对于较旧的 C++ 版本,cpptrace 提供了许多工具来帮助解决此问题。要获取捕获异常的堆栈跟踪,可以将
cpptrace::from_current_exception
与 try/catch 宏结合使用。更多信息这里。对于未捕获的异常,您需要从 std::terminate
打印堆栈跟踪。 Cpptrace 提供了一种简单的方法来做到这一点,使用 cpptrace::register_terminate_handler
。