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




.net debugging (11)

अगर एक टिप थी तो मैं डीबगिंग के बारे में हर किसी को दे सकता था, इसे फिर से तोड़ना होगा।

यही है, जब आपको लगता है कि आपको ठीक मिल गया है और सिस्टम काम करने लगता है। वापस बाहर निकालें और देखें कि क्या सिस्टम फिर से टूटता है

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

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

HTH।

चियर्स,

लूटना

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

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

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

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

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

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

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

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


आईएमओ बहुत अधिक समय की बर्बादी है। यदि आप कोडबेस को अच्छी तरह से जानते हैं, तो आप आम तौर पर कुछ महत्वपूर्ण जगहों पर सोच सकते हैं जहां समस्या सामने आती है। ब्रेक अंक रखो और देखें कि क्या आप सही हैं। जब भी आप बेहतर कुंजी बिंदु देखते हैं, समस्या के करीब पहुंचने के लिए अपने ब्रेकपॉइंट्स को स्थानांतरित करें।

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

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


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

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

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

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

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

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

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

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


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

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

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


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

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

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


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

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


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

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

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


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

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

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


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

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

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

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


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





debugging