एक संदर्भित dll (pdb वाले) को कैसे डीबग करें


132

मेरे कार्यक्षेत्र में दो समाधान हैं, A और B कहते हैं।

समाधान ए एक पुरानी परियोजना है जिसे मैंने कुछ समय पहले कोडिंग समाप्त किया था। समाधान बी में, मुझे समाधान ए से कुछ वर्गों का उपयोग करने की आवश्यकता है। ऐसा करने के लिए, मैं ए में ट्रेडिंग परियोजनाओं में से एक के डीएल का संदर्भ जोड़ता हूं।

समस्या तब है जब मैं डिबग करने की कोशिश करता हूं। मैं ए के कोड में भी कदम रखने में सक्षम होना चाहता हूं। दृश्य स्टूडियो इन कक्षाओं के लिए कोड को लोड करने में सक्षम नहीं है ("वर्तमान स्थान के लिए कोई स्रोत कोड उपलब्ध नहीं है।") और मैं केवल डिस्सेक्शन को देख सकता हूं, जो उपयोगी नहीं है।

जिस तरह से मैं समाधान ए से कक्षाओं को डीबग करना जानता हूं वह समाधान बी को चलाने से है, सभी प्रक्रियाओं को अलग करें (डीबग मेनू आइटम में) और समाधान ए से प्रक्रिया को संलग्न करें।

हालांकि, यह बहुत असुविधाजनक है और मैं केवल एक बार में ए या बी को डिबग कर सकता हूं।

क्या संदर्भित डीएलएस के कोड में कदम रखने की अनुमति देने का एक तरीका है (जिसके लिए मेरे पास स्रोत कोड है)?


समाधान: मेरी गलती यह थी कि मैंने सोचा था कि एक परियोजना केवल एक समाधान का हिस्सा हो सकती है। वास्तव में, एक परियोजना किसी भी संख्या में समाधान का हिस्सा हो सकती है।
जब आपको पुरानी परियोजना को संदर्भित करने की आवश्यकता होती है, तो आपको बस परियोजना को समाधान में जोड़ना चाहिए। यह समाधान एक्सप्लोरर> जोड़ें> मौजूदा परियोजना में नए समाधान पर राइट क्लिक करके किया जाता है।
फिर, आप प्रोजेक्ट संदर्भ जोड़ पाएंगे। जैसा कि अन्य ने लिखा है, आपको संभवतः अपने स्वयं के कोड (या अन्य कोड जो आपको बदलने और डिबग करने की आवश्यकता हो सकती है) के dll संदर्भों का उपयोग करने से पूरी तरह से बचना चाहिए।

MSDN का समाधान कैसे किया जाना चाहिए इसका एक बहुत अच्छा संदर्भ ।


MSDN लिंक .net devs (स्रोत नियंत्रण का उपयोग किए बिना चाहे) के लिए पढ़ा जाना चाहिए। मुझे आश्चर्य है कि मैंने इसे पहले नहीं देखा था। धन्यवाद!
पैट

नए कामर्स, यदि आप पहले से ही परियोजना के संदर्भों के बारे में जानते हैं, और यह एक विकल्प नहीं है (जैसे आपको एक NuGet पैकेज डिबग करने की आवश्यकता है), तो स्वीकृत उत्तर को अनदेखा करें और सीधे इस एक पर जाएं: stackoverflow.com/a/26029208/393030
BrainSlugs83

जवाबों:


113

यदि आपके पास एक परियोजना संदर्भ है, तो इसे तुरंत काम करना चाहिए।

यदि यह एक फ़ाइल (dll) संदर्भ है, तो आपको डीबगिंग प्रतीकों ("pdb" फ़ाइल) को dll के समान फ़ोल्डर में होना चाहिए। जांचें कि आपकी परियोजनाएं डिबग प्रतीक (परियोजना गुण => बिल्ड => उन्नत => आउटपुट / डिबग इन्फो = पूर्ण) उत्पन्न कर रही हैं; और यदि आपने dll की प्रतिलिपि बनाई है , तो इसके साथ pdb डालें।

यदि आप किसी भी फाइल को कॉपी नहीं करना चाहते हैं, तो आप सीधे आईडीई में प्रतीकों को लोड कर सकते हैं, लेकिन यह अधिक काम है।

सबसे आसान विकल्प परियोजना संदर्भों का उपयोग करना है!


3
दुर्भाग्य से, मुझे लगता है कि किसी अन्य समाधान से परियोजना के लिए परियोजना संदर्भ जोड़ना संभव नहीं है (अगर मैं गलत हूं तो मुझे सही करें!)।
एलाड

7
@ एलाड मैंने अभी यह किया है। पहले समाधान के लिए "मौजूदा परियोजना" जोड़ें। फिर प्रोजेक्ट संदर्भ जोड़ें पर क्लिक करके प्रोजेक्ट का संदर्भ जोड़ें। आप मौजूदा प्रोजेक्ट फ़ाइलों में ब्रेकपॉइंट सेट कर सकते हैं। यह अच्छा है क्योंकि फाइलों को कॉपी नहीं किया जाता है।
user420667

3
मेरे पास परियोजना संदर्भ के रूप में DLL परियोजना है, लेकिन भीतर विराम बिंदु को अनदेखा किया जाता है।
स्लाव

1
मैं वास्तव में एक (रिलीज़-) असेंबली को डीबग करने में सक्षम था जिसे आज एक फ़ाइल संदर्भ के रूप में जोड़ा गया था। मेरे लिए अच्छा है, लेकिन यह कैसे हुआ? MSVC2010, C #, (ASP) .NET 4.0, संदर्भित असेंबली डिबग + रिलीज़ (लेकिन केवल रिलीज़-फ़ाइल प्रोजेक्ट में जोड़ी गई) के रूप में मौजूद है। वास्तव में इसे स्पष्ट करना चाहेंगे।
तोबियस 81१

1
मेरे लिए यह एक दिन काम कर रहा था, लेकिन फिर अगले दिन काम नहीं कर रहा था (DLL और PDB फ़ाइलें)। टूल्स> विकल्प> डिबगिंग> सिंबल पर "खाली प्रतीक कैश" बटन को दबाते हुए इसे ठीक किया।
पॉल

45

मेरी भी यही समस्या थी। वह वही है जो मैंने पाया:

1) सुनिश्चित करें कि सभी प्रोजेक्ट एक ही फ्रेमवर्क का उपयोग कर रहे हैं (यह महत्वपूर्ण है!)

2) टूल्स / ऑप्शंस> डिबगिंग> जनरल सुनिश्चित करें कि "जस्ट माई कोड सक्षम करें (केवल प्रबंधित) टिक नहीं है

3) टूल्स / ऑप्शन्स> डिबगिंग> सिंबल्स किसी भी कैश्ड सिंबल को क्लियर करते हैं, "सिंबल फाइल (.pdb) लोकेशन्स" लिस्टबॉक्स के अंतर्गत सभी फोल्डर लोकेशन को अनचेक कर देते हैं और डिफॉल्ट "माइक्रोसॉफ्ट सिंबल सर्वर्स" को छोड़कर लिस्टबॉक्स को डिलीट कर देते हैं लेकिन फिर भी इसे अनचेक कर देते हैं। "इस निर्देशिका में कैश प्रतीक" टेक्स्टबॉक्स में किसी भी स्थिर पथ को हटा दें। "खाली प्रतीक कैश" बटन पर क्लिक करें। अंत में सुनिश्चित करें कि "केवल निर्दिष्ट मॉड्यूल" रेडियो बटन टिक गया है।

4) बिल्ड / कॉन्फ़िगरेशन प्रबंधक मेनू में सभी परियोजनाओं के लिए सुनिश्चित करें कि कॉन्फ़िगरेशन डीबग मोड में है।


3
मेरी समस्या यह थी कि मेरी दो परियोजनाओं में अलग-अलग .Net फ्रेमवर्क का उपयोग किया गया था: 4.0 और 4.5। टीएक्स!
user627283

1) और 4) महत्वपूर्ण हैं। डिबग मोड में निर्माण और एक ही ढांचे का उपयोग करने के लिए मत भूलना।
scott_f

12

एक और बात ध्यान में रखें, सुनिश्चित करें कि संदर्भित dll GAC में स्थापित नहीं हैं। परीक्षण के बाद, मैंने सिस्टम स्तर के परीक्षण करने के लिए अपने dll को GAC में स्थापित किया। बाद में, जब मुझे अपने कोड को फिर से डिबग करना पड़ा, तो मैं संदर्भित विधानसभाओं में कदम नहीं रख सका जब तक कि मैंने उन्हें GAC से हटा नहीं दिया।


2
धन्यवाद! यह मेरा मुद्दा था। मुझे विश्वास नहीं हो रहा है कि मैंने यह पता नहीं लगाया: - / मैंने सोचा था कि परियोजना के संदर्भ को स्थापित करने से किसी तरह जीएसी में स्थापित किया गया था।
स्नूकर

पूर्ण रूप से! यह बहुत अच्छी बात है। भले ही आपके पास .NET फ्रेमवर्क का एक ही संस्करण हो, यदि आपके पास GAC में कोड है, जब आप डीबग करने का प्रयास करते हैं तो यह ब्रेकपॉइंट को हिट नहीं करेगा यदि GAC में .PDB फ़ाइल अलग है तो आपके प्रोजेक्ट फ़ोल्डर में एक है। इसके लिए एक समाधान DLL को Un-GAC करना, निर्माण करना, फिर असेंबली को फिर से GAC करना है।
DigiOz मल्टीमीडिया

7

चरण 1: उपकरण पर जाएं -> विकल्प -> डिबगिंग

चरण 2: बस मेरे कोड को अनचेक करें

चरण 3: अनचेक करें स्रोत फ़ाइल को मूल संस्करण के साथ बिल्कुल मेल खाना चाहिए

चरण 4: गुण और ऑपरेटरों पर चरण अनचेक करें


3

मेरे पास एक *.pdbही फ़ोल्डर में फाइलें थीं और अरिंदम से विकल्पों का उपयोग किया , लेकिन यह अभी भी काम नहीं किया। यह पता चलता है कि मुझे मूल कोड डीबगिंग सक्षम करने की आवश्यकता है जो प्रोजेक्ट गुण> डीबग के तहत मिल सकती है ।


1
इस जानकारी को स्वीकृत उत्तर में शामिल किया जाना चाहिए। इसकी मुझे विशेष रूप से तलाश थी। साझा करने के लिए धन्यवाद! +1
हेरिबेटो लुगो

2

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

आप डीबग -> विंडोज -> ब्रेकप्वाइंट के माध्यम से उपलब्ध ब्रेकप्वाइंट विंडो के माध्यम से अपने ब्रेकप्वाइंट की समीक्षा कर सकते हैं।

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


1
यह केवल तभी काम करता है जब बाहरी फ़ाइल जहां आपने ब्रेकपॉइंट रखा था, पीडीबी में सटीक पथ से मेल खाती है। (जैसे केवल काम करता है अगर आपने अपनी मशीन पर DLL का निर्माण किया है।)
जोश एम।

2

सुनिश्चित करें कि आपका डीएलएल जीएसी में पंजीकृत नहीं है। दृश्य स्टूडियो जीएसी में संस्करण का उपयोग करेगा और इसमें संभवतः कोई डीबगिंग जानकारी नहीं होगी।


1

मैं अपने कुछ समाधानों में एक बाहरी वर्ग की पुस्तकालय परियोजना को शामिल नहीं करना चाहता, इसलिए मैं विधानसभाओं में कदम रखता हूं जो मैं एक अलग तरीके से उपभोग करता हूं।

मेरे समाधान में एक "कॉमन असेंबली" निर्देशिका है जिसमें अन्य परियोजनाओं से मेरे स्वयं के DLL शामिल हैं। डीएलएल कि मैं संदर्भ भी डीबगिंग के लिए उनके साथ पीडीबी फ़ाइलों के साथ है।

डीबग करने और सेट करने के लिए, मैं उपभोग एप्लिकेशन के स्रोत में एक ब्रेकपॉइंट सेट करता हूं जहां मैं विधानसभा से एक विधि या कंस्ट्रक्टर को बुला रहा हूं और फिर INTO (F11) विधि / कंस्ट्रक्टर कॉल को चरणबद्ध करता हूं।

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

यह सीधे आगे नहीं है, लेकिन काम करता है अगर आप एक नया प्रोजेक्ट संदर्भ शामिल नहीं करना चाहते हैं और बस इसके बजाय एक साझा विधानसभा का संदर्भ लेना चाहते हैं।


0

यह काम करना होगा। मैं एक ही समय में .exe फ़ाइल और एक dll डीबग करता था! मेरा सुझाव 1 है) अपने B प्रोजेक्ट में dll का पथ शामिल करें, 2) फिर अपने A प्रोजेक्ट में डीबग करें। 3) नियंत्रण रखें कि पथ dll और de pdb फ़ाइल पर इंगित करता है .... 4) उसके बाद आप बी प्रोजेक्ट को डीबग करना प्रारंभ करें और यदि सब ठीक है, तो आप दोनों प्रोजेक्ट में डिबग कर पाएंगे!


0

एक बाहरी पुस्तकालय को डिबग करने के लिए विजुअलस्टडियो 2019 का उपयोग करते हुए मैंने जो सबसे आगे का रास्ता पाया, जिसे आप न्यूगेट में संदर्भित कर रहे हैं, निम्नलिखित कदम उठा रहा है:

  1. उपकरण> विकल्प> डिबगिंग> सामान्य> 'अभी मेरा कोड सक्षम करें' को अनटिक करें

  2. असेंबली एक्सप्लोरर पर जाएं> नुगेट पैकेज कैश से खोलें सामग्री सूचीबद्ध करें

  3. खोज क्षेत्र में डिबग करने के लिए इच्छित NuGet पैकेज नाम टाइप करें और 'ओके' पर क्लिक करें यहाँ छवि विवरण दर्ज करें

  4. असेंबली एक्सप्लोरर से, आयातित असेंबली पर राइट-क्लिक करें और 'जनरेट पीडीबी' चुनें यहाँ छवि विवरण दर्ज करें

  5. एक कस्टम पथ चुनें जहाँ आप .PDB फ़ाइल सहेजना चाहते हैं और जिस फ़्रेमवर्क के लिए आप इसे उत्पन्न करना चाहते हैं

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

  6. अपने डीबग फ़ोल्डर में उत्पन्न फ़ोल्डर से .PDB फ़ाइल की प्रतिलिपि बनाएँ और अब आप इस असेंबली के लाइब्रेरी कोड पर ब्रेकप्वाइंट सेट कर सकते हैं


अच्छा लगता है, इसके अलावा मुझे कोई असेंबली एक्सप्लोरर नहीं मिल सकता है; क्या यह रेस्पर का हिस्सा नहीं है?
रॉबर्ट मस्सा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.