c# डीबगिंग के लिए सर्वोत्तम अभ्यास




.net debugging (13)

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

मेरा दृष्टिकोण इस तरह कुछ चला जाता है

  • समस्या को पुन: उत्पन्न करें आदर्श रूप से यथासंभव इनपुट कम करें।

  • जांचें क्या गलत हो जाता है और जहां बग हो सकता है उसके लिए सिद्धांतों को सूचीबद्ध करें।

  • कोड के विशिष्ट क्षेत्र को डीबग करके एक समय में एक सिद्धांत की जांच करें।

आवश्यकतानुसार चरण दोहराएं

जटिल डिबगिंग समस्याओं के लिए मैं अक्सर सहकर्मी के साथ काम करता हूं WinDbg के लिए यह विशेष रूप से उपयोगी है

डीबगिंग के लिए कोई अन्य उपयोगी टिप्स या श्रेष्ठ अभ्यास?


मैंने एक और पोस्ट में फिर से दोहराया, सवाल सी डीबगिंग था लेकिन जैसा कि मैंने अपने पुनरावृत्ति में कहा था मुझे लगता है कि डीबगिंग तकनीक भाषा स्वतंत्र हैं


सी # या वीबी। नेट जैसी भाषा के साथ वी.एस.नेट में डिबगर के प्रवेश के लिए बाधाएं इतनी हास्यास्पद रूप से कम होती हैं कि ब्रेकपॉइंट या दो को सम्मिलित करना अक्सर आसान होता है, जहां आप जानते हैं कि समस्या है और सिर्फ इसके माध्यम से कदम है।

कभी-कभी मैं खुद को कोड लिखने के लिए संपादित और जारी रखने का उपयोग करता हूं। यह बहुत अच्छा है। आप तुरंत परिणाम देख सकते हैं अक्सर यह सबसे उपयोगी होता है जब कुछ एल्गोरिथम या लूप समझने के लिए अपेक्षाकृत मुश्किल है।


जैसा कि एक और पोस्टर कहते हैं, कुछ कठोर सोच के साथ, यदि आप समझते हैं कि क्या हो रहा है तो तर्क तर्क को देखना अक्सर संभव होता है।

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

समस्या का पुनरुत्पादन निश्चित रूप से एक महत्वपूर्ण पहला कदम है। यदि आप ऐसा नहीं कर सकते हैं, तो आप दुर्घटना को छोड़कर, समस्या को खोजने की कोई संभावना नहीं खड़े हैं।

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

जब तक आप नहीं जानते कि कोड कहाँ जा रहा है, दुनिया के सभी सिद्धांतों के बारे में जहां बग बेकार हो सकता है और यदि कोड जटिल है, तो यह पता लगाया जा सकता है कि कोड ब्रेकपॉइंट पर नहीं रोकता है, यह जानकारीपूर्ण हो सकता है क्योंकि इसे रोकना है

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

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

तो मेरा 'सबसे अच्छा अभ्यास' आगे बढ़ने के लिए नहीं है जब तक मुझे यकीन नहीं हो रहा है कि मैं समझता हूँ, और अनुमान न करें।


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

यह आमतौर पर मुझे एक अच्छा विचार देता है कि मेरा आरंभिक डिबगिंग प्रयासों को ध्यान केंद्रित करने के लिए कहां

साथ ही, मैं इसे कॉन्फ़िग फाइल स्विच का उपयोग कर / बंद कर सकता / सकती हूं, इसलिए कोड को पुनः कंपाइल किए बिना मैं उत्पादन प्रणाली पर एक संकेत भी प्राप्त कर सकता हूं।


डीबगिंग से सीधे संबंधित नहीं, लेकिन भविष्य में डीबगिंग को आसान बनाने के लिए, कुछ बातों पर विचार करना है:

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

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


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

संयोगवश यह एक ऐसा कारण है कि मैं आईआईएस के माध्यम से अब वीसीए वेबैप प्रोजेक्ट चला रहा हूं।


एक अच्छा अभ्यास यह सुनिश्चित करना है कि आप एक लक्षण तय नहीं कर रहे हैं, लेकिन कारण

अक्सर, किसी को यह जाँचने के बिना कि वहां किस स्थान पर पहली जगह मिलनी चाहिए, बिना डिबगिंग और उसे ठीक कर लेते समय एक अजीब मूल्य दिखाई दे सकता है। यह निश्चित रूप से, बहुत बुरा विचार है

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


मैं एक समान धागा पर अपने जवाब की व्याख्या करूंगा (जो जोजफ में अंतिम बुलेट बिंदु है। फरर्स इस धागे के जवाब ):

अपने संस्करण नियंत्रण प्रणाली का उपयोग करते हुए, फ़ाइल संशोधन को अलग करें जहां बग को पेश किया गया था, द्विआधारी खोज वृक्ष दृष्टिकोण का उपयोग कर।

पिछले संशोधन के खिलाफ स्रोत फ़ाइल का संशोधन अंतर बग के कारण स्पष्ट हो सकता है


कुछ ऐसा करने में मदद करता है, खासकर जब आप डिबगिंग के लिए नए हों, तो किसी तरह के डिबगिंग पत्रिका को रखना है, जो आपके द्वारा समस्याओं को हल करने के लिए है अधिकांश बग अपेक्षाकृत आम पैटर्न का पालन करता है (उदाहरण के लिए, गैर-थ्रेडेड अनुप्रयोगों में जाहिरा तौर पर यादृच्छिक समस्याएं आमतौर पर अपरिभाषित चर के कारण होती हैं, या बिना प्रारंभिक मेमोरी के समान उपयोग) और उन नमूनों का ट्रैक रखते हुए, आप भविष्य की समस्याएं

थोड़ी देर के बाद, आप आवश्यक अंतर्ज्ञान विकसित कर सकते हैं (और फिर आपकी जर्नल आप पर विजय प्राप्त की गई सभी गंदे दुश्मनों की एक बहुत मजेदार स्मृति बन गई है)


मुझे यकीन नहीं है कि मैं "रबर बतख डीबगिंग" के बारे में कहां पढ़ता हूं, लेकिन मुझे लगता है कि इसके महान। मूल विचार आपके डेस्क पर एक रबड़ बतख सेट करना है और इसे कोड को समझाता है। विचार यह है कि जब आप बतख को कोड समझाते हैं, तो आप अंततः अपने आप को "अब, ऐसा होता है" कहकर मिलेंगे, और आप देखेंगे कि यह 'ऐसा नहीं है कि आप क्या हो रहा है

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

[संपादित करें] मुझे पता चला कि मैं रबर बतख रबड़ बतख डीबगिंग के बारे में कहां पढ़ता हूं


यह पुस्तक ईमानदारी से सबसे अच्छा है मैंने डिबगिंग के बारे में पढ़ा है, खासकर जब आप सामान्य डीबगिंग स्थिति से परे हैं इसमें कई सारी चीजें हैं और सभी "सच्ची कहानी" के साथ पढ़ने में मजेदार है यदि आप बड़ी मात्रा में कोड के साथ काम कर रहे हैं, जिसे आपने खुद नहीं लिखा है, खासकर यदि यह गंदे है, तो यह किताब आवश्यक है!

http://www.amazon.com/Debugging-Applications-Microsoft%C2%AE-Microsoft-Pro-Developer/dp/0735615365/ref=sr_1_1?ie=UTF8&s=books&qid=1238705836&sr=1-1

वैकल्पिक पाठ http://ecx.images-amazon.com/images/I/51RQ146x9VL._SS500_.jpg


यह कोई तकनीकी संकेत नहीं है, लेकिन यह अक्सर मेरे मामले में काम करता है।

किसी मूल कारण को ढूंढने या बग को ठीक करने के लिए कड़ी मेहनत करना बंद करो थोड़ी देर के लिए आराम करें: एक पैदल चलना, रात का खाना खाना या बस किसी अन्य कार्य पर स्विच करें (उम्मीद है कि बहुत आसान है) - आप जो भी चाहें ...

... फिर थोड़ा बाद में एक समस्या के बारे में सोचो, जब आप फिर से "ताजा" होते हैं डिबगिंग की सभी मानसिक प्रक्रिया का पता लगाओ, जो आपने पहले से ही चला (सिद्धांत, प्रयोग, धारणाएं आदि जो आपने बनाई थी)। संभावना है कि आप तुरन्त कुछ प्रमुख कारक देखेंगे जिन्हें आपने पहले अनदेखी की थी;)

प्रोग्रामर (या कम से कम मुझे) धीरे-धीरे समस्या के अपने परिप्रेक्ष्य को कम करते हैं और एक लंबे डिबगिंग सत्र के दौरान रचनात्मकता को बंद करते हैं। लेकिन रचनात्मक विचारों के साथ मिलकर व्यापक परिप्रेक्ष्य बग के साथ युद्ध में मनुष्य का सबसे शक्तिशाली हथियार है!





debugging