डिबग कोड को हमेशा जगह में छोड़ दिया जाना चाहिए, या केवल डिबगिंग के दौरान जोड़ा जाना चाहिए और बग को हटा दिए जाने पर हटा दिया जाना चाहिए?


35

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

आप इसे कैसे करते हो? क्या आप डिबग कोड को जगह पर छोड़ देते हैं, या अप्रचलित होने पर इसे हटा देते हैं (जो कि जब हो तो उसे आंकना मुश्किल हो सकता है)?

जवाबों:


30

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


5
+1 प्राथमिक रूप से जगह में एक समझदार डिबगिंग ढांचे का उल्लेख करने के लिए। यदि यह शुरुआत में है, और विभिन्न डिबग स्तर हैं, तो उत्पादन कोड महंगी डिबग रूट को बुलाए बिना चल सकता है, और विकास कोड जो भी स्तर की जांच की आवश्यकता होती है, के साथ चल सकता है, उम्मीद है कि जो भी वांछित है उसमें लॉग इन किया जाए।
ओर्बलिंग

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

16

डिबगिंग के लिए विशेष रूप से जोड़ा गया कोड उत्पादन सॉफ्टवेयर से हटा दिया जाना चाहिए।

क्या यह पूर्ण निष्कासन है या सशर्त संकलन अनुभागों में डाला जा रहा है (जैसा कि C / C ++ / C # में) आपके और आपके कोडिंग मानक पर निर्भर है।

इसके कई कारण हैं:

  1. यदि इस कोड को निष्पादित किया जाता है या कोई इसका आउटपुट प्राप्त कर सकता है, तो सुरक्षा निहितार्थ हो सकते हैं।
  2. यह एप्लिकेशन को धीमा कर सकता है।
  3. यह अन्य डेवलपर्स के लिए भ्रामक हो सकता है जो लाइन में 6 महीने नीचे कोड (या वास्तव में खुद) देख रहे हैं।

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

1
मैंने उन वातावरणों में काम किया है जहाँ C / C ++ कोड को हमेशा डिबग विकल्प के साथ संकलित किया जाता था जब उत्पादन कोड को डीबग करने की आवश्यकता होती थी या एक coredump की जांच की जाती थी। कभी-कभी यह हमेशा डिबग करने के लिए तैयार होता है कि डिबग स्टेटमेंट को छोड़ दिया जाए ताकि वे कोड को फिर से देखे बिना एक झंडे के साथ चालू हो सकें। जावा हमेशा डिबगिंग की अनुमति देता है यदि आपके जेवीएम विकल्प इसके लिए निर्धारित किए जाते हैं तो बाद में चीजों को डिबग करने के लिए अपेक्षाकृत कम प्रीप काम की आवश्यकता होती है।
माइकल शोपिन

16

क्रिसफ और अलारिक दोनों के वैध अंक हैं; उनके लिए +1। मैं कम से कम 5 विभिन्न प्रकार के डिबग कोड की पहचान कर सकता हूं जिनका मैं उपयोग करता हूं।

  1. समय पर एक विशिष्ट बिंदु पर डंप सिस्टम स्थिति में लॉग का उपयोग करना।

    void function(...)
    {
        ...dump everything i know about.
    }
    
  2. निष्पादन जांच बिंदुओं के लिए लॉग का उपयोग करना।

    void function(...)
    {
        ...got here 1
        ...got here 2
    }
    
  3. कोड जो वास्तव में एक निश्चित स्थिति को सच होने के लिए मजबूर करता है, लेकिन सामान्य व्यवहार को तोड़ देता है। उदाहरण:

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

  5. ऑपरेशन लॉगिंग - अलारिक के पद का संदर्भ लें । "ऑपरेशन लॉगिंग" से मेरा मतलब बहुत ज्यादा है।

1, 2 और 3 को पूरी तरह से बाहर निकालना चाहिए। 4 जैसा कुछ मैं शायद सशर्त रूप से कोड के बाहर संकलित करूंगा। 5 के लिए, अलारिक के पास लॉग्स को गतिशील रूप से चालू करने में सक्षम होने के बारे में एक शानदार बिंदु था। वह ज्यादातर मामलों के लिए अपनी दूसरी गोली में क्रिसएफ की बात को संबोधित कर सकता है ।


1
यह एक अच्छा सारांश है। हालाँकि, यह बेहतर होगा कि आप इसे ठीक से 1)… के साथ… के साथ स्वरूपित कर सकते हैं 1.… (ताकि मार्काड स्वरूपण इसे सूचियों के रूप में उठाता है) और उदाहरण कोड को 8 रिक्त स्थान (फिर से, ताकि मार्कडाउन इसे एक उदाहरण के रूप में चुने। एक सूची के भीतर कोड)।
कोनराड रुडोल्फ

@ कोनराड रुडोल्फ: हो गया।
गेबलिन

3

यह इस पर निर्भर करता है कि कोड क्या कर रहा है। डिबगिंग के लिए उपयोग किए जाने वाले कुछ कोड को वैसे ही छोड़ा जा सकता है, और कुछ को हटा दिया जाना चाहिए।

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

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

कोड जो आप किसी विशिष्ट बग को ट्रैक करने के लिए जोड़ते हैं, जिसे आपने बग ढूंढने के बाद अक्सर हटाया जा सकता है।


2

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

कुछ डिबग कोड जगह पर रहे, विशेष रूप से सामान जो कि कॉलिंग के घोंसले को देने के लिए था। हालांकि, भले ही डिबग स्ट्रिंग चीज ज्यादातर एक उत्पादन प्रणाली पर दिखाई नहीं देगी, लेकिन यह अभी भी सशर्त संकलन के तहत किया गया था।

हालांकि, वास्तविकता यह है कि यह सब डिबग कोड एक ऐसी चीज़ के लिए बहुत प्रयास था, जिसे आदर्श रूप से एक अलग तरीके से नियंत्रित किया जाता है - बेशक, एक डिबगर। उस समय, मैं बोरलैंड C ++ डिबगर से प्रभावित नहीं था। उपकरण वहाँ थे, लेकिन वे भी अक्सर भ्रामक परिणाम देते थे, और गैर-आईडीई डीबगर (अक्सर आवश्यक) का उपयोग करते हुए शॉर्टकट कुंजी को याद करते थे, जिसका अर्थ था हाथ में नौकरी से विचलित होना।

एकमात्र डीबगिंग अनुभव मैंने पाया है कि बदतर है, कमांड-लाइन GDB।

हर दिन आपके द्वारा उपयोग किए जाने वाले उपकरणों के साथ एक विशेषज्ञ होने के नाते, निश्चित रूप से, महत्वपूर्ण है - लेकिन डिबगिंग वास्तव में कुछ ऐसा नहीं होना चाहिए जो आप हर दिन करते हैं। यदि आप डिबगर का उपयोग करते हैं, तो आप दर्जनों कमांड और / या कीबोर्ड शॉर्टकट सीखने के साथ ठीक हैं, जो मुझे थोड़ा लाल झंडा-ईश लगता है।

जब तक मैं विजुअल स्टूडियो 7 में काम कर रहा था, तब तक यह स्पष्ट था कि डिबगिंग बहुत व्यावहारिक और प्रभावी हो सकती है। यदि आप Visual Studio (एक्सप्रेस संस्करण शामिल) में अपना डिबगिंग कर सकते हैं, तो डीबगिंग एक हवा है। इसमें कोई शक नहीं कि अगर आप सही GUI / IDE फ्रंट एंड पा सकते हैं, तो GDB आसान और प्रभावी है, हालाँकि मैंने अभी तक उस खोज को पूरा नहीं किया है।

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

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


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

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

"मुझे लगता है कि सही उपकरण सिद्धांत रूप में डिबग कोड की तुलना में बेहतर समाधान हैं" यह एक खतरनाक कथन है;)। ऐसे उपकरण होने से जो विश्लेषण में से कुछ को बेहतर बनाते हैं, अच्छा हो सकता है, लेकिन मुझे चिंता है कि डेवलपर्स विशेष रूप से नए एक उपकरण पर बहुत अधिक निर्भर होना शुरू कर देंगे, जैसे कि किसी व्यक्ति को यह पता लगाने के लिए कैलकुलेटर का उपयोग करने की आवश्यकता है कि 100 में से 15% क्या है।
पेमदास

उन उपकरणों पर बहुत अधिक निर्भर रहना जिन पर मैंने अभी तक शोध नहीं किया है, संभावना नहीं लगती है। आपके कैलकुलेटर उदाहरण पर, हाँ, लेकिन मैं अभी भी ओपनऑफ़िस कैल्क का उपयोग करूंगा बजाय अपनी सरल स्प्रेडशीट लिखने के। डिबग कोड के लिए एक समय है (यहां तक ​​कि डिबगर के साथ भी - जैसे आपका अपना विचित्र-स्थिति बनाने वाला मामला), लेकिन अगर यह एक निश्चित बिंदु से आगे जाता है, तो मौजूदा उपकरण जीत जाते हैं। और जब 115 से 15% घटाना आता है, तो मैं उस कैलकुलेटर का भी उपयोग करूंगा - जो कई लोग स्पष्ट उत्तर (100) के रूप में देंगे। मल्टीथ्रेडिंग में, स्पष्ट रूप से सही उत्तर कभी-कभी गलत होने के लिए बदनाम होते हैं।
स्टीव ३१

1

इस पर मेरी राय है: डिबग कोड का इस्तेमाल एक बग को मारने के लिए किया जाता है जिसमें मैं आमतौर पर पूरी तरह से हटा देता हूं। डिबग कोड का इस्तेमाल बाहरी बलों से उत्पन्न बग को मारने के लिए किया जाता है, जो मैं आमतौर पर टिप्पणी करता हूं।


-1

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


-1

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


यह पूछे गए प्रश्न का उत्तर कैसे देता है?
कुटकी

क्योंकि TDD आपको "डीबग" या परीक्षण कोड की ओर ले जाता है जिसे आपको निकालना नहीं है।
ड्यूकऑफमिंग

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