39

È possibile impostare Visual Studio per l'utilizzo di una console non standard durante il debug di un'applicazione console?Utilizzare console personalizzata per il debug dell'applicazione di Visual Studio Console

Non sono sicuro di quale sia la console di default, assomiglia allo cmd.exe. Mi piacerebbe davvero che la mia Applicazione Console girasse in ConEmu quando eseguo il debug.

Per essere chiari, voglio fare clic su "Avvia debug" e il processo dovrebbe accadere esattamente come al solito, ma invece di far apparire una console , dovrebbe far apparire una console ConEmu (o qualsiasi altra cosa).

sto usando Visual Studio 2010 Pro

Strettamente legata a questa domanda (senza risposta): Use Console2 for Visual Studio debugging?

+1

Q simile su SuperUser http://superuser.com/q/445394/139371 – Maximus

+0

I metodi riportati nella risposta qui sotto funzionano bene, però, vorrei che Visual Studio ha il supporto incorporato per la scelta di un soggetto terzo Console Emulatore per la visualizzazione di tutte le uscite dell'applicazione della console. (Non sono ancora sicuro se sto prendendo la mia terminologia qui, @Maximus! :-)) –

+0

sì, ConEmu ... – Anubis

risposta

34

Hai mescolano termini. La "Console di Windows" non è un "cmd.exe", ma un "servizio" speciale che ha implementato, ad esempio, Win7, con "conhost.exe".

All'avvio di qualsiasi applicazione di console (non importa cmd, PowerShell o la propria app) Windows lo avvia in un ambiente speciale, che potrebbe avere una finestra della console visibile. Ma è sempre la console interna di Windows.

Ma! Gli emulatori della console possono afferrare questa finestra, nascondere la console reale e visualizzare la propria superficie emulata. Ad esempio, è possibile avviare ConEmu con interruttori speciali (descritti in SU, collegamento nel commento) ed è fatto.

sostituzione terminale predefinito

ConEmu ha una funzionalità denominata Default Terminal. Se attivi questa funzione, avvierai senza problemi l'avvio dell'applicazione da Visual Studio nel terminale ConEmu. L'idea è di agganciare CreateProcess nell'applicazione di origine (explorer.exe, vcexpress.exe e così via, delimitarli con | nelle impostazioni). Maggiori informazioni su questa funzione nel project wiki.

È possibile scegliere di utilizzare l'istanza di ConEmu esistente o di eseguire una nuova finestra per l'applicazione. E ConEmu può mostrare il messaggio Press Enter or Esc to close console... sulla console dopo che l'applicazione è stata chiusa (la radio Always). Non è più necessario aggiungere readline alla fine del programma per vedere l'output.

ConEmu DefTerm settings page

cambiare il vostro codice di applicazione

Perché è il proprio programma, è possibile aggiungere, ad esempio, seguendo le linee alla testa della vostra funzione main

C++ esempio

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

#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

Grazie. L'opzione 'Allega a' in ConEmu funziona alla grande, come descritto nel collegamento all'articolo SuperUser che hai commentato sul mio post. Non sono stato in grado di provare la direttiva pre-processore che fornisci qui, dato che sto lavorando in C# e attualmente non so come implementare la direttiva che hai fornito per il preprocessore C#. Grazie per un'ottima applicazione! –

+0

Esempio di codice C# ... – Maximus

+0

Grazie a @Maximus. Qual è il comportamento previsto dello switch AUTOATTACH in questo scenario? –

3

Alcune idee:

  1. è sufficiente avviare il programma in ConEmu direttamente, e quindi scegliere Connetti a processo dal menu Debug in Visual Studio. Puoi aggiungere un ritardo all'inizio del tuo programma per darti il ​​tempo di allegare. Questo è un po 'un problema se devi farlo più e più volte, ma è spesso utile per questo tipo di situazione.

  2. Aggiungere una dichiarazione __debugbreak(); all'inizio del programma (forse all'interno di un blocco #ifndef NDEBUG). Avvia il tuo programma direttamente da ConEmu. Utilizzare la funzionalità JIT di Visual Studio per connettersi quando si verifica l'interruzione di debug e continuare il debug da lì.