什么是“Microsoft C ++ Visual Runtime Library:运行时错误!”我该如何捕捉它?

时间:2010-11-18 14:33:03

标签: visual-studio debugging visual-studio-2005 runtime runtime-error

我很少收到某个用户的报告,说明该应用已通过以下消息框终止了自己:

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 个答案:

答案 0 :(得分:4)

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

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

  • 显示消息框或将消息打印到控制台
  • 如果有任何,
  • 会引发SIGABRT的处理程序
  • 如果允许故障报告,那么
    • 使用SetUnhandledExceptionFilter(NULL)
    • 删除未处理异常的任何处理程序
    • 使用人为准备的异常信息执行UnhandledExceptionFilter
  • 调用_exit(3)以终止进程而无需任何额外的清理

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

extern "C" void __cdecl abort (void)
{
  volatile int a = 0;
  a = 1/a;
}

答案 1 :(得分:3)

应用程序调用{​​{1}}的可能性很大,因为在堆栈展开期间异常逃脱了析构函数之后调用了abort(),或者因为没有调用异常。

有关详情,请参阅an answerthis related question。基本上你必须在顶层捕获并处理所有异常,不要让异常逃脱析构函数。在调试器下启动你的程序并启用“抛出异常时停止”以找到内部确实出错的地方并修复它。