【问题标题】:visual studio console program crashes after control-cVisual Studio 控制台程序在 control-c 后崩溃
【发布时间】:2020-02-01 05:31:07
【问题描述】:

我正在使用 Visual Studio 2019 的最新更新(版本 16.5.0 预览版 2.0)并试图拦截 control-c 事件。但是由于某种原因,控制台程序总是在调用我的处理程序之前崩溃。顺便说一句,即使我不安装任何处理程序,程序也会崩溃。

这可能是编译器中的错误吗?一般来说,你如何调试这样的东西?

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
#include <cstdint>

uint64_t iterations;
bool running;

BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)
{
    switch (fdwCtrlType) {
        case CTRL_C_EVENT: {
            running = false;
            return TRUE;
        } break;
        default: {
            return FALSE;
        } break;
    }
}

int main()
{
    if (!SetConsoleCtrlHandler(CtrlHandler, TRUE)) {
        std::cout << "Could not install control handler" << std::endl;
    }
    running = true;
    while (running) {
        iterations++;
    }
    std::cout << "Terminated after " << iterations << " iterations." << std::endl;
    return 0;
}

【问题讨论】:

  • 它没有崩溃。在调用处理程序之前,当抛出异常时,调试器将停止执行。如果您告诉调试器继续执行,您应该会看到程序处理它。
  • @1201ProgramAlarm 啊,我实际上阅读了有关调试器的文档,但没有意识到这是调试器“处理”异常的方式。谢谢!有趣的是,在发布版本中,在我继续调试器后,running 仍然没有设置为 false。

标签: c++ windows visual-studio


【解决方案1】:

https://docs.microsoft.com/en-us/windows/console/setconsolectrlhandler

这里说,如果正在调试应用程序,“系统会生成一个 DBG_CONTROL_C 异常。这个异常只是为了调试器的利益而引发的”。因此,它没有碰撞;您可以继续执行,它应该可以正常工作。文档说:

如果调试器在未处理时传递异常,则 CTRL+C 将传递给控制台进程并作为信号处理,如前所述。

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 2021-10-11
    • 2014-09-30
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多