【问题标题】:VS2010 (Express) debugger trapping Ctrl+C in Console appVS2010 (Express) 调试器在控制台应用程序中捕获 Ctrl+C
【发布时间】:2010-10-16 13:40:42
【问题描述】:

答案摘要

为避免调试器捕获 Ctrl+C,请先关闭 Visual Studio 托管过程(在项目属性,调试选项卡中找到)

如果您使用的是 Visual Studio 的 Express 版本,那就是您的全部 可以。

如果您使用的是专业版或更高版本的 Visual Studio,您可以 另外打开调试>异常...,Win32异常,并取消选中 Ctrl+C。

作为替代方案,您可以在调试时使用 Ctrl+Break,除非像我一样 Ctrl+C 已硬连线到您的大脑中。

原创

以下内容已被编辑。汉斯似乎收回了他的回答,但他的提问帮助我缩小了问题陈述的范围:

超清晰

  • 我不想修改 Ctrl+C 的行为。
  • 我不是在寻找解决办法。
  • 我只是希望调试器在调试会话期间按 Ctrl+C 时中断。

请注意,以下示例是人为设计的。这只是为了展示行为。我更改了 ReadKey 行,因为它会分散人们的注意力。

调试(运行)以下程序:

class Program
{
    static void Main()
    {
        System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
    }
}

按 Ctrl+C。调试器会中断,就像您在 Sleep 行设置断点一样。

如何关闭此功能?我不希望调试器因 Ctrl+C 而中断。

VS2008 Pro 不会在家里发生这种情况。

我现在已经在 VS2008 Express 和 VS2010 Express(我可以轻松测试的唯一版本)上进行了尝试,他们都做到了。这让我相信它要么是 Express 行为,要么是某个地方的设置可以打开/关闭它。

  1. 在任何版本/版本中是否有打开/关闭此功能的设置?
  2. 此设置是否存在于 VS2008、VS2010 或两者中?
  3. 该设置是否在 Express 版本中公开?
  4. 我的 VS2008 Pro 实例是唯一的吗?设置是在旧版本的 Visual Studio 中暴露出来的东西吗(我已经通过许多新版本继承了 VS 设置)。

【问题讨论】:

    标签: visual-studio debugging visual-studio-2010 visual-studio-debugging


    【解决方案1】:

    也许这是现在的常识,但是当我们在 Visual Studio 中调试时尝试使用 ctrl-c 停止 topshelf 应用程序时遇到了同样的问题。最后我们发现你需要在抛出时关闭捕获control-c win32异常(Debug->Exceptions,或ctrl d,e打开Win32 Exceptions然后在抛出的列中取消选中control-c),然后也转到项目(即运行服务)属性并在调试选项卡上选中启用非托管代码调试选项。我们使用的是 MS Visual Studio 2010 专业版 10.0.40219.1 SP1Rel。

    【讨论】:

    • 谢谢。这为我解决了问题(我必须执行这两个步骤......异常和非托管调试)。
    【解决方案2】:

    我找到了答案,它是一个调试异常选项。我不知道我第一次是怎么错过的,但这里是:

    调试 -> 异常... Win32 异常 - Control-C

    这是在 VS2008 Pro 中。

    我还可以确认该选项在 Express 版本中存在(整个 Win32 异常节点丢失)。

    所以我剩下的唯一问题是,因为我还没有 VS2010 Pro(还没有?):Win32 Exceptions 节点和 Control-C 异常是否存在于 VS2010 Pro 版本中?

    【讨论】:

      【解决方案3】:

      似乎有一个bug in VS 2010 debugger / .NET 4,当您在仅托管调试的控制台应用程序中按下 Ctrl+C 时,您会得到一个奇怪的“无符号”窗口。有一种解决方法可以启用混合模式调试。该错误说“已修复”,但如果其他人遇到此问题,请在连接错误上报告,以便修复进入修补程序/SP。

      我在调试使用 TopShelf 库托管 Windows 服务的服务时看到了这一点,该服务还允许您在本地将服务作为控制台应用程序进行调试。

      https://connect.microsoft.com/VisualStudio/feedback/details/524889/debugging-c-console-application-that-handles-console-cancelkeypress-is-broken-in-net-4-0?wa=wsignin1.0

      相关链接:TopShelf,(来自MassTransit

      更新:似乎连接错误适用于 VS 2010 Beta,但我在使用 VS 2010 RTM 进行托管调试时看到奇怪的“无可用源”,我认为这是最新的修补程序。

      【讨论】:

      • 在 VS2010 SP1 上仍然会发生。即使在 Win32 异常下禁用了 Control+C 异常(如下所示)。按 Control+C 退出 Topshelf 会导致调试器中断,并且 Topshelf 中的 Console Runner 不会捕获事件。 :(
      【解决方案4】:
      【解决方案5】:

      CTRL-C 直接连接到控制台窗口本身以进行“中断”操作。打开一个新的控制台应用程序,ping 一些东西,然后立即按 CTRL-C。它中止 ping。

      您说 VS Pro 没有这种行为。我假设它只是自己设置了 SetConsoleMode 而 VS Express 没有。但是,您仍然可以直接告诉控制台忽略 CTRL-C,并使用 SetConsoleMode 自己将其视为直接输入。详情见此链接:

      这是 C# 中的一个示例用法:

      只需在程序开始时使用您选择的模式选项进行调用,您就可以开始了!

      希望这会有所帮助!

      M

      【讨论】:

      • 感谢您的帮助。鉴于最近的编辑(特别是删除了 ReadKey),您将如何重新考虑您的答案?
      • 不确定我会改变我的答案。如果控制台连接到 CTRL-C 作为中断读取,并且 VS 收到中断,然后进入调试,告诉控制台不要中断,而是将 CTRL-C 作为输入来解决您的问题。同样,我很确定 VS Pro 会自动执行我建议的操作,因为 CTRL-C 是 VS Pro 可能会覆盖的控制台行为。在 VS Express 中,您似乎必须这样做。如果您担心添加代码,请在 Pro 中构建时添加要排除的编译器指令。
      • 另外,您的第 1 点和第 3 点是矛盾的。您要求改变行为。同样,我很确定 VS Pro 会自动执行我建议的操作。同样的原因在调试或发布中运行控制台应用程序会改变完成时发生的情况(一个关闭,另一个暂停并在完成后等待按键。)
      • 最后一件事......你总是可以编写一个单独的程序来设置控制台,然后启动你的控制台应用程序本身(可能通过命令行参数)。这样所有代码都可以设置控制台是在一个完全独立的项目中。只是一些思考的食物。
      猜你喜欢
      • 2012-03-17
      • 2010-09-15
      • 2013-11-14
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      相关资源
      最近更新 更多