web-dev-qa-db-ja.com

Visual Studioコンソールアプリケーションのデバッグにカスタムコンソールを使用する

コンソールアプリケーションのデバッグ時に、Visual Studioが非標準のコンソールを使用するように設定することはできますか?

デフォルトのコンソールが何であるかわかりません。それはcmd.exe。デバッグするときに、コンソールアプリケーションをConEmuで実行したいです。

明確にするために、「デバッグの開始」をクリックしたいのですが、プロセスは通常どおり発生しますが、cmd.exeコンソール、ConEmuコンソール(または何でも)が表示されます。

Visual Studio 2010 Proを使用しています

この(未回答の)質問と密接に関連しています: Visual StudioのデバッグにConsole2を使用しますか?

45
Pieter Müller

用語を混同しています。 「Windowsコンソール」は「cmd.exe」ではなく、Win7などの「conhost.exe」を使用して実装された特別な「サービス」です。

anyコンソールアプリケーション(cmd、powershell、または独自のアプリ)を起動すると、ウィンドウは特別な環境で起動し、コンソールウィンドウが表示される場合があります。 。しかし、それは常に内部Windowsコンソールです。

だが!コンソールエミュレーターはこのウィンドウを取得し、実際のコンソールを非表示にし、独自のエミュレートされた表面を表示します。たとえば、ConEmuを特別なスイッチ(SUで説明されている、コメント内のリンク)で起動して完了させることができます。

デフォルトの端末交換

ConEmuにはDefault Terminalという名前の機能があります。この機能を有効にすると、ConEmuターミナルのVisual Studioからアプリケーションをシームレスに起動できます。アイデアは、ソースアプリケーションでCreateProcessをフックすることです(Explorer.exevcexpress.exeなど、設定では|で区切ります)。その機能についての詳細は project wiki で読んでください。

既存のConEmuインスタンスを使用するか、アプリケーションの新しいウィンドウを実行するかを選択できます。また、アプリケーションが終了した後、ConEmuはPress Enter or Esc to close console...メッセージをコンソールに表示できます(Always無線)。出力を見るために、プログラムの最後に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
39
Maximus

いくつかのアイデア:

  1. ConEmuでプログラムを直接起動し、Visual Studioの[デバッグ]メニューから[プロセスにアタッチ]を選択するだけです。プログラムの最初に遅延を追加して、アタッチする時間を与えることができます。これを何度も行う必要がある場合、これは一種の苦痛ですが、この種の状況ではしばしば役立ちます。

  2. __debugbreak();ステートメントをプログラムの先頭に追加します(おそらく#ifndef NDEBUGブロック内に)。 ConEmuから直接プログラムを起動します。 Visual StudioのJIT機能を使用して、デバッグブレークに達したときに接続し、そこからデバッグを続行します。

3
Adrian McCarthy