【问题标题】:Use custom console for Visual Studio Console Application Debugging使用自定义控制台进行 Visual Studio 控制台应用程序调试
【发布时间】:2012-09-18 02:51:44
【问题描述】:

是否可以将 Visual Studio 设置为在调试控制台应用程序时使用非标准控制台?

我不确定默认控制台是什么,它看起来就像cmd.exe。当我调试时,我真的很希望我的控制台应用程序在 ConEmu 中运行。

为了清楚起见,我想点击“开始调试”,该过程应该像往常一样发生,但不是调出 cmd.exe 控制台,而是调出 ConEmu 控制台(或其他)。

我使用的是 Visual Studio 2010 Pro

与这个(未回答的)问题密切相关:Use Console2 for Visual Studio debugging?

【问题讨论】:

  • 超级用户superuser.com/q/445394/139371上的类似Q
  • 下面答案中给出的方法可以正常工作,但是,我希望 Visual Studio 内置支持选择第三方控制台模拟器来显示所有控制台应用程序输出。 (仍然不确定我是否在这里得到了我的术语,@Maximus!:-))

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


【解决方案1】:

您混淆了条款。 “Windows 控制台”不是“cmd.exe”,而是特殊的“服务”,例如 Win7 中的“conhost.exe”。

当您启动任何控制台应用程序(无论是 cmd、powershell 还是您自己的应用程序)时,windows 都会在特殊环境中启动它,该环境可能具有可见的控制台窗口。但它始终是内部 Windows 控制台。

但是!控制台模拟器可能会抓住这个窗口,隐藏真正的控制台并显示他们自己的模拟表面。 例如,您可以使用特殊开关(在 SU 中描述,评论中的链接)启动 ConEmu 并完成。

默认终端替换

ConEmu 有一个名为Default Terminal 的功能。如果启用此功能,您将在 ConEmu 终端中从 Visual Studio 无缝启动您的应用程序。这个想法是在源应用程序中挂钩 CreateProcess(explorer.exevcexpress.exe 等等,在设置中用| 分隔它们)。在project wiki 中阅读有关该功能的更多信息。

您可以选择使用现有的 ConEmu 实例或为您的应用程序运行新窗口。 ConEmu 可以在应用程序退出后在控制台上显示Press Enter or Esc to close console... 消息(Always 无线电)。无需再在程序末尾添加readline 即可查看输出。

更改您的应用程序代码

因为它是您自己的程序,您可以在main 函数的头部添加例如以下行

C++ 示例

#ifdef _DEBUG
if (IsDebuggerPresent())
{
  STARTUPINFO si = {sizeof(si)}; PROCESS_INFORMATION pi = {};
  if (CreateProcess(NULL,
        _T("\"C:\\Program Files\\ConEmu\\ConEmu\\ConEmuC.exe\" /AUTOATTACH"),
        NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
  { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }
}
#endif

C# 示例

#if DEBUG
ProcessStartInfo pi = new ProcessStartInfo(@"C:\Program Files\ConEmu\ConEmu\ConEmuC.exe", "/AUTOATTACH");
pi.CreateNoWindow = false;
pi.UseShellExecute = false;
Console.WriteLine("Press Enter after attach succeeded");
Process.Start(pi);
Console.ReadLine();
#endif

【讨论】:

  • 谢谢。 ConEmu 中的Attach To 选项效果很好,如您在我的帖子中评论的超级用户文章链接中所述。我无法尝试您在此处提供的预处理器指令,因为我正在使用 C# 并且我目前不知道如何实现您为 C# 预处理器提供的指令。感谢您的出色申请!
  • 谢谢@Maximus。在这种情况下,AUTOATTACH 开关的预期行为是什么?
  • 它必须启动新的 ConEmu GUI(如果尚未启动)并将您的控制台应用程序附加到新选项卡中。
  • 更新 3. 如果您检查 Visual Studio 的新功能“默认终端” - 无需在控制台应用程序中插入额外的代码行。它将在 ConEmu 中“从盒子里”开始。
  • 对于任何无法让它与 VS2015 一起使用的人,我发现 devenv.exe 启动 msvsmon.exe 然后启动我的应用程序。将 msvsmon.exe 添加到挂钩的 exe 列表中使其对我有用。
【解决方案2】:

一些想法:

  1. 直接在 ConEmu 中启动您的程序,然后从 Visual Studio 的“调试”菜单中选择“附加到进程”。您可以在程序开始时添加延迟,以便有时间附加。如果您必须一遍又一遍地这样做,这会有点痛苦,但它通常对这种情况很有用。

  2. __debugbreak(); 语句添加到程序的开头(可能在#ifndef NDEBUG 块内)。直接从 ConEmu 启动您的程序。使用 Visual Studio 的 JIT 功能在遇到调试中断时进行连接,然后从那里继续调试。

【讨论】:

    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 2019-01-18
    • 2019-11-29
    • 1970-01-01
    • 2012-05-12
    • 2016-04-11
    • 1970-01-01
    • 2014-09-30
    相关资源
    最近更新 更多