从未捕获的exception获取堆栈跟踪?

我意识到这将是特定于平台的:有没有办法从未被捕获的C ++exception中获取堆栈跟踪,但是从抛出exception的地步?

我有一个Windows结构化exception处理程序来捕获访问冲突等,并生成一个小型转储。 但是当然由于未被捕获的C ++exception,在终止的情况下不会被调用,所以没有崩溃转储。

我正在寻找一个Windows解决scheme(不pipe多么肮脏!),但如果可能的话,希望听到其他平台。

谢谢。

Solutions Collecting From Web of "从未捕获的exception获取堆栈跟踪?"

我们使用本网站的信息在我们的最后一个标题中为未处理的异常实施了MiniDumps:

http://www.debuginfo.com/articles/effminidumps.html

并捕捉窗口上的未处理的异常看看:

SetUnhandledExceptionFilter( http://msdn.microsoft.com/en-us/library/ms680634%28VS.85%29.aspx )。

作为一个aisde,我们花了很多时间试验不同级别的转储,直到我们解决了一个。 事实证明,这在现实世界的崩溃中并没有真正的用处,因为我们不知道在实施小型歼击机的时候会是什么样子。 这是非常具体的应用程序,也是特定于崩溃的,所以我建议尽可能早地添加minidump处理程序,它将随着项目和QA一起增长,并且在某个时刻它将成为一个生命保护程序(希望在现实世界中太)。

您可以使用try-except语句将C ++异常“转换”为结构化异常(从中可以得到一个不错的堆栈跟踪)。 考虑一下:

// Your function to get a backtrace from a CONTEXT const char *readBacktrace( CONTEXT &ctx ); extern "C" static DWORD exceptFilter( struct _EXCEPTION_POINTERS* exInf ) { OutputDebugStringA( readBacktrace( *exInf->ContextRecord ) ); return EXCEPTION_EXECUTE_HANDLER; } try { // your C++ code which might yield exceptions } catch ( ... ) { // In case a C++ exception occurs, raise a structured exception and catch it immediately // so that we get a CONTEXT object which we can use to generate a stack trace. __try { RaiseException( 1, 0, 0, NULL ); } __except( exceptFilter( GetExceptionInformation() ) ) { } } 

这有点笨拙,但dumpStackTrace()是可以将__try {} __except(){}部分放入通用dumpStackTrace()函数中。 然后,您可以随意从程序中的任何位置产生堆栈跟踪。

尝试使用set_terminate来安装终止处理程序。 并在其中抓取使用迷你转储功能的堆栈跟踪。 也许它会工作。