डिबगर क्या है और यह मुझे समस्याओं के निदान में कैसे मदद कर सकता है?

Aug 19 2014

यह नए प्रोग्रामर की सहायता करने के लिए एक सामान्य-उद्देश्य वाला प्रश्न है, जिनके पास एक कार्यक्रम के साथ समस्या है, लेकिन समस्या के कारण का निदान करने के लिए डिबगर का उपयोग करना नहीं जानते हैं।

यह प्रश्न तीन और वर्गों को शामिल करता है:

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

जवाब

68 Raedwald Aug 19 2014 at 20:49

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

डिबगर का उपयोग करना एक अपेक्षित बुनियादी कौशल है

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

कैसे एक डिबगर आपकी मदद कर सकता है

डिबगर का उपयोग करके आप यह पता लगा सकते हैं कि एक चर का गलत मान है या नहीं, और आपके कार्यक्रम में इसका मान गलत मान में कहां बदल गया।

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

डिबगर का उपयोग करने पर सामान्य नोट्स

डीबगर का उपयोग करने की बारीकियाँ डीबगर पर निर्भर करती हैं और कुछ हद तक, जिस प्रोग्रामिंग भाषा का आप उपयोग कर रहे हैं।

  • आप डिबगर को एक प्रक्रिया से जोड़ सकते हैं जो पहले से ही आपके प्रोग्राम को चला रही है। यदि आपका प्रोग्राम अटका हुआ है तो आप ऐसा कर सकते हैं।

  • व्यवहार में अक्सर अपने प्रोग्राम को शुरू से ही डिबगर के नियंत्रण में चलाना आसान होता है।

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

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

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

39 SlugFiller Apr 05 2015 at 19:15

मैं जोड़ना चाहता हूं कि एक डिबगर हमेशा सही समाधान नहीं होता है, और हमेशा डिबगिंग के लिए समाधान नहीं होना चाहिए। यहां कुछ मामले हैं जहां एक डिबगर आपके लिए काम नहीं कर सकता है:

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

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

तो फिर विकल्प क्या हैं?

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

गलत मूल्यों को फंसाने के लिए दावे का इस्तेमाल किया जा सकता है, बजाय इसके कि एक बार एंड-यूज़र को दिखाई देने वाला प्रभाव दिखाई दे। जितनी जल्दी आप एक गलत मूल्य पकड़ते हैं, उतने ही करीब आप इसे पैदा करने वाली रेखा के करीब होते हैं।

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

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

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