39

Kann Visual Studio beim Debuggen einer Konsolenanwendung eine nicht standardmäßige Konsole verwenden?Benutzerdefinierte Konsole für Visual Studio Console-Anwendung verwenden Debuggen

Ich bin mir nicht sicher, was die Standardkonsole ist, sieht genauso aus wie cmd.exe. Ich würde wirklich lieben, dass meine Konsolenanwendung in ConEmu läuft, wenn ich debugge.

Um klar zu sein, möchte ich auf "Start Debugging" klicken und der Prozess sollte genau wie üblich passieren, aber anstelle einer cmd.exe Konsole sollte es eine ConEmu-Konsole (oder was auch immer) bringen.

ich Visual Studio 2010 Pro

Eng bin mit dieser (offen) Frage bezogen werden: Use Console2 for Visual Studio debugging?

+1

Ähnliche Q auf Super-User-http://superuser.com/q/445394/139371 – Maximus

+0

Die in Antwort gegeben Methoden unten funktionieren, möchte ich jedoch Visual Studio integrierte in hatte die Unterstützung für eine dritte Partei-Konsole wählen Emulator zum Anzeigen der Ausgabe aller Konsolenanwendungen. (Immer noch nicht sicher, ob ich meine Terminologie hier richtig verstehe, @Maximus! :-)) –

+0

yeah, ConEmu ... – Anubis

Antwort

34

Sie haben Begriffe mischen. Die "Windows-Konsole" ist keine "cmd.exe", sondern ein spezieller "Dienst", der zB von Win7 mit "conhost.exe" implementiert wurde.

Wenn Sie eine beliebige Konsole-Anwendung starten (spielt keine Rolle Cmd, Powershell oder Ihre eigene App) Windows startet es in einer speziellen Umgebung, die möglicherweise Konsolenfenster sichtbar haben. Aber es ist immer interne Windows-Konsole.

Aber! Konsolenemulatoren können dieses Fenster greifen, eine echte Konsole ausblenden und ihre eigene emulierte Oberfläche anzeigen. Zum Beispiel können Sie ConEmu mit speziellen Switches starten (beschrieben auf SU, link in comment) und fertig.

Standard Terminal Ersatz

ConEmu verfügt über eine Funktion namens Default Terminal. Wenn Sie diese Funktion aktivieren, starten Sie Ihre Anwendung nahtlos aus Visual Studio im ConEmu-Terminal. Die Idee ist, CreateProcess in der Quellanwendung einzubinden (explorer.exe, vcexpress.exe usw., in den Einstellungen mit | zu begrenzen). Lesen Sie mehr über dieses Feature in der project wiki.

Sie können die vorhandene ConEmu-Instanz verwenden oder ein neues Fenster für Ihre Anwendung ausführen. Und ConEmu kann Press Enter or Esc to close console... Nachricht auf der Konsole zeigen, nachdem Ihre Anwendung beendet wird (das Always Radio). Sie müssen readline nicht mehr am Ende Ihres Programms hinzufügen, um die Ausgabe zu sehen.

ConEmu DefTerm settings page

Ändern der Anwendungscode

Weil es Ihr eigenes Programm ist, können Sie zum Beispiel folgende Zeilen in den Kopf Ihrer main Funktion

C++ Beispiel hinzufügen

#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# Beispiel

#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 
+0

Danke. Die Option "Anhängen an" in ConEmu funktioniert hervorragend, wie in der SuperUser-Artikelverknüpfung beschrieben, die Sie zu meinem Beitrag kommentiert haben. Ich konnte die Preprozessor-Direktive, die Sie hier angeben, nicht ausprobieren, da ich in C# arbeite und derzeit nicht weiß, wie Sie die Direktive implementieren, die Sie für den C# -Preprozessor bereitgestellt haben. Danke für eine ausgezeichnete Bewerbung! –

+0

C# -Codebeispiel ... – Maximus

+0

Danke @Maximus. Was ist das erwartete Verhalten des Schalters AUTOATTACH in diesem Szenario? –

3

Einige Ideen:

  1. einfach Ihr Programm in ConEmu direkt starten, und dann wählen Sie Anhänge aus dem Menü Debuggen in Visual Studio zu verarbeiten. Sie können eine Verzögerung am Anfang Ihres Programms hinzufügen, um Ihnen Zeit zum Anhängen zu geben. Dies ist eine Art von Schmerz, wenn Sie dies immer wieder tun müssen, aber es ist oft nützlich für diese Art von Situation.

  2. Fügen Sie eine __debugbreak(); Anweisung an den Anfang Ihres Programms (vielleicht in einem #ifndef NDEBUG Block). Starten Sie Ihr Programm direkt von ConEmu. Verwenden Sie die JIT-Funktion von Visual Studio, um eine Verbindung herzustellen, wenn die Debug-Unterbrechung auftritt, und setzen Sie das Debuggen von dort fort.