在未处理的C&x2B中转储+;例外 在MSVC中,如何使任何未处理的C++异常(例如:STD::RunTimeOrthError)崩溃我的版本编译程序,以便它从异常抛出位置生成完整堆栈的转储?

在未处理的C&x2B中转储+;例外 在MSVC中,如何使任何未处理的C++异常(例如:STD::RunTimeOrthError)崩溃我的版本编译程序,以便它从异常抛出位置生成完整堆栈的转储?,c++,windows,visual-c++,exception-handling,C++,Windows,Visual C++,Exception Handling,我已经在AeDebug注册表中安装了NTSD,可以为内存访问冲突之类的事情生成良好的转储,所以我想这里的问题归结为正确地破坏程序 提前谢谢。而且可能应该完成这项工作 编辑:OOP,重读,你想处理不加的C++异常。这样做会有点棘手——当你(通常)得到C++异常的时候,它已经解压缩了栈回到处理程序的级别。在调用catch之前,您没有任何真正的方法知道抛出了异常,但此时堆栈已经展开 研究如何使用Windows调试器。 Windbg–用一个体面的用户界面包装KD和NTSD。 还可以查看Windows调试

我已经在AeDebug注册表中安装了NTSD,可以为内存访问冲突之类的事情生成良好的转储,所以我想这里的问题归结为正确地破坏程序

提前谢谢。

而且可能应该完成这项工作


<>编辑:OOP,重读,你想处理不加的C++异常。这样做会有点棘手——当你(通常)得到C++异常的时候,它已经解压缩了栈回到处理程序的级别。在调用
catch
之前,您没有任何真正的方法知道抛出了异常,但此时堆栈已经展开

研究如何使用Windows调试器。
Windbg–用一个体面的用户界面包装KD和NTSD。
还可以查看Windows调试器附带的ADPlus


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

我终于把它破解了

  • 使用
    set\u terminate()
    函数为每个线程注册一个处理程序

  • 在main function()中,使外部DLL(事件窗口)无法成功调用
    SetUnhandledExceptionFilter()
    。这里有一篇关于如何做到这一点的好文章:
  • 至于手柄本身,它非常简单:
  • 像上面的例子一样调用
    RaiseException()
    就足以使进程崩溃并产生我想要的大量转储

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

  • IPHelper Windows API动态加载另一个Windows DLL
  • 此DLL使用Windows自己版本的C运行时(MSVCRT而不是MSVCRT90)

  • 新的C++运行时在启动时调用<代码> StunHuntLeXeXPosiFielter()/<代码>以捕获C++异常。由于C++异常的最新过滤器是通过StItEngestEnter()调用句柄集的一个过滤器,所以我的句柄没有被调用。
    使用调试器是可以的,但这不能在程序运行的无人值守环境中完成。请参阅,这是一个生产环境:如果出现问题,服务将崩溃并重新启动。我真的需要一个崩溃转储,以便稍后进行验尸分析。我还需要有关“由Windows收集的错误报告”的这些信息,稍后我将获得这些信息。Windows调试器附带一个名为ADPlus的实用程序,该实用程序允许我轻松收集发布版本应用程序崩溃的堆栈跟踪。我同意这一点,你应该只在试图追查撞车事故时才这样做,而不是在连续的基础上。为此,您需要一个日志记录系统。检查所有的ADOPLUS命令开关。MSCVRT中的SETIONEATEATE()函数应该能起作用,但是我不能使它工作:我的处理程序(它调用RAISE异常(和)使程序崩溃)永远不会被调用。<代码> StunHundLeXePosivsPosivs/Cuth>对未处理的C++异常也适用于Seh异常。
    void Terminate()
    {
      OutputDebugStringA("Terminate\r\n");
      RaiseException(0xE0000010, EXCEPTION_NONCONTINUABLE, 0, 0);
    }