DUMP在未处理的C ++exception中

在MSVC中,我怎样才能使任何未经处理的C ++exception(例如std :: runtime_error)崩溃我的发布编译的程序,以便它从exception抛出位置生成一个完整的堆栈转储?

我已经在AeDebugregistry中安装了NTSD,并且可以为内存访问冲突等内容生成良好的转储,因此,我想这个问题归结为正确的程序崩溃。

提前致谢。

我终于破解了。

  1. 使用set_terminate()函数为每个线程注册一个处理程序
  2. 在你的主函数()中,使外部DLL(事件Windows)无法成功调用SetUnhandledExceptionFilter() 。 一个伟大的文章如何做到这一点: http : //www.debuginfo.com/articles/debugfilters.html#overwrite 。
  3. 至于手柄本身,这是非常简单的:
 void Terminate() { OutputDebugStringA("Terminate\r\n"); RaiseException(0xE0000010, EXCEPTION_NONCONTINUABLE, 0, 0); } 

像上面的例子一样调用RaiseException()就足以使进程崩溃并产生我想要的转储。

就你所知,我遇到的问题是:

  1. IPHelper Windows API动态加载另一个Windows DLL
  2. 此DLL使用Windows自己的版本的C运行时(MSVCRT而不是MSVCRT90)
  3. 新的C ++运行时在启动时调用SetUnhandledExceptionFilter()来捕获C ++异常。 由于最新的C ++异常过滤器是调用set_terminate()设置的句柄,所以我的句柄没有被调用。

SetUnhandledExceptionFilterDebugBreak应该可以做这个工作。

编辑:哎呀,重读,你想处理未被捕获的C ++异常。 这样做会有点棘手,当你(通常)得到一个C ++异常的时候,它已经把堆栈解开回到处理程序的层次。 你没有任何真正的方法来知道抛出一个异常,直到一个catch被调用,但是到那时栈已经被解开。

看看使用Windows调试器。
Windbg – 用一个体面的用户界面包装KD和NTSD。
同时检查Windows调试器附带的ADPlus。

这里是开始学习如何使用它的好地方。