在MSVC中,我怎样才能使任何未经处理的C ++exception(例如std :: runtime_error)崩溃我的发布编译的程序,以便它从exception抛出位置生成一个完整的堆栈转储?
我已经在AeDebugregistry中安装了NTSD,并且可以为内存访问冲突等内容生成良好的转储,因此,我想这个问题归结为正确的程序崩溃。
提前致谢。
我终于破解了。
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
被调用,但是到那时栈已经被解开。
看看使用Windows调试器。
Windbg – 用一个体面的用户界面包装KD和NTSD。
同时检查Windows调试器附带的ADPlus。
这里是开始学习如何使用它的好地方。