मौजूदा कोड को डीबग करने की अपनी क्षमता को कैसे सुधारें [बंद]


29

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



2
उत्तरों के लिए मूल लेखक वॉटरबोर्ड।
जॉब

जवाबों:


32

कुछ भी मत मानो

यह अक्सर कहने के लिए आकर्षक है "ओह, मुझे पता है कि यह बिट कोड क्या कर रहा है, यह ठीक है"। ऐसा मत करो। हर धारणा का परीक्षण करें और हर चीज को ध्यान से देखें।


2
+1। पूर्ण रूप से। इस बात से चकित होने के लिए तैयार रहें कि कुछ सामान, आपने सोचा था कि आप जानते हैं, आप पर चालें चलेंगे।
१६

मेरे लिए काम करता है :)
सेटज़ामोरा

3
अन्य कोड को डीबग करना एक बहुत बड़ा समय नुक़सान है, उत्पादकता हत्यारा है, लेकिन यह है कि यह कैसे है। एकमात्र समय जब यह वास्तव में दूसरे के कीड़े को ठीक करने के लिए समझ में आता है जब वे छोड़ चुके होते हैं। मैं एक वरिष्ठ कोडर द्वारा कुछ उद्देश्यपूर्ण गंदे कोड से गुजर रहा है, तो समय पर प्रगति करने के लिए एक सवाल पूछना है, और मौजूदा कोड आधार सीखने पर अपने कौशल में सुधार करने के लिए एक व्याख्यान हो रहा है। माँ की प्रकृति का अध्ययन करने के विपरीत, मानव-कारण पेंच को हल करना शायद ही मजेदार है। कम से कम मुझे अपना जवाब मिल जाए। रिवर्स स्थिति नहीं होगी, क्योंकि मैं सिर्फ बेहतर हूं और कम कीड़े छोड़ता हूं।
जॉब

1
@ जोब: ... ठीक है? क्या आप इस टिप्पणी को पोस्ट पर छोड़ने का मतलब, शायद? :)
एडम लेअर

यह! यदि आप एक अजीब मुद्दे पर बहस कर रहे हैं और कोड ठीक लगता है तो अपने कोड के किसी भी छोटे बिट पर आँख बंद करके भरोसा करना मूर्खतापूर्ण है।
दान

7

वृद्धिशील परीक्षण

अपने कोड में पहले गहराई में जाएं और धीरे-धीरे ऊपर बढ़ते हुए छोटे मॉड्यूल से इसका परीक्षण करें। इस तरह, आप बहुत अधिक तनाव में नहीं हैं कि यह पता लगाने की कोशिश करें कि समस्या वास्तव में कहां हो सकती है।

इसका मतलब यह भी है कि यह एक बार में कम कोड को प्रभावित करता है क्योंकि आप कई बार बढ़ रहे हैं। कभी-कभी मेरे पास ऐसे मुद्दे हैं जहां मैंने कुछ तय किया है और इससे बहुत सारे सामान टूटने लगे हैं। मैं इसके लिए अपने बॉस को श्रेय देता हूं क्योंकि जब उन्होंने मुझे गड़बड़ किया तो उन्होंने मुझे यह सिखाया।


4

फूट डालो और जीतो एक अच्छा दृष्टिकोण है। कुछ दृश्यमान इनपुट (उपयोगकर्ता इनपुट / नेटवर्क ईवेंट ...) और आउटपुट (लॉग, उपयोगकर्ता को आउटपुट, आउटबाउंड नेटवर्क संदेश ...) की पहचान करने का प्रयास करें, जिसके बीच समस्या मौजूद है। उन दोनों के बीच बड़े आकार के चक्रों या महत्वपूर्ण बिंदुओं पर प्रिंट डालने की कोशिश करें और जहां कोड में बग है, उसे संकीर्ण करने का प्रयास करें।

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


4

बाइनरी बग चॉप के बजाय, फॉर्म में परीक्षण लिखें

  • दिया हुआ...
  • कब...
  • उम्मीद ...

यह सत्यापित करने के लिए कि आप वास्तव में ऐप के कामकाज के बारे में क्या जानते हैं बनाम क्या आप सच मानते हैं।

अधिकांश IDE तरीकों को निकालने और xUnit परीक्षण स्टब्स को उत्पन्न करना आसान बनाते हैं। उस का उपयोग करें।

क्यों नहीं छिड़कते डेब्यू? क्योंकि आपके द्वारा किए जाने के बाद, आपको संभवतः उस कार्य को पूर्ववत करना होगा और उन डिबग की उचित मात्रा को हटाना होगा। जब आप परीक्षण लिखते हैं, तो आपका डिबगिंग भविष्य के कीड़े की रोकथाम और पता लगाने में सहायता करेगा।


2

डिबगिंग रखें। यदि आप बहुत डिबग करते हैं, तो आप सुधार करेंगे।


पूरी तरह से डिबगिंग अपने आप में कला है, विशेष रूप से अन्य लोगों के कोड को डीबग करना।
20

2

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

डिबगिंग की वास्तविक प्रक्रिया के लिए:

  • यदि वे पहले से मौजूद नहीं हैं तो यूनिट टेस्ट लिखें।
  • यदि पहले से मौजूद नहीं है तो उचित लॉगिंग जोड़ें।
  • फिर डिबगिंग का उपयोग करें।

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


1

कोड के एक छोटे से टुकड़े पर कदम रखने से पहले, देखें कि क्या आप सटीक रूप से परिणाम निर्धारित कर सकते हैं। यह कुछ भी नहीं मानने के चेहरे पर उड़ान भरने की प्रवृत्ति है (जो मैंने बीटीडब्ल्यू को वोट दिया) लेकिन जैसा कि आप अनुभव प्राप्त करते हैं, यह संकीर्ण रूप से देखने में मदद कर सकता है।

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

यदि आप डिबगिंग करते समय कोड को संशोधित कर सकते हैं:

  • पूर्व और बाद की स्थितियों पर विचार करना। कभी-कभी आप कोड के बजाय फिर से कदम बढ़ा सकते हैं।
  • यदि जटिल अभिव्यक्तियों के साथ कथन हैं, तो कुछ पर विचार करें (कुछ इस पर विचार कर सकते हैं लेकिन यह मेरे लिए काम करता है)

पसंद:

bool isLessThan5 = a < 5;
bool isGreaterThan10 = a > 10;
if ( isLessThan5 || isGreaterThan10 )
{
   // more code here
}

के बजाय:

if ( a < 5 || a > 10 )
{
   // more code here
}

जिन मामलों के लिए आप सब कुछ डिबग नहीं कर सकते हैं, जो भी कारण हो, सह-कार्यकर्ता के साथ "रबर-डक" सीखें। कभी-कभी समझाने की क्रिया प्रकाश डालती है। (ठीक है, शायद यह प्रश्न विषय में बिल्कुल नहीं है, लेकिन मुझे लगता है कि यह वारंट उल्लेख के काफी करीब है)


1
अवचेतन के नामकरण को एक और कदम की आवश्यकता होती है, अर्थात् जब आप यह पता लगाते हैं कि हालत क्या है। यह तब हो सकता है if (tooCloseToHydrant || overTheBrink) { जब आप अधिक बाद में सीखेंगे।

1

पिछले 22 वर्षों के अधिकांश खर्चों पर आधारित दो बातें, जो अन्य लोगों द्वारा लिखे गए कोड को बनाए रखती हैं।

आप जिस प्रकार के कीड़े लिखते हैं, उसे समझें।

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

यह मत समझो कि अन्य लोग उसी प्रकार के कीड़े लिखते हैं जो आप करते हैं।

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


क्या आप यह देखने के लिए कोड सुधारते हैं कि क्या कुछ भी घूमता है?

@ Thorbjørn: अगर मैंने कोड का स्वामित्व ले लिया है, तो मैं कभी-कभी इसे पठनीयता में सुधार के लिए करता हूं, लेकिन टाइपो को खोजने के लिए नहीं। दिलचस्प विचार!
बॉब मर्फी

आपको यह करने की ज़रूरत नहीं है, बस देखें कि क्या होता है। मैं दृढ़ता से एक

@ Thorbjørn: मुझे ऐसा करना अच्छा लगेगा। आप एक कोड "प्रेटीफ़ायर" के रूप में क्या सलाह देते हैं? मैं ज्यादातर लिनक्स और मैक पर काम करता हूं।
बॉब मर्फी

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

1

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

पुस्तकों को पढ़ना या अपने डिबगर का उपयोग करने के बारे में एक कक्षा लेना अत्यधिक अनुशंसित है। मैंने कुछ कक्षाओं को लिया और जॉन रॉबिंस की कुछ पुस्तकों को पढ़ा, जिन्होंने डिबगर के रूप में मेरी प्रभावशीलता में बड़ा बदलाव किया।


0

कार्यात्मक रूप से समझें कि कोड क्या करने की कोशिश कर रहा है। यदि आपको पूरी तस्वीर नहीं पता है (सभी परीक्षण मामलों को यह कोड पास करना होगा) तो नए बग को पेश किए बिना इसे ठीक से डिबग करना मुश्किल है


0

स्वचालित इकाई परीक्षण और अन्य प्रकार के एकीकरण और कार्यात्मक परीक्षण लिखें।

आपके पास जितने अधिक स्वचालित परीक्षण होंगे, उतना ही कम समय आपको डिबगर में बिताना होगा।

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

मुझे लगता है कि अच्छी तरह से डिज़ाइन किया गया कोड उन कोडों का एक अलग सेट तैयार करता है जो कोड अच्छी तरह से डिज़ाइन नहीं किए गए हैं। आम तौर पर बोलना, अच्छी तरह से डिज़ाइन किया गया कोड ऐसे कीड़े पैदा करता है जो खोजने, पुन: पेश करने और ठीक करने में आसान होते हैं।

अपवाद (और वहाँ हमेशा एक है) कोड multithreading है :-)


0

यदि आपने इसे एक छोटे से क्षेत्र में सीमित कर दिया है, लेकिन फिर भी त्रुटि नहीं हो सकती है, तो अपने प्रतिद्वंद्वी के 'कोड देखें + असेंबली' विकल्प का प्रयास करें। यह कहने के लिए पर्याप्त ASM जानने के लिए "यहां एक शाखा होनी चाहिए" या "यह केवल कम शब्द की नकल क्यों है?" अक्सर कोडिंग त्रुटि को इंगित करेगा।


0

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

पुस्तक के लिए स्लाइड ऑनलाइन उपलब्ध हैं, लेकिन मुझे लगता है कि पुस्तक स्वयं पढ़ना आसान है।

पुस्तक आपको आरंभ करने में मदद करेगी और आपको डिबगिंग के बारे में अधिक वैज्ञानिक रूप से सोचने में मदद करेगी, लेकिन यह अभ्यास का कोई विकल्प नहीं है। आपके प्रदर्शन में परिमाण में सुधार के क्रम को देखने से पहले आपको 10 वर्षों के लिए लेखन और डिबगिंग की आवश्यकता हो सकती है। मुझे अब भी याद है कि सीनियर डेवलपर्स को देखकर रवि पर मेरा जबड़ा गिर गया था, जो 30 साल से यूनिक्स के लिए प्रोग्रामिंग कर रहे थे, मिनटों में अस्पष्ट मल्टीथ्रेडिंग या समानांतर बग ढूंढते हैं। अनुभव मायने रखता है!


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