コンソールアプリケーションのデバッグ時に、Visual Studioが非標準のコンソールを使用するように設定することはできますか?
デフォルトのコンソールが何であるかわかりません。それはcmd.exe
。デバッグするときに、コンソールアプリケーションをConEmuで実行したいです。
明確にするために、「デバッグの開始」をクリックしたいのですが、プロセスは通常どおり発生しますが、cmd.exe
コンソール、ConEmuコンソール(または何でも)が表示されます。
Visual Studio 2010 Proを使用しています
この(未回答の)質問と密接に関連しています: Visual StudioのデバッグにConsole2を使用しますか?
用語を混同しています。 「Windowsコンソール」は「cmd.exe」ではなく、Win7などの「conhost.exe」を使用して実装された特別な「サービス」です。
anyコンソールアプリケーション(cmd、powershell、または独自のアプリ)を起動すると、ウィンドウは特別な環境で起動し、コンソールウィンドウが表示される場合があります。 。しかし、それは常に内部Windowsコンソールです。
だが!コンソールエミュレーターはこのウィンドウを取得し、実際のコンソールを非表示にし、独自のエミュレートされた表面を表示します。たとえば、ConEmuを特別なスイッチ(SUで説明されている、コメント内のリンク)で起動して完了させることができます。
デフォルトの端末交換
ConEmuにはDefault Terminal
という名前の機能があります。この機能を有効にすると、ConEmuターミナルのVisual Studioからアプリケーションをシームレスに起動できます。アイデアは、ソースアプリケーションでCreateProcessをフックすることです(Explorer.exe
、vcexpress.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でプログラムを直接起動し、Visual Studioの[デバッグ]メニューから[プロセスにアタッチ]を選択するだけです。プログラムの最初に遅延を追加して、アタッチする時間を与えることができます。これを何度も行う必要がある場合、これは一種の苦痛ですが、この種の状況ではしばしば役立ちます。
__debugbreak();
ステートメントをプログラムの先頭に追加します(おそらく#ifndef NDEBUG
ブロック内に)。 ConEmuから直接プログラムを起動します。 Visual StudioのJIT機能を使用して、デバッグブレークに達したときに接続し、そこからデバッグを続行します。