2012-09-26 148 views
39

在調試控制檯應用程序時,可以將Visual Studio設置爲使用非標準控制檯嗎?使用Visual Studio Console應用程序調試的自定義控制檯

我不確定默認控制檯是什麼,它看起來就像cmd.exe。當我調試時,我真的很喜歡我的控制檯應用程序在ConEmu中運行。要清楚,我想單擊「開始調試」,該過程應該像往常一樣發生,但不是調出一個控制檯,它應該調出一個ConEmu控制檯(或其他)。

我使用Visual Studio 2010專業版

與此密切相關(解答)問題:Use Console2 for Visual Studio debugging?

+1

上的超級用戶類似Q http://superuser.com/q/445394/139371 – Maximus

+0

下面做工精細的答案給出的方法,但是,我希望Visual Studio中已經內置支持選擇第三方控制檯模擬器顯示所有控制檯應用程序輸出。 (仍然不知道,如果我在這裏得到我的術語,@Maximus!:-)) –

+0

是的,ConEmu ... – Anubis

回答

34

你混淆了條件。 「Windows控制檯」不是「cmd.exe」,而是特殊的「服務」,例如使用「conhost.exe」實現Win7。

當您啓動任何控制檯應用程序(沒關係CMD,PowerShell或您自己的應用程序)窗口啓動時,它在特殊的環境中,可能有明顯的控制檯窗口。但它始終是內部Windows控制檯。

但是!控制檯模擬器可以抓住這個窗口,隱藏真實的控制檯並顯示他們自己的模擬表面。 例如,您可以使用特殊開關啓動ConEmu(在SU上描述,在評論中鏈接)及其完成。

默認終端更換

ConEmu有一個名爲Default Terminal特徵。如果啓用此功能,您將可以在ConEmu終端的Visual Studio中無縫啓動您的應用程序。這個想法是在源應用程序中掛鉤CreateProcess(explorer.exevcexpress.exe等等,在設置中用|對它們進行分隔)。詳細瞭解project wiki中的該功能。

您可以選擇使用現有的ConEmu實例或爲您的應用程序運行新窗口。 ConEmu會在您的應用程序退出後(Always收音機)在控制檯上顯示Press Enter or Esc to close console...消息。無需在程序結束時添加readline以查看輸出。

ConEmu DefTerm settings page

改變你的應用程序代碼

因爲這是你自己的程序,您可以添加,例如,以下行頭你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 
+0

謝謝。正如您在我的文章中評論的超級用戶文章鏈接中所述,ConEmu中的「附加到」選項效果很好。我還沒有能夠嘗試你在這裏提供的預處理器指令,因爲我在C#中工作,而且我目前不知道如何實現你爲C#預處理器提供的指令。感謝您的出色應用! –

+0

C#代碼示例... – Maximus

+0

Thanks @Maximus。在這種情況下,AUTOATTACH交換機的預期行爲是什麼? –

3

一些想法:

  1. 在ConEmu只需啓動你的程序直接,然後選擇附加到從在Visual Studio調試菜單流程。您可以在程序的開始處添加延遲,以便您有時間進行附加。如果你必須一遍又一遍地做這些,這是一種痛苦,但對於這種情況通常很有用。

  2. __debugbreak();聲明添加到程序的開頭(可能位於#ifndef NDEBUG塊內)。直接從ConEmu開始你的程序。當調試中斷遇到時,使用Visual Studio的JIT功能進行連接,然後繼續從那裏調試。

相關問題