【问题标题】:How can I catch this "This application has requested the Runtime to terminate it in an unusual way" error in my C program?如何在我的 C 程序中捕获此“此应用程序已请求运行时以不寻常的方式终止它”错误?
【发布时间】:2013-04-20 04:56:47
【问题描述】:

我有一个 C CLI 程序在 Windows 7 中崩溃并生成此错误:

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

首先,我在某处读到它可能导致assert 语句触发,因此作为第一项措施,我将它们替换为 if 语句以捕获并记录任何潜在的失败断言。其次,我用printf 语句喷洒代码以查看程序退出的位置。第三,我特别确保代码不会在没有先记录退出的情况下退出任何地方。该程序是线程化的,所以会发生很多事情,但没有什么太复杂的。

现在的问题是,我第二次收到错误时,它表明程序在我的 printf 语句之外退出,所以我不知道它在哪里退出。

那么两个问题:

  1. 我怀疑我需要使用适当的调试器来查看有关退出的更多详细信息,如果需要,是哪个?
  2. 除了assert 语句之外,关于此类错误还有其他问题吗?我发现很多关于这个错误的 C++ 博客条目,但没有太多 C 的。

我正在使用 Visual C++ 2008 速成版。另外,我正在CMD.exe 中调用程序。

【问题讨论】:

    标签: c windows runtime exit terminate


    【解决方案1】:

    首先,您删除了对assert 的调用,这通常是为了帮助追踪程序员所做的假设不成立的情况?真的吗?嗯……

    其次,你对调试器很熟悉吗? Visual C++ 应该包含一个集成的调试器,当你的程序在调试模式下运行时,它不仅可以显示你的进程从哪里退出,而且它可以显示你的程序崩溃的确切位置,它是如何崩溃的那一点以及崩溃时变量的值在哪里。想象一下!

    这个article主要讲C#,但原理是一样的。

    【讨论】:

    • 我用常规 if 语句替换了 assert 语句,我可以在其中处理断言并记录它。不,我对 Visual C++ 中的调试不是很熟悉,想象一下。
    • 与其搞乱assert,不如在调试器中运行你的程序。你会很高兴你做到了。
    【解决方案2】:

    您收到的消息来自 VC 运行时。当抛出异常并且没有在任何地方捕获时,就会发生这种情况。

    使用调试调试配置(应该是默认配置)编译您的程序并在调试器中运行,当您遇到未处理的异常时,调试器将中断。在“Debug”菜单下,您会找到一个“Exceptions”项,它可以帮助您微调调试器对异常的响应方式。

    请注意,在 C++ 和 Windows 的上下文中,“异常”可能意味着以下几种情况之一;有 Win32 异常、C++ 异常和 VS 结构化异常处理。

    断言适用于您从未期望发生但无法证明不会发生的失败条件。你应该总是对一个断言感到惊讶。 assert() 的许多(大多数?全部?)实现仅在调试配置中编译,而不是在发布配置中编译。

    【讨论】:

    • 看来VC调试器是要走的路。在调试器中运行程序会如何影响性能?
    • 它会运行得更慢。不要费心优化一个不正确的程序——解决你面前的问题。
    • 确实如此。但是,在这种特殊情况下,我怀疑崩溃与性能有关。也就是说,如果它运行得较慢,崩溃可能不会实现......无论如何感谢您的帮助,非常感谢。
    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多