मैं Visual Studio को ऐसी प्रक्रिया से कैसे जोड़ूँ जो अभी शुरू नहीं हुई है?


89

मेरे पास .NET प्रोग्राम है जो कुछ कारणों से Visual Studio से नहीं चलाया जा सकता है (Excel 2010 टेम्पलेट प्रोजेक्ट से बनाई गई एक्सेल फ़ाइल) जिसके लिए मुझे स्टार्टअप ईवेंट को डीबग करना होगा।

अगर मुझे प्रोग्राम इनिशियलाइज़ेशन के बाद आने वाली घटनाओं को डीबग करना है तो कोई समस्या नहीं है। मैं एक्सप्लोरर से प्रोग्राम चलाता हूं, विजुअल स्टूडियो को प्रक्रिया संलग्न करता हूं और कोड में कुछ ब्रेकप्वाइंट जोड़ता हूं। लेकिन यहां, मुझे स्टार्टअप घटनाओं पर ब्रेकप्वाइंट लगाने की आवश्यकता है। मुझे विजुअल स्टूडियो में प्रक्रियाओं को संलग्न करने में सक्षम होने की आवश्यकता है, न कि एक पीआईडी ​​पर निर्भर करते हुए, लेकिन एक विशिष्ट प्रक्रिया के नाम पर या जो भी अन्य समाधान काम करेगा।

बेशक Thread.Sleep(1000), मेरे स्टार्टअप इवेंट्स में जोड़ने के लिए मुझे विजुअल स्टूडियो में प्रक्रिया को संलग्न करने के लिए कुछ समय देना प्रश्न से बाहर है!

जवाबों:


97

वास्तव में आप कर सकते हैं; आप इसे संलग्न नहीं करते हैं, आप इसे शुरू करते हैं। अपने प्रोजेक्ट के गुणों पर, डीबगिंग टैब पर, उस प्रोग्राम का पथ निर्दिष्ट करें जिसे आप "कमांड" टेक्स्टबॉक्स में संलग्न करना चाहते हैं।

आप "कमांड आर्ग्यूमेंट्स" बॉक्स में प्रोग्राम के लिए कोई भी कमांड-लाइन तर्क दर्ज कर सकते हैं:

यहाँ छवि विवरण दर्ज करें

सुनिश्चित करें कि "अटैच" "नहीं" पर सेट है।


6
अच्छा समाधान, लेकिन बस ध्यान दें कि F5 मारना इस मामले में काम नहीं करता है। इसके बजाय संबंधित प्रोजेक्ट को राइट-क्लिक करें और संदर्भ मेनू से 'डीबग> नई शुरुआत करें' पर क्लिक करें।
हरमन कॉर्डेस

1
F5 को काम करने के लिए, आपकी परियोजना को समाधान में प्रारंभिक परियोजना होना चाहिए। ऐसा करने के लिए, समाधान एक्सप्लोरर में प्रोजेक्ट पर राइट क्लिक करें और "स्टार्टअप प्रोजेक्ट के रूप में सेट करें" चुनें।
टिब्बी

1
इसके अलावा अगर आपके कार्यक्रम में कुछ बाहरी निर्भरताएँ हैं, तो आपको "वर्किंग डायरेक्टरी" को भी बदलना होगा।
प्रियांक

"मूल कोड डीबगिंग सक्षम करें" (प्रोजेक्ट गुण → डीबगएनेबल डीबगर्स ) की जांच करना आवश्यक हो सकता है ।
पीटर मोर्टेंसन

और आप 40 परियोजनाओं के साथ संपूर्ण समाधान के लिए यह कैसे करते हैं?
टोनी टैनस

23

मैं एक बाह्य रूप से प्रायोजित प्रक्रिया में C ++ प्लगइन डिबगिंग कर रहा था जो स्टार्टअप पर एक अपवाद फेंक कर दुर्घटनाग्रस्त हो गया और यह मेरे लिए पूरी तरह से काम कर रहा है:

विज़ुअल स्टूडियो के लिए मुफ्त रिटैट एक्सटेंशन जोड़ें । लॉन्च होने से पहले इसे प्रक्रिया के नाम पर रीटच करने के लिए कहें। यह एक मोडल संवाद को पॉप करेगा और यह कहेगा कि यह प्रक्रिया के नाम के लॉन्च होने की प्रतीक्षा कर रहा है।

अब प्रक्रिया शुरू करें और विज़ुअल स्टूडियो डीबगर तुरंत अपवादों को पकड़ लेगा, और ब्रेकपॉइंट को मार देगा।


एक हज़ार बार हाँ!
इसका विच्छेदनजोन

मुझे एक गतिरोध मिला। जब मेरा लक्ष्य लॉन्च किया गया था, तब इसने व्यवस्थापक स्थिति का अनुरोध किया था, और pwd टाइप करने और बनाम फिर से शुरू करने के बाद, रिटटच चला गया था। केवल विरुद्ध व्यवस्थापक के बिना ही रीटच शामिल है।
एरिक

2
मेरे लिए काम नहीं करता है। यह अभी भी बहुत देर से रास्ता देता है, दुर्घटना के बाद पहले से ही हुआ। यह प्रत्येक सेकंड में एक बार मौजूदा प्रक्रियाओं की जांच करने लगता है, जो इस एप्लिकेशन के लिए पूरी तरह से बेकार है।
रीव २

20

यदि आपके पास Visual Studio 2017-2019 है, तो इन चरणों का पालन करें:

  1. फ़ाइल> ओपन> प्रोजेक्ट / समाधान
  2. अपना .exe चुनें
  3. डीबग> डीबग करना प्रारंभ करें

अन्य सुझावों की तुलना में बहुत आसान है: आपको परियोजना गुणों के साथ गड़बड़ करने की ज़रूरत नहीं है, और किसी एक्सटेंशन की आवश्यकता नहीं है।


लेकिन आपको विज़ुअल स्टूडियो को बताना होगा कि डिबगिंग प्रतीक कहाँ हैं, अगर यह उन्हें स्वचालित रूप से नहीं मिलता है
मैट थॉमस

1
5 सेकंड में करने में सक्षम आसान, मुझे यह पसंद है। धन्यवाद
कॉमरेडजोकूल

1
मेरा एक्सई लॉन्च किया गया था, लेकिन कोई भी ब्रेकपॉइंट सेट नहीं किया जा सका। मुझे क्या करना चाहिए?
एरिक

2
@ यदि मेरी टिप्पणी ऊपर दी गई है, तो मैं इसे एक टिप्पणी के बजाय एक SO प्रश्न के रूप में पूछने की सलाह नहीं देता। आपके मुद्दे को अधिक दृश्यता मिलेगी और आपको अपने विशिष्ट परिदृश्य को समझाने का मौका मिलेगा। फिर हमें बताएं कि आपको क्या पता है!
मैट थॉमस

11

मुझे यह जवाब तब मिला जब मैं कुछ इसी तरह की तलाश में था। मेरे मामले में, मैं बस अपनी परियोजना के स्टार्टअप कार्यक्रम के रूप में निष्पादन योग्य का उपयोग नहीं कर सकता था क्योंकि इसे एक बहुत विशिष्ट वातावरण में शुरू करने की आवश्यकता थी जिसे मैं आसानी से पुन: पेश नहीं कर सकता था (नाम: साइबरविन से शुरू)।

मैंने mrstrange द्वारा सुझाए गए Reattach Extension पर एक नज़र डाली और कुछ भी एक्सटेंशन के समान Attach To ... पर मेरे एक्जीक्यूटेबल को एक्सटेंशन के नोटिफ़िकेशन और अटैचमेंट के लिए बहुत जल्दी बंद करना प्रतीत होता था।

आखिरकार इससे मुझे क्या मदद मिली: https://stackoverflow.com/a/4042545/1560865 , जो MSDN लेख का संदर्भ देता है: कैसे करें: डीबगर को स्वचालित रूप से लॉन्च करें , जो इन-टर्न निम्न चरणों को सूचीबद्ध करता है:

  1. रजिस्ट्री संपादक (regedit) को प्रारंभ करें।
  2. रजिस्ट्री संपादक में, HKEY_LOCAL_MACHINE फ़ोल्डर खोलें।
  3. HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ छवि फ़ाइल निष्पादन विकल्पों पर नेविगेट करें।
  4. में छवि फ़ाइल निष्पादन विकल्प फ़ोल्डर, इस तरह के रूप में आवेदन आप डिबग करना चाहते हैं, का नाम ढूंढ़ें myapp.exe । यदि आपको वह एप्लिकेशन नहीं मिल रहा है जिसे आप डीबग करना चाहते हैं:
    a। छवि फ़ाइल निष्पादन विकल्प फ़ोल्डर पर राइट-क्लिक करें , और शॉर्टकट मेनू पर, नई कुंजी पर क्लिक करें ।
    ख। नई कुंजी पर राइट-क्लिक करें, और शॉर्टकट मेनू पर, नाम बदलें पर क्लिक करें । सी। अपने आवेदन के नाम के लिए प्रमुख नाम संपादित करें; इस उदाहरण में myapp.exe
  5. Myapp.exe फ़ोल्डर पर राइट-क्लिक करें , और शॉर्टकट मेनू पर, नया स्ट्रिंग मान पर क्लिक करें ।
  6. नया स्ट्रिंग मान राइट-क्लिक करें, और शॉर्टकट मेनू पर, नाम बदलें पर क्लिक करें।
  7. को नाम बदलें debugger
  8. नया स्ट्रिंग मान राइट-क्लिक करें, और शॉर्टकट मेनू पर, संशोधित करें पर क्लिक करेंसंपादित करें स्ट्रिंग संवाद बॉक्स प्रकट होता।
  9. में मान डेटा बॉक्स में, प्रकार vsjitdebugger.exe
  10. ओके पर क्लिक करें ।
  11. से रजिस्ट्री मेनू, क्लिक करें बाहर निकलें
  12. Vsjitdebugger.exe युक्त निर्देशिका आपके सिस्टम पथ में होनी चाहिए। इसे सिस्टम पथ में जोड़ने के लिए, इन चरणों का पालन करें:
    a। क्लासिक दृश्य में नियंत्रण कक्ष खोलें , और सिस्टम पर डबल-क्लिक करें ।
    ख। उन्नत सिस्टम सेटिंग्स पर क्लिक करें ।
    सी। में सिस्टम गुण , क्लिक करें उन्नत टैब।
    घ। पर उन्नत टैब पर क्लिक करें पर्यावरण चर
    इ। में पर्यावरण चर संवाद बॉक्स में, के अंतर्गत सिस्टम चर , चयन पथ , उसके बाद संपादित करें बटन।
    च। सिस्टम चर को संपादित करें मेंसंवाद बॉक्स, निर्देशिका को परिवर्तनीय मान बॉक्स में जोड़ें। सूची में अन्य प्रविष्टियों से इसे अलग करने के लिए एक अर्धविराम का उपयोग करें।
    जी। सिस्टम चर संपादन संवाद बॉक्स को बंद करने के लिए ठीक क्लिक करें
    एच। पर्यावरण चर डायलॉग बॉक्स को बंद करने के लिए ठीक क्लिक करें । मैं। सिस्टम गुण संवाद बॉक्स को बंद करने के लिए ठीक क्लिक करें ।
  13. अब, अपने आवेदन को शुरू करने के लिए किसी भी विधि का उपयोग करें। Visual Studio अनुप्रयोग को प्रारंभ और लोड करेगा।

आशा है कि यह भविष्य में किसी और की मदद करता है!


3
वीएस के नए संस्करणों (2019 तक) के साथ इसी प्रक्रिया के निर्देश यहां दिए गए हैं: docs.microsoft.com/en-us/visualstudio/debugger/…
brichins

3

यदि कोई प्रक्रिया नहीं है, तो विज़ुअल स्टूडियो इसे संलग्न नहीं कर सकता है।

हालाँकि, आप अपने प्रोजेक्ट के स्टार्टअप प्रोग्राम को अपने प्रोजेक्ट के आउटपुट के अलावा कुछ और सेट कर सकते हैं।


मैंने पहले ही जांच कर ली थी कि मैं जो करना चाहता हूं वह सही है, और वास्तव में यह है। मेरी स्थिति एक सामान्य दृश्य स्टूडियो डीबगिंग मामला नहीं है। मेरे पास एक एक्सेल 2010 टेम्पलेट प्रोजेक्ट विजुअल स्टूडियो में विकसित हुआ है और टेम्प्लेट शीट में स्टार्टअप इवेंट हैं। मैं इस टेम्पलेट को विजुअल स्टूडियो से चलाता हूं, अपनी एक्सेल शीट में कुछ डेटा जोड़ता हूं और डिस्क पर फाइल को सेव करता हूं। फिर एकमात्र तरीका मैं इस फाइल को खोल सकता हूं जो टेम्पलेट असेंबली पर भी निर्भर करता है, इसे एक्सप्लोरर से खोलना है, इसलिए मैं इस मामले में स्टार्टअप घटनाओं को डीबग नहीं कर सकता हूं और निश्चित रूप से मेरे पास डेटाबाइंडिंग जैसे स्टार्टअप पर कुछ डेटा प्रोसेसिंग है।
उकोदिया

"मूल कोड डीबगिंग सक्षम करें" (प्रोजेक्ट गुण → डीबगएनेबल डीबगर्स ) की जांच करना आवश्यक हो सकता है ।
पीटर मोर्टेंसन

3

आप एक संदेश बॉक्स दिखा सकते हैं, यह एप्लिकेशन को ब्लॉक कर देगा, फिर आप डिबगर को प्रक्रिया में संलग्न या रीटेट करेंगे और जारी रखने के लिए ठीक क्लिक करेंगे:

MessageBox.Show("Attach process to debugger and click ok!");

आप इसे फॉर्म कंस्ट्रक्टर में जोड़ सकते हैं (यदि आप विनफॉर्म का उपयोग करते हैं), तो यह घटकों के आरंभीकरण को छोड़कर, किसी और चीज से पहले निष्पादित किया जाएगा:

public MainForm()
{
    InitializeComponent();
    MessageBox.Show("Attach process to debugger and click ok!");
}

जब आप अपना डिबगिंग खत्म कर लें, तो उस लाइन पर टिप्पणी करें।


3

आप अपने कोड से डीबगर शुरू कर सकते हैं

public static void Main(string[] args)
{
  System.Diagnostics.Debugger.Launch();
}

लेकिन अपने आवेदन को शिपिंग करने से पहले इस लाइन को हटाने के लिए मत जाओ। शायद आप सुनिश्चित करने के लिए संकलक झंडे का उपयोग करना चाहते हैं:

    public static void Main(string[] args)
    {
      #if debug
      System.Diagnostics.Debugger.Launch();
      #endif
    }

2
यह उन सभी मामलों के लिए स्वीकृत उत्तर होना चाहिए जहां आप अपने आवेदन को लॉन्च करने के लिए किसी बाहरी प्रक्रिया की प्रतीक्षा कर रहे हैं।
यात्रा

2

एक छोटा सा उपाय जो कई लोगों को पसंद आ सकता है।

  • कोड की पहली पंक्ति में जो exe चलेगा, इस कमांड को जोड़ें

    System.Threading.Thread.Sleep (20000)

इससे पहले कि यह कुछ भी प्रसंस्करण शुरू होता है 20 सेकंड के लिए निर्वासन सो जाएगा। फिर आपके पास प्रक्रिया को संलग्न करने के लिए 20 सेकंड हैं, जो कि ctrl + alt + p के साथ जल्दी से किया जा सकता है, फिर प्रक्रिया ढूंढें, फिर संलग्न करने के लिए दर्ज करें।

ज्यादा जवाब नहीं लेकिन मेरे लिए एक इलाज का काम किया: -)


मुझे "C" में लिखे गए CGI को डिबग करना था जिसके लिए मेरे पास स्रोत कोड था। मैं पृष्ठभूमि प्रक्रिया से जुड़ने के लिए समय देने का एक सरल और आसान समाधान था।
जोएल हेचट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.