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

Ste*_*lly 4 c++ windows exception stack-trace

我意识到这将是特定于平台的:是否有任何方法可以从未捕获的C ++异常中获取堆栈跟踪,但是从抛出异常的那一点来看呢?

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

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

谢谢。

Fre*_*abe 5

您可以使用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() ) ) {
  }
}
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*ker 5

我们使用来自本网站的信息,在上一个标题中为未处理的异常实现了MiniDumps:

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

要捕获Windows上未处理的异常,请查看:

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

作为一个通道,我们花了很多时间尝试不同级别的小型转储,直到我们决定一个。事实证明,这在现实世界的崩溃中没有实际用途,因为我们不知道实施小型转储时它们将是什么。它是非常特定于应用程序的,并且也特定于崩溃的,所以我的建议是尽早添加minidump处理程序,它将随项目并通过QA增长,并且在某种程度上可以节省生命(并希望在现实世界中消失)。太)。

  • 这确实适用于未捕获的C ++异常(很好,适用于使用Visual Studio构建的应用程序)。我最初的误解是由于某处图书馆深处的隐藏catch(...)块造成的! (2认同)