我很少收到某个用户的报告,说明该应用已通过以下消息框终止了自己:
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.
不幸的是,应用程序在显示消息后会以静默方式终止。我们在结构化异常上生成故障转储,但由于此处没有异常,因此不会生成故障转储。
导致此消息的原因是什么?
是否有某种方法可以更改应用程序,以便代替(或添加)显示消息,生成一个小型转储(或者应用程序完成其他一些自定义处理)?
答案 0 :(得分:4)
消息由abort()生成,可以直接调用,也可以通过设计错误的异常调用 - 请参阅Disable Microsoft Visual C++ Runtime Error中所述的unexpected()或terminate()。是否显示消息可以使用_set_abort_behavior调用进行调整。在XP及更高版本中,应用程序应默认创建一个minidump并将其发送到Windows错误报告服务。如果您需要自定义处理程序(例如自定义崩溃转储),唯一(非标准)可能性似乎是为abort()函数提供您自己的实现。
Microsoft C运行时库中的中止的默认实现如下:
在源代码中包含以下代码会使应用程序执行默认的结构化异常处理(包括您可能已安装的任何过滤器):
extern "C" void __cdecl abort (void)
{
volatile int a = 0;
a = 1/a;
}
答案 1 :(得分:3)
应用程序调用{{1}}的可能性很大,因为在堆栈展开期间异常逃脱了析构函数之后调用了abort()
,或者因为没有调用异常。
有关详情,请参阅an answer至this related question。基本上你必须在顶层捕获并处理所有异常,不要让异常逃脱析构函数。在调试器下启动你的程序并启用“抛出异常时停止”以找到内部确实出错的地方并修复它。