Visual Studio 控制台程序在 control-c 后崩溃

Posted

技术标签:

【中文标题】Visual Studio 控制台程序在 control-c 后崩溃【英文标题】:visual studio console program crashes after 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。 【参考方案1】:

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

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

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

【讨论】:

以上是关于Visual Studio 控制台程序在 control-c 后崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Visual Studio 在控制台中运行程序? [复制]

为啥我在visual studio 2008 VC++中运行一个Win32控制台应用程序后,弹出一个“没有找到MSVCP90D.dll”?

Visual Studio 控制台程序在 control-c 后崩溃

Visual Studio 中 Web 应用程序的控制台输出

控制台应用程序在 Visual Studio 中打开后立即关闭

visual studio2012中 c语言编译出来的程序怎么暂停啊