未处理的C ++异常中的DUMP

时间:2010-06-02 19:18:33

标签: c++ windows visual-c++ exception-handling

在MSVC中,如何使任何未处理的C ++异常(例如std :: runtime_error)崩溃我的发布编译程序,以便它从异常抛出位置生成具有完整堆栈的转储?

我已经在AeDebug注册表中安装了NTSD,并且可以为内存访问违规等事情生成良好的转储,所以这里的问题归结为正确地崩溃程序,我想。

提前致谢。

3 个答案:

答案 0 :(得分:2)

我终于把它搞砸了。

  1. 使用set_terminate()函数为每个线程注册处理程序
  2. 在主函数()中,外部DLL(事件Windows')无法成功调用SetUnhandledExceptionFilter()。关于如何在此处执行此操作的精彩文章:http://www.debuginfo.com/articles/debugfilters.html#overwrite
  3. 至于手柄本身,它非常简单:
  4. 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()调用句柄集的过滤器,因此我的句柄未被调用。

答案 1 :(得分:1)

SetUnhandledExceptionFilterDebugBreak应该可以胜任。

编辑:oops,重读,你想处理未捕获的C ++异常。这样做会有点麻烦 - 当你(通常)得到一个C ++异常时,它已经将堆栈解开回到处理程序的级别。在调用catch之前,您没有任何真正的方法可以知道抛出异常,但到那时堆栈已经解开。

答案 2 :(得分:0)

查看使用Windows调试器 Windbg - 用一个不错的用户界面包装KD和NTSD 另请查看Windows调试器附带的ADPlus。

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