从未捕获的异常中获取堆栈跟踪? [重复]

问题描述 投票:0回答:3

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

我有一个 Windows 结构化异常处理程序来捕获访问冲突等并生成小型转储。但当然,如果由于未捕获的 C++ 异常而终止,则不会调用该方法,因此不存在故障转储。

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

谢谢。

c++ windows exception stack-trace
3个回答
5
投票

我们使用此站点中的信息在上一个标题中实现了针对未处理异常的 MiniDumps:

http://beefchunk.com/documentation/sys-programming/os-win32/debug/www.debuginfo.com/articles/effminidumps.html

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

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

作为一名助手,我们花了很多时间尝试不同级别的小型转储,直到我们确定了一个。事实证明,这在现实世界的崩溃中没有真正的用处,因为我们不知道在实施小型转储时它们会是什么。它是特定于应用程序的,也是特定于崩溃的,所以我的建议是尽早添加小型转储处理程序,它将随着项目和质量检查而增长,并且在某个时候它将成为救星(希望在现实世界中)也)。


4
投票

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

这有点笨拙,但好处是您可以将 __try { } __ except() { } 部分放入通用

dumpStackTrace()
函数中。然后,您可以根据需要从程序中的任何点生成堆栈跟踪。


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.