我希望有一种方法在抛出异常时向用户报告堆栈跟踪。最好的方法是什么?它是否需要大量额外的代码?

回答问题:

如果可能的话,我希望它是便携的。我想让信息弹出,这样用户就可以复制堆栈跟踪,并在出现错误时通过电子邮件发送给我。


当前回答

如果你使用的是Boost 1.65或更高版本,你可以使用Boost::stacktrace:

#include <boost/stacktrace.hpp>

// ... somewhere inside the bar(int) function that is called recursively:
std::cout << boost::stacktrace::stacktrace();

其他回答

Poppy不仅可以收集堆栈跟踪,还可以收集参数值、局部变量等等——所有导致崩溃的东西。

我推荐http://stacktrace.sourceforge.net/项目。它支持Windows, Mac OS和Linux

我想添加一个标准库选项(即跨平台),如何生成异常回溯,这已经在c++ 11中可用:

使用std::nested_exception和std::throw_with_nested

这不会给你一个堆栈unwind,但在我看来是次好的事情。 StackOverflow在这里和这里都有描述,如何在不需要调试器或繁琐的日志记录的情况下,通过简单地编写一个适当的异常处理程序重新抛出嵌套异常,就可以在代码中对异常进行回溯。

由于可以对任何派生异常类执行此操作,因此可以向这样的回溯添加大量信息! 你也可以看看我在GitHub上的MWE,在那里回溯看起来是这样的:

Library API: Exception caught in function 'api_function'
Backtrace:
~/Git/mwe-cpp-exception/src/detail/Library.cpp:17 : library_function failed
~/Git/mwe-cpp-exception/src/detail/Library.cpp:13 : could not open file "nonexistent.txt"

这取决于哪个平台。

在GCC上,这是非常琐碎的,更多细节请参阅这篇文章。

在MSVC上,您可以使用StackWalker库来处理Windows所需的所有底层API调用。

你必须找出将此功能集成到应用程序中的最佳方法,但你需要编写的代码量应该是最小的。

Cpp-tool ex_diag -重量轻,多平台,最小的资源使用,简单和灵活的跟踪。