2012-09-26 23 views
39

Czy można ustawić program Visual Studio, aby podczas debugowania aplikacji konsolowej używał niestandardowej konsoli?Używanie niestandardowej konsoli do debugowania aplikacji konsoli programu Visual Studio

Nie jestem pewien, jaka jest domyślna konsola, wygląda ona tak jak cmd.exe. Naprawdę chciałbym, aby moja aplikacja do konsoli działała w ConEmu podczas debugowania.

Aby było jasne, chcę kliknąć "Rozpocznij debugowanie" i proces powinien przebiegać dokładnie tak, jak zwykle, ale zamiast wywoływania konsoli cmd.exe powinien on wywołać konsolę ConEmu (lub cokolwiek innego).

Używam Visual Studio 2010 Pro

Ściśle związane z tym (bez odpowiedzi) Pytanie: Use Console2 for Visual Studio debugging?

+1

Podobny Q na superuser http://superuser.com/q/445394/139371 – Maximus

+0

metod podanych w odpowiedzi poniżej działają dobrze, jednak życzę Visual Studio miał wbudowaną obsługę wyboru osoby trzeciej konsoli Emulator do wyświetlania wszystkich danych wyjściowych aplikacji konsoli. (Nadal nie jestem pewien, czy otrzymuję tu moją terminologię, @Maximus! :-)) –

+0

tak, ConEmu ... – Anubis

Odpowiedz

34

pan mieszać pojęć. "Windows Console" nie jest "cmd.exe", ale specjalną "usługą", która zaimplementowała, na przykład Win7, z "conhost.exe".

Po uruchomieniu dowolnej aplikacji konsolowej (nie ma znaczenia cmd, powershell lub własna aplikacja), Windows uruchamia ją w specjalnym środowisku, które może mieć widoczne okno konsoli. Ale zawsze jest to wewnętrzna konsola systemu Windows.

Ale! Emulatory konsoli mogą przechwytywać to okno, ukrywać prawdziwą konsolę i wyświetlać własną emulowaną powierzchnię. Na przykład możesz uruchomić ConEmu za pomocą specjalnych przełączników (opisanych w SU, link w komentarzu) i gotowe.

wymiana Fabryczna

ConEmu posiada funkcję o nazwie Default Terminal. Jeśli włączysz tę funkcję, uzyskasz płynne uruchamianie aplikacji z Visual Studio w terminalu ConEmu. Pomysł polega na zahaczeniu CreateProcess w aplikacji źródłowej (explorer.exe, vcexpress.exe itd., Ogranicz je za pomocą | w ustawieniach). Przeczytaj więcej o tej funkcji w project wiki.

Możesz użyć istniejącej instancji ConEmu lub uruchomić nowe okno dla swojej aplikacji. ConEmu może wyświetlić komunikat Press Enter or Esc to close console... na konsolecie po zamknięciu aplikacji (radio Always). Nie musisz już dodawać readline na końcu programu, aby zobaczyć wynik.

ConEmu DefTerm settings page

Zmiana kodu aplikacji

Bo to jest twój własny program, można dodać, na przykład, następujące wiersze na czele swojej funkcji main przykład

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# przykład

#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

Dzięki. Opcja 'Attach to' w ConEmu działa świetnie, jak opisano w linku do artykułu SuperUser, który skomentowałeś mój post. Nie byłem w stanie wypróbować tutaj dyrektywy preprocesora, ponieważ pracuję w języku C# i obecnie nie wiem, jak wdrożyć dyrektywę przewidzianą dla preprocesora C#. Dzięki za doskonałą aplikację! –

+0

Przykład kodu C# ... – Maximus

+0

Dzięki @Maximus. Jakie jest oczekiwane zachowanie przełącznika AUTOATTACH w tym scenariuszu? –

3

Kilka pomysłów:

  1. Wystarczy uruchomić program w ConEmu bezpośrednio, a następnie wybierz Dołącz do procesu z menu Debug w programie Visual Studio. Możesz dodać opóźnienie na początku programu, aby dać ci czas na dołączenie. Jest to trochę uciążliwe, jeśli trzeba to robić w kółko, ale często jest to przydatne w tego typu sytuacjach.

  2. Dodaj oświadczenie __debugbreak(); do początku swojego programu (może wewnątrz bloku #ifndef NDEBUG). Uruchom program bezpośrednio w ConEmu. Użyj funkcji JIT programu Visual Studio, aby nawiązać połączenie po trafieniu debugowania i kontynuuj debugowanie.

Powiązane problemy