【发布时间】:2010-06-02 19:18:33
【问题描述】:
在 MSVC 中,如何使任何未处理的 C++ 异常(例如 std::runtime_error)使我的发布编译程序崩溃,以便它从异常抛出位置生成包含完整堆栈的转储?
我已经在 AeDebug 注册表中安装了 NTSD,并且可以为内存访问冲突等问题生成良好的转储,所以这里的问题归结为正确地使程序崩溃,我想。
提前致谢。
【问题讨论】:
标签: c++ windows visual-c++ exception-handling
在 MSVC 中,如何使任何未处理的 C++ 异常(例如 std::runtime_error)使我的发布编译程序崩溃,以便它从异常抛出位置生成包含完整堆栈的转储?
我已经在 AeDebug 注册表中安装了 NTSD,并且可以为内存访问冲突等问题生成良好的转储,所以这里的问题归结为正确地使程序崩溃,我想。
提前致谢。
【问题讨论】:
标签: c++ windows visual-c++ exception-handling
我终于破解了。
set_terminate() 函数为每个线程注册一个处理程序SetUnhandledExceptionFilter()。一篇关于如何做到这一点的好文章:http://www.debuginfo.com/articles/debugfilters.html#overwrite。 void Terminate()
{
OutputDebugStringA("Terminate\r\n");
RaiseException(0xE0000010, EXCEPTION_NONCONTINUABLE, 0, 0);
}
像上面的例子一样调用RaiseException() 足以使进程崩溃并产生我想要的糊状转储。
您知道,我遇到的问题是:
SetUnhandledExceptionFilter() 以捕获 C++ 异常。由于最新的 C++ 异常过滤器是调用由 set_terminate() 设置的句柄的过滤器,因此没有调用我的句柄。【讨论】:
SetUnhandledExceptionFilter 和 DebugBreak 应该可以完成这项工作。
编辑:哎呀,重读,你想处理未捕获的 C++ 异常。做好这件事会有点棘手——当您(通常)听到 C++ 异常时,它已经将堆栈展开回处理程序的级别。在调用 catch 之前,您没有任何真正的方法可以知道是否引发了异常,但是到那时堆栈已经展开。
【讨论】:
SetUnhandledExceptionFilter 确实适用于未处理 C++ 异常,就像它适用于 SEH 异常一样。
研究使用 Windows 调试器。
Windbg – 以体面的 UI 封装 KD 和 NTSD。
另请查看 Windows 调试器附带的 ADPlus。
Here 是开始学习如何使用它的好地方。
【讨论】: