使用自定义控制台进行Visual Studio控制台应用程序调试

51

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

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

明确一下,我想要点击“开始调试”,然后过程应该与平常一样进行,但是不会弹出一个 cmd.exe 的控制台,而应该弹出一个 ConEmu 控制台(或其他任何)。

我正在使用 Visual Studio 2010 Pro。

与此密切相关(未回答)的问题:在 Visual Studio 调试时使用 Console2?


1
在SuperUser上有类似的问题 http://superuser.com/q/445394/139371 - Maximus
1
下面回答中给出的方法很好用,但是我希望Visual Studio内置支持选择第三方控制台模拟器来显示所有控制台应用程序输出。(我还不确定我在这里使用的术语是否正确,@Maximus! :-) ) - Pieter Müller
2个回答

42
您混淆了术语。“Windows Console”不是“cmd.exe”,而是一种特殊的“服务”,例如在Win7中使用“conhost.exe”实现。
当您启动任何控制台应用程序(无论是cmd、powershell还是您自己的应用程序),Windows都会在特殊环境中启动它,该环境可能具有可见的控制台窗口。但它始终是内部的Windows控制台。
但是!控制台模拟器可以抓取此窗口,隐藏真正的控制台并显示其自己的模拟表面。例如,您可以使用特殊开关(在评论中描述)启动ConEmu,然后完成操作。
默认终端替换
ConEmu具有名为“默认终端”的功能。如果您启用此功能,则可以在ConEmu终端中无缝启动来自Visual Studio的应用程序。其思想是钩住源应用程序(explorer.exe、vcexpress.exe等,在设置中用|分隔)。请在project wiki中阅读有关该功能的更多信息。
您可以选择使用现有的ConEmu实例或为您的应用程序运行新窗口。并且在您的应用程序退出后,ConEmu可以在控制台上显示“按Enter或Esc关闭控制台…”消息(“始终”单选按钮)。不需要再在程序末尾添加readline以查看输出。

ConEmu DefTerm settings page

更改您的应用程序代码

由于这是您自己的程序,因此您可以在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中的附加到选项非常好用,正如您在我的帖子上评论的SuperUser文章链接所描述的那样。我还没有尝试您在此处提供的预处理器指令,因为我正在使用C#工作,而且目前不知道如何实现您提供的C#预处理器指令。感谢您提供一个优秀的应用程序! - Pieter Müller
谢谢@Maximus。在这种情况下,AUTOATTACH开关的预期行为是什么? - Pieter Müller
请启动新的ConEmu GUI界面(如果尚未启动),并将您的控制台应用程序附加到新选项卡中。 - Maximus
更新3。如果您为Visual Studio检查了新功能“默认终端”,则无需将其他代码行插入到控制台应用程序中。它将在ConEmu中“开箱即用”启动。 - Maximus
4
对于在VS2015上无法使用的任何人,我发现devenv.exe会启动msvsmon.exe,然后再启动我的应用程序。将msvsmon.exe添加到受挂钩exe列表中使其对我有效。 - Austin Wagner
设置“默认终端”会使Visual Studio 2015在ConEmu中为我生成3个窗口,所有窗口的内容都相同。有什么想法吗? - yoyoyoyosef

3

一些想法:

  1. 直接在ConEmu中启动您的程序,然后从Visual Studio的Debug菜单中选择Attach to Process。 您可以在程序开头添加一个延迟,以便给您时间进行附加。 如果您必须反复执行此操作,则有些繁琐,但通常对于这种情况非常有用。

  2. 在程序开头添加一个__debugbreak();语句(可能位于#ifndef NDEBUG块内)。 直接从ConEmu启动您的程序。 当调试断点命中时,使用Visual Studio的JIT功能连接,并从那里继续调试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接