c++ - Visual Studio 控制台程序在 control-c 后崩溃
问题描述
我正在使用 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;
}
解决方案
https://docs.microsoft.com/en-us/windows/console/setconsolectrlhandler
这里它说如果正在调试应用程序,“系统会生成一个 DBG_CONTROL_C 异常。这个异常只是为了调试器的利益而引发的”。因此,它没有碰撞;您可以继续执行,它应该可以正常工作。文档说:
如果调试器在未处理时传递异常,则 CTRL+C 将传递到控制台进程并作为信号处理,如前所述。
推荐阅读
- scala - 为什么 Play 动作是单线程的?
- c# - Process.Start 失败并声称“目录名称无效。”
- c# - 使用 OneOf 的 API
- java - 如果参数不包含单引号然后被单引号包围,是否可以执行 SQL 注入?
- eclipse - 如何在 Xtext 中禁用 DslValidator 的自动生成
- java - 为持久性单元“默认”关闭 JPA Entity_Manage_Factory
- python - 如何仅通过 int 对字符串和 int 值的字典进行排序
- sql-server - 关于使用专用终结点通过 Azure 数据工厂调度管道的问题
- python - Celery worker 中的“运行客户端通道备份轮询器”GRPC 客户端错误
- android - 您的 android 清单中所需的元数据标记不存在。MobileAds.initialize() 处的应用程序崩溃;