代码之家  ›  专栏  ›  技术社区  ›  Suma

什么是“微软C++可视化运行库:运行时错误”!“我怎么能抓住它呢?

  •  1
  • Suma  · 技术社区  · 14 年前

    很少有用户向我报告应用程序已使用以下消息框自行终止:

    Microsoft C++ Visual Runtime Library
    
    Runtime error!
    
    Program: XXXXX.exe
    
    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
    

    不幸的是,应用程序在显示消息后愚蠢地终止。我们对结构化异常有一个崩溃转储生成,但是由于这里没有异常,因此不会生成崩溃转储。

    是什么导致了这个消息?

    是否有某种方法可以更改应用程序,从而不显示(或添加到)生成小型转储的消息(或由应用程序执行某些其他自定义处理)?

    2 回复  |  直到 14 年前
        1
  •  4
  •   Community CDub    8 年前

    消息由 abort() ,可以直接调用,也可以由设计错误的异常调用-请参见unexpected()或terminate(),如中所述 Disable Microsoft Visual C++ Runtime Error . 是否显示消息可以使用 _set_abort_behavior 打电话来。在XP和更高版本上,应用程序应默认创建一个小型转储并将其发送到Windows错误报告服务。如果需要自定义处理程序(例如,自定义崩溃转储),唯一的(非标准)可能是为abort()函数提供自己的实现。

    Microsoft C运行时库中abort的默认实现如下:

    • 显示消息框或将消息打印到控制台
    • 如果有SIGABRT的处理程序
    • 如果允许故障报告,则
      • 使用SetUnhandledExceptionFilter删除未处理异常的任何处理程序(空)
      • 使用人工准备的异常信息执行未处理的ExceptionFilter
    • 调用“退出”(3)终止进程而不进行任何附加清理

    在源代码中包含以下代码将使应用程序执行默认的结构化异常处理(包括您可能已安装的任何筛选器):

    extern "C" void __cdecl abort (void)
    {
      volatile int a = 0;
      a = 1/a;
    }
    
        2
  •  3
  •   Community CDub    8 年前

    应用程序已调用 abort() 很可能是因为 terminate() 在堆栈展开期间,在异常从析构函数转义后调用,或者由于未调用异常而调用。

    an answer this related question 详细情况。基本上,您必须在顶层捕获和处理所有异常,而不是让异常转义析构函数。在debugger下启动程序,并启用“抛出异常时停止”来查找内部到底出了什么问题并修复它。