39

के लिए कस्टम कंसोल का उपयोग करें क्या कंसोल एप्लिकेशन को डीबग करते समय गैर-मानक कंसोल का उपयोग करने के लिए विजुअल स्टूडियो सेट करना संभव है?विजुअल स्टूडियो कंसोल अनुप्रयोग डिबगिंग

मुझे यकीन नहीं है कि डिफ़ॉल्ट कंसोल क्या है, यह cmd.exe जैसा दिखता है। जब मैं डीबग करता हूं तो मैं वास्तव में ConEmu में चलाने के लिए अपने कंसोल एप्लिकेशन से प्यार करता हूं।

स्पष्ट होने के लिए, मैं "डिबगिंग प्रारंभ करें" पर क्लिक करना चाहता हूं और प्रक्रिया सामान्य रूप से सामान्य होनी चाहिए, लेकिन cmd.exe कंसोल लाने की बजाय, इसे एक ConEmu कंसोल (या जो कुछ भी) लाया जाना चाहिए।

मैं दृश्य स्टूडियो का उपयोग कर रहा 2010 प्रो

बारीकी से इस (अनुत्तरित) प्रश्न से संबंधित: Use Console2 for Visual Studio debugging?

+1

SuperUser पर इसी प्रकार के क्यू http://superuser.com/q/445394/139371 – Maximus

+0

काम ठीक नीचे इस सवाल का जवाब में दी गई विधियों में, हालांकि, मैं चाहता हूँ दृश्य स्टूडियो एक तीसरी पार्टी को चुनने के लिए कंसोल में निर्मित समर्थन किया था सभी कंसोल अनुप्रयोग आउटपुट प्रदर्शित करने के लिए एमुलेटर। (अभी भी यह सुनिश्चित नहीं है कि मुझे यहां मेरी शब्दावली मिल रही है, @Maximus! :-)) –

+0

हाँ, ConEmu ... – Anubis

उत्तर

34

आप शर्तों अप मिश्रण है। "विंडोज कंसोल" एक "cmd.exe" नहीं है, लेकिन विशेष "सेवा" जो "conhost.exe" के साथ Win7 के उदाहरण के लिए कार्यान्वित किया गया है।

जब आप किसी भी कंसोल एप्लिकेशन (सीएमडी, पावरहेल, या अपने स्वयं के ऐप से कोई फर्क नहीं पड़ता) विंडोज़ इसे विशेष वातावरण में शुरू करता है, जिसमें दृश्य कंसोल विंडो हो सकती है। लेकिन यह हमेशा आंतरिक विंडोज कंसोल है।

लेकिन! कंसोल अनुकरणकर्ता इस खिड़की को पकड़ सकते हैं, असली कंसोल छुपा सकते हैं और अपनी खुद की नकली सतह प्रदर्शित कर सकते हैं। उदाहरण के लिए, आप विशेष स्विच के साथ ConEmu शुरू कर सकते हैं (एसयू पर वर्णित, टिप्पणी में लिंक) और इसके द्वारा किया गया।

डिफ़ॉल्ट टर्मिनल प्रतिस्थापन

ConEmu Default Terminal नामक एक सुविधा है। यदि आप इस सुविधा को सक्षम करते हैं तो आप ConEmu टर्मिनल में विजुअल स्टूडियो से अपना एप्लिकेशन शुरू कर देंगे। विचार स्रोत अनुप्रयोग में CreateProcess को हुक कर रहा है (explorer.exe, vcexpress.exe और इसी तरह, सेटिंग में | के साथ उन्हें सीमित करें)। project wiki में उस सुविधा के बारे में और पढ़ें।

आप मौजूदा ConEmu इंस्टेंस का उपयोग करने या अपने एप्लिकेशन के लिए नई विंडो चलाने के लिए चुन सकते हैं। और आपके आवेदन के बाद Conemu कंसोल पर Press Enter or Esc to close console... संदेश दिखा सकता है (Always रेडियो)। आउटपुट देखने के लिए अब अपने प्रोग्राम के अंत में readline जोड़ने की आवश्यकता नहीं है।

ConEmu DefTerm settings page

आपके आवेदन कोड

बदलने क्योंकि यह अपने स्वयं के कार्यक्रम है, आप उदाहरण के लिए, जोड़ने के लिए, अपने main समारोह

सी ++ उदाहरण के मुखिया के लाइनों निम्नलिखित सकता है

#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 

सी # उदाहरण

#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 में 'अटैच टू' विकल्प बहुत अच्छा काम करता है, जैसा कि सुपरयूसर लेख लिंक में वर्णित है, आपने मेरी पोस्ट पर टिप्पणी की थी। मैं आपके द्वारा प्रदान किए गए प्री-प्रोसेसर निर्देश का प्रयास करने में सक्षम नहीं हूं, क्योंकि मैं सी # में काम कर रहा हूं और मुझे वर्तमान में सी # प्रीप्रोसेसर के लिए प्रदान किए गए निर्देश को कार्यान्वित करने का तरीका नहीं पता है। एक उत्कृष्ट आवेदन के लिए धन्यवाद! –

+0

सी # कोड उदाहरण ... – Maximus

+0

धन्यवाद @ मैक्सिमस। इस परिदृश्य में ऑटोटैच स्विच का अपेक्षित व्यवहार क्या है? –

3

कुछ विचार:

  1. आप सीधे ConEmu में अपना कार्यक्रम शुरू, और फिर दृश्य स्टूडियो में डीबग मेनू से संसाधित करने संलग्न चुनें। आप संलग्न करने के लिए समय देने के लिए अपने कार्यक्रम की शुरुआत में देरी जोड़ सकते हैं। अगर आपको ऐसा करना पड़ता है तो यह दर्द होता है, लेकिन यह अक्सर इस तरह की स्थिति के लिए उपयोगी होता है।

  2. अपने प्रोग्राम की शुरुआत में शायद __debugbreak(); कथन जोड़ें (शायद #ifndef NDEBUG ब्लॉक के अंदर)। ConEmu से सीधे अपना प्रोग्राम शुरू करें। डीबग ब्रेक हिट करते समय कनेक्ट करने के लिए विजुअल स्टूडियो की जेआईटी सुविधा का उपयोग करें, और वहां से डीबगिंग जारी रखें।