视觉C运行时有一个常见的错误:
该应用程序已要求运行时间以异常的方式终止它。
请联系应用程序的支持团队以获取更多信息。
这个错误消息实际上是什么意思是?
让我用一个寓言来确切地解释我的要求。
如果我看到一条消息:
Exception: access violation (0xc0000005), Address 0x702be865
这违反访问与性骚扰无关,或者有人试图闯入我的计算机(一般失败是一位试图阅读我的C驱动器的准将Windows 95)。
在这种情况下,访问冲突 对应于常数EXCEPTION_ACCESS_VIOLATION
(声明于winbase.h
值为 0xC0000005)。EXCEPTION_RECORD
结构。ACCESS_VIOLATION
意味着程序试图读取或写入内存中不应该的地址。
这是通常当程序有一个指向无效或不再有效的内存的指针时引起。
Note : 我是not问:
- 为什么是程序x收到 C0000005 错误?
- 为什么我的代码出现访问冲突?
- 如何调试访问冲突?
所以如果我问你what causes an access violation ,您不会告诉我检查堆栈跟踪,或观察输出窗口,或发布示例代码。“It is from trying to access memory that isn’t valid.”
回到我的问题
以下错误是什么意思:
This application has requested the Runtime to terminate in an unusual way.
我(相当)确定 Microsoft Visual C 运行时库没有函数:
void TerminateRuntime(bool UnusualWay);
所以我必须尝试弄清楚它的实际含义:
- 这意味着什么terminateVisual C 运行时库?
- 什么会是usual终止 MSVCRT 的方法?
- 有人会吗choose 终止它异常方式?
- 是今天的unusual 实际上,这是一种早已被弃用的形式usual路吗?
- 如果我是 (错误地)以不寻常的方式终止它,我会做什么来终止它通常方式?
换句话说:MSVCRT 捕获了什么错误,并隐藏在无信息的错误消息后面?
答案
当您收到该消息时abort()
函数被调用。
中止
中止当前进程并返回错误代码。
void abort( void );
返回值
abort不将控制返回给调用进程。
评论
默认情况下,abort例程打印消息:
“此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。”
似乎在最新版本的 VC 运行时中,该消息已被替换为"abort() 已被调用",也许是为了澄清它的真正含义。abort()
。
在内部,当abort()
被调用,它调用一个函数_amsg_exit,在internal.h中定义,它基本上"向控制台应用程序的stderr发出运行时错误消息,或在Windows应用程序的消息框中显示消息"。
cmsgs.h:
#define _RT_ABORT_TXT "" EOL "This application has requested the Runtime to terminate it in an unusual way.\nPlease contact the application's support team for more information." EOL
以及传入的错误代码 (_RT_ABORT
) 在 rterr.h 中定义:
rterr.h
#define _RT_ABORT 10 /* Abnormal program termination */
因此,或者,您可以通过调用来重现此内容_amsg_exit( _RT_ABORT )
Update by question poster : 在我问这个问题两周后,Raymond Chen 在自己的博客中回答了这个问题:
您正在运行程序,然后它突然退出并显示以下消息*此应用程序已请求运行时以异常方式终止它。*发生了什么?
该消息已打印通过C运行时函数abort,同样的函数也会导致你的程序以退出代码 3 终止。
您的程序可能会显式调用 abort,也可能最终由运行时库本身隐式调用。
C 标准阐明了在什么条件下
terminate
被称为,而且它的列表很长,所以我不会在这里重复它们。