49

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

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

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

我正在使用 Visual Studio 2010 Pro

与这个(未回答的)问题密切相关:使用 Console2 进行 Visual Studio 调试?

4

2 回答 2

40

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

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

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

默认终端更换

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

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

ConEmu DefTerm 设置页面

更改您的应用程序代码

因为它是您自己的程序,您可以在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
于 2012-09-26T16:11:12.930 回答
3

一些想法:

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

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

于 2012-09-26T16:27:18.093 回答