当前位置:  开发笔记 > 编程语言 > 正文

C++显示异常时的堆栈跟踪

如何解决《C++显示异常时的堆栈跟踪》经验,为你挑选了5个好方法。

如果抛出异常,我想有办法向用户报告堆栈跟踪.做这个的最好方式是什么?是否需要大量的额外代码?

回答问题:

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



1> Andrew Grant..:

这取决于哪个平台.

在海湾合作委员会这是非常微不足道的,请看这篇文章了解更多细节.

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

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


您链接的帖子主要指向从段错误生成跟踪,但提问者特别提到异常,这是完全不同的野兽.
我同意@Shep - 这个答案并没有真正帮助在GCC上获得抛出代码的堆栈跟踪.请参阅我的答案以获得可能的解决方

2> Thomas Tempe..:

安德鲁·格兰特的回答并不能帮助得到的堆栈跟踪投掷功能,至少不会与海湾合作委员会,因为throw语句不保存自身当前的堆栈跟踪和捕捉处理程序将无法访问的堆栈跟踪那一点.

使用GCC解决此问题的唯一方法是确保在throw指令的点处生成堆栈跟踪,并使用异常对象保存它.

当然,此方法需要抛出异常的每个代码都使用该特定的Exception类.

2017年7月11日更新:对于一些有用的代码,请看看cahit beyaz的答案,它指向http://stacktrace.sourceforge.net - 我还没有使用它,但它看起来很有希望.


而且archive.org也不知道.该死的.好吧,程序应该是明确的:抛出一个自定义类'对象,它在抛出时记录堆栈跟踪.
令人遗憾的是答案是"不,你不能从C++异常中获得堆栈跟踪",唯一的选择是抛出自己的类,在构造时生成堆栈跟踪.如果你被困在使用像C++ std :: library的任何部分这样的东西,那你就不走运了.对不起,很难成为你.

3> vasek..:

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

#include 

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


[boost docs](http://www.boost.org/doc/libs/1_66_0/doc/html/stacktrace/getting_started.html#stacktrace.getting_started.handle_terminates_aborts_and_seg)不仅解释了捕获堆栈跟踪,还解释了如何执行它用于例外和断言.好东西.

4> bobobobo..:

Unix: 回溯

Mac: 回溯

Windows:CaptureBackTrace



5> GPMueller..:

我想添加一个标准的库选项(即跨平台)来生成异常回溯,C ++ 11已经提供了该选项:

使用std::nested_exceptionstd::throw_with_nested

这不会给您带来很多麻烦,但我认为下一件好事。它在此处和此处的 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"

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有