49

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

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

明確にするために、「デバッグの開始」をクリックすると、プロセスは通常どおりに行われますが、cmd.exeコンソールを起動する代わりに、ConEmu コンソール (または何でも) を起動する必要があります。

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

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

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 に答える