在MSVC中,如何使任何未处理的C ++异常(例如std :: runtime_error)崩溃我的发布编译程序,以便它从异常抛出位置生成具有完整堆栈的转储?
我已经在AeDebug注册表中安装了NTSD,并且可以为内存访问违规等事情生成良好的转储,所以这里的问题归结为正确地崩溃程序,我想。
提前致谢。
答案 0 :(得分:2)
我终于把它搞砸了。
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()调用句柄集的过滤器,因此我的句柄未被调用。答案 1 :(得分:1)
SetUnhandledExceptionFilter
和DebugBreak
应该可以胜任。
编辑:oops,重读,你想处理未捕获的C ++异常。这样做会有点麻烦 - 当你(通常)得到一个C ++异常时,它已经将堆栈解开回到处理程序的级别。在调用catch
之前,您没有任何真正的方法可以知道抛出异常,但到那时堆栈已经解开。
答案 2 :(得分:0)
查看使用Windows调试器 Windbg - 用一个不错的用户界面包装KD和NTSD 另请查看Windows调试器附带的ADPlus。
Here是开始学习如何使用它的好地方。