从未捕获的异常中获取堆栈跟踪?

时间:2009-11-25 11:08:09

标签: c++ windows exception stack-trace

我意识到这将是特定于平台的:有没有办法从未捕获的C ++异常中获取堆栈跟踪,但是从抛出异常的位置开始?

我有一个Windows结构化异常处理程序来捕获访问冲突等,并生成一个小型转储。但是当然,由于未被捕获的C ++异常,在终止事件时不会被调用,因此没有崩溃转储。

我正在寻找一种Windows解决方案(无论多么脏!),但如果可能的话,我希望了解其他平台。

感谢。

3 个答案:

答案 0 :(得分:4)

您可以使用try-except Statement将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() ) ) {
  }
}

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

答案 1 :(得分:4)

我们使用本网站提供的信息在我们的上一个标题中为未处理的异常实施了MiniDump:

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

要了解Windows上未处理的异常,请查看:

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

作为aisde,我们花了很多时间尝试不同级别的minidump,直到我们确定了一个。这被证明在现实世界的崩溃中没有实际用途,因为我们不知道在实施小型飞机时它们会是什么。它是非常特定于应用程序的,也是特定于崩溃的,所以我的建议是尽可能早地添加minidump处理程序,它将随着项目和QA而增长,并且它将在某个时刻节省生命(并且希望在现实世界中出现)太)。

答案 2 :(得分:1)

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