C ++显示堆栈跟踪exception

我想有一种方法来报告堆栈跟踪如果引发exception的用户。 什么是最好的方法来做到这一点? 是否需要大量额外的代码?

回答问题:

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

这取决于哪个平台。

在海湾合作委员会这是非常微不足道的,看到这个职位了解更多的细节。

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

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

安德鲁·格兰特的答案没有帮助获取抛出函数的堆栈跟踪,至less不是与GCC,因为一个throw语句不会自己保存当前的堆栈跟踪,捕获处理程序将无法访问堆栈跟踪这点再次。

使用GCC来解决这个问题的唯一方法是确保在throw指令的地方生成一个堆栈跟踪,并将其保存为exception对象。

当然,这个方法要求每个引发exception的代码都使用该特定的Exception类。

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

Unix: 回溯

Mac: 回溯

Windows: CaptureBackTrace

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

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

AFAIK libunwind是相当便携的,到目前为止我还没有发现任何更容易使用。

用g ++在linux上检出这个lib

https://sourceforge.net/projects/libcs​​dbg

它为你做所有的工作

在Windows上,检查BugTrap 。 它不再在原来的链接,但它仍然在CodeProject上。

罂粟不仅可以收集堆栈跟踪,还可以收集参数值,局部variables等 – 导致崩溃的所有事情。

我有一个类似的问题,虽然我喜欢可移植性,但我只需要gcc支持。 在gcc中,execinfo.h和backtrace调用是可用的。 为了消除函数名称,Bingmann先生有一段很好的代码。 为了在exception上转储回溯,我创build了一个在构造函数中打印回溯的exception。 如果我期待这样的方式来处理库中引发的exception,则可能需要重build/链接,以便使用回溯exception。

 /****************************************** #Makefile with flags for printing backtrace with function names # compile with symbols for backtrace CXXFLAGS=-g # add symbols to dynamic symbol table for backtrace LDFLAGS=-rdynamic turducken: turducken.cc ******************************************/ #include <cstdio> #include <stdexcept> #include <execinfo.h> #include "stacktrace.h" /* https://panthema.net/2008/0901-stacktrace-demangled/ */ // simple exception that prints backtrace when constructed class btoverflow_error: public std::overflow_error { public: btoverflow_error( const std::string& arg ) : std::overflow_error( arg ) { print_stacktrace(); }; }; void chicken(void) { throw btoverflow_error( "too big" ); } void duck(void) { chicken(); } void turkey(void) { duck(); } int main( int argc, char *argv[]) { try { turkey(); } catch( btoverflow_error e) { printf( "caught exception: %s\n", e.what() ); } } 

使用gcc 4.8.4编译和运行,可以得到一个带有很好的非encryptionC ++函数名称的回溯:

stack trace:./turducken:btoverflow_error :: btoverflow_error(std :: string const&)+ 0x43 ./turducken:chicken()+ 0x48 ./turducken:duck()+ 0x9 ./turducken:turkey()+ 0x9 ./turducken :main()+ 0x15 /lib/x86_64-linux-gnu/libc.so.6:__libc_start_main()+ 0xf5 ./turducken()[0x401629]

我build议http://stacktrace.sourceforge.net/项目&#x3002; 它支持Windows,Mac OS和Linux

Cpp工具ex_diag – 简单,多平台,最less的资源使用,简单而灵活的跟踪。

以下代码在抛出exception之后立即停止执行。 你需要设置一个windows_exception_handler和一个终止处理程序。 我在MinGW 32bits中testing了这个。

 void beforeCrash(void); static const bool SET_TERMINATE = std::set_terminate(beforeCrash); void beforeCrash() { __asm("int3"); } int main(int argc, char *argv[]) { SetUnhandledExceptionFilter(windows_exception_handler); ... } 

检查以下代码的windows_exception_handler函数: http : //www.codedisqus.com/0ziVPgVPUk/exception-handling-and-stacktrace-under-windows-mingwgcc.html