आपका प्रोग्राम कितनी बार ठीक वही करता है जो आप पहली बार चाहते हैं?
कई बार हमारे प्रोग्राम हमारी अपेक्षा के अनुरूप काम नहीं करते हैं, इसलिए हमें रूबी को डीबग करना की कला का उपयोग करना पड़ता है। क्यों पता लगाने में हमारी मदद करने के लिए।
आप निम्न त्रुटि संदेश से परिचित हो सकते हैं:
undefined method 'some_method' for nil:NilClass
इसका मतलब है कि एक शून्य मान हमारे कोड में अपना रास्ता खोजने में कामयाब रहा।
इस लेख में चर्चा की गई तकनीकों का उपयोग करके आप सीखेंगे कि इस मुद्दे और इसी तरह की समस्याओं से कैसे निपटें!
त्रुटियों और स्टैक ट्रेस को समझना
जब आपको रूबी दुभाषिया से कोई त्रुटि मिल रही है या आपका प्रोग्राम वह नहीं कर रहा है जो उसे करना चाहिए तो यह आपकी डिबगिंग टोपी लगाने का समय है।
यदि समस्या यह है कि आपका प्रोग्राम क्रैश हो रहा है, तो यह महत्वपूर्ण है कि त्रुटि संदेश पर ध्यान दें , जिसमें आमतौर पर क्या गलत हो रहा है, इसके सुराग होंगे।
यहां एक उदाहरण दिया गया है :
def method1 method2 end def method2 puts invalid_variable end method1
इस कोड को चलाने से आपको निम्न त्रुटि मिलेगी:
/tmp/stack.rb:6:in 'method2': undefined local variable or method 'invalid_variable' for main:Object (NameError) from /tmp/stack.rb:2:in 'method1' from /tmp/stack.rb:9:in ''
इसे ही स्टैक ट्रेस के रूप में जाना जाता है।
आइए इसका एक साथ विश्लेषण करें!
हम शीर्ष पर लाइन से शुरू करते हैं।
यह वह जगह है जहां वास्तविक त्रुटि हुई, लेकिन इसका मतलब यह नहीं है कि त्रुटि की स्थिति यहां उत्पन्न हुई है।
हालांकि, हमारी जांच शुरू करना एक अच्छा मुद्दा है।
सौदा यह है :
Text | विवरण |
---|---|
/tmp/stack.rb :6 | फाइल और लाइन नंबर |
`विधि2 . में ' | विधि का नाम |
अपरिभाषित स्थानीय चर या विधि 'अमान्य_चर ' | त्रुटि संदेश |
main:ऑब्जेक्ट | कक्षा का नाम |
(NameError) | अपवाद नाम |
जैसा कि आप देख सकते हैं त्रुटि इस तरह से टूटने पर डराने वाली नहीं है।
वैसे, आप यहां अपवादों की सूची पा सकते हैं।
अब :
पहली पंक्ति के नीचे स्टैक ट्रेस की प्रत्येक पंक्ति आपको बताती है कि कोड यहाँ कैसे आया।
यह मूल रूप से एक विधि श्रृंखला है, यदि आप नीचे जाते रहते हैं तो आपको अंततः अपने ऐप की मुख्य विधि ढूंढनी चाहिए।
स्टैक ट्रेस से निपटने के लिए यहां एक सामान्य एल्गोरिदम दिया गया है :
- स्टैक ट्रेस की शीर्ष पंक्ति पढ़ें
- यदि फ़ाइल आपके प्रोजेक्ट का हिस्सा है:संकेतित लाइन नंबर पर दोषपूर्ण फ़ाइल खोलें। यदि ऐसा नहीं है, तब तक स्टैक ट्रेस नीचे जाते रहें जब तक कि आपको अपनी पहचानी गई फ़ाइल का पहला संदर्भ न मिल जाए
- देखें कि क्या कुछ स्पष्ट रूप से आपके सामने आता है और इसे ठीक करें (त्रुटि संदेश पर उल्लिखित चीजों को देखें)
- अगर इससे मदद नहीं मिलती है, तो आपको और जानकारी ढूंढनी होगी, जैसे कि प्रभावित चरों के मान।
रूबी डीबग करना
सबसे बुनियादी (जिसका मतलब जरूरी नहीं कि खराब हो) डिबगिंग तकनीक जिससे आप शायद परिचित हैं, वह है केवल संदिग्ध चर के मूल्यों को डंप करना।
रूबी में आप पुट . का उपयोग करके ऐसा कर सकते हैं या p ।
p . का उपयोग करना यह कहने के बराबर है कि variable.inspect डालता है , और यह वस्तुओं को देखने के लिए उपयोगी है।
उदाहरण :
Book = Struct.new(:title) def find_book(title) books = [] books << Book.new('Eloquent Ruby') books.find { |b| b.title == title } end book = find_book('Eloquent Ruby') p book # This will print our book object book = find_book('POODR') p book # This will print nil book.name # Guess what happens next!
प्राइ के साथ गहरी खुदाई
जब आपके पास जांचने के लिए कई चर हों, तो puts
. जोड़ना हर जगह बहुत व्यावहारिक नहीं हो सकता है।
उस स्थिति में आपको कोशिश करनी चाहिए।
प्राइ . का उपयोग करना आप कोड की एक विशिष्ट पंक्ति (जिसे ब्रेकपॉइंट के रूप में भी जाना जाता है) पर अपना कोड रोक सकते हैं और यह आपको एक आईआरबी-जैसे वातावरण में छोड़ देगा, जहां आप अपनी परियोजना के संदर्भ में रूबी कोड का मूल्यांकन कर सकते हैं, या कई में से एक को निष्पादित कर सकते हैं उपयोगी प्रिय आदेश।
प्राइ का उपयोग करना वाकई आसान है :
आपको बस binding.pry
ड्रॉप करना है जहां आप एक प्राइ ब्रेकप्वाइंट स्थापित करना चाहेंगे।
आपको अपने प्रोजेक्ट में भी प्राइ की आवश्यकता होगी ('प्राइ' की आवश्यकता है)।
अगर आप इसे अस्थायी रूप से करना चाहते हैं तो आप अपनी रूबी स्क्रिप्ट को इस तरह कॉल कर सकते हैं:
ruby -rpry app.rb
यह रेल ऐप के लिए बहुत उपयोगी नहीं होगा, इसलिए आप अपने जेमफाइल में pry जोड़ना चाह सकते हैं।
मैं जो करना चाहता हूं वह यह है कि मेरे संपादक पर मैक्रो/स्निपेट होना चाहिए जिसमें ब्रेकपॉइंट की तुलना में एक ही पंक्ति में पहले से ही आवश्यकता शामिल है, इसलिए जब मैं इसे हटा दूंगा तो मैं दोनों चीजों को हटा दूंगा।
जब आप किसी प्राइ सेशन से बाहर होंगे तो आप यही देखेंगे:
यदि आप किसी प्राइ सत्र को पूरी तरह से छोड़ना चाहते हैं तो आप बाहर निकलें! . टाइप कर सकते हैं , यदि आप नियमित रूप से निकास करते हैं यह आपके प्रोग्राम को अगले ब्रेकपॉइंट तक चलाता है।
चुभन की ताकत यहीं खत्म नहीं होती है। उदाहरण के लिए, आप ls
. का उपयोग कर सकते हैं यह देखने के लिए आदेश देता है कि किसी ऑब्जेक्ट की किन विधियों और आवृत्ति चरों तक पहुंच है।
सहायता चलाना न भूलें सभी अच्छाइयों की सूची प्राप्त करने का आदेश!
एक और रूबी डीबगर:बायबग
बाईबग रूबी के लिए प्राइ रिप्लेसमेंट या जीडीबी जैसे डिबगर के रूप में कार्य कर सकता है।
यदि आप इसे पहले वाले के लिए उपयोग करना चाहते हैं तो आप बस बायबग drop को छोड़ दें binding.pry
. के बजाय जहां आप चाहते हैं कि आपका कोड रुक जाए। बाईबग ओवर प्राइ का उपयोग करने का एक नुकसान यह है कि यह सिंटैक्स हाइलाइटिंग प्रदान नहीं करता है।
आइए देखें कि आप बाईबग के अंदर ब्रेकप्वाइंट कैसे सेट कर सकते हैं और अपने कोड को डिबग कर सकते हैं!
आमतौर पर आप हेल्प कमांड को कॉल करेंगे, लेकिन इस मामले में इसमें जानकारी की थोड़ी कमी है:
तो आपको दस्तावेज़ीकरण से परामर्श करना होगा।
ब्रेक . कमांड का उपयोग करके आप देख सकते हैं कि कैसे और एक लाइन नंबर जिसे आप अपने ब्रेकप्वाइंट सेट कर सकते हैं।
विराम बिंदुओं की सूची प्राप्त करने के लिए आप जानकारी विराम बिंदु . का उपयोग कर सकते हैं ।
एक बार आपके ब्रेकप्वाइंट सेट हो जाने के बाद, आप निम्न कमांड का उपयोग करके प्रोग्राम निष्पादन के माध्यम से आगे बढ़ सकते हैं:
- चरण (एक निर्देश अग्रिम, विधि कॉल में कदम रखना)
- अगला (अग्रिम एक निर्देश, अंदर के तरीके नहीं मिलते)
- जारी रखें (अंत या अगले ब्रेकपॉइंट तक चलाएं)
यदि आप बिना किसी आदेश के एंटर टाइप करते हैं तो इसे केवल पिछले एक को दोहराएं, यह आपके कोड के माध्यम से चलते समय बहुत उपयोगी है।
जब बाकी सब विफल हो जाए
जब आप अच्छा समय लगा चुके हों और समाधान नहीं देख पा रहे हों, तब ब्रेक लेना सुनिश्चित करें, जब आप नई आँखों से वापस आएंगे तो आपको पता चलेगा कि समाधान आपके सामने था। आप किसी और को समस्या समझाने की कोशिश भी कर सकते हैं।
कभी-कभी आप सुनिश्चित नहीं होते कि समस्या कहां है, जब ऐसा होता है तब भी आपके पास बहुत सारे विकल्प होते हैं।
उदाहरण के लिए, हो सकता है कि आप समस्या को अलग करने के लिए कोड के ब्लॉक पर टिप्पणी करना चाहें।
यदि समस्या गायब हो जाती है तो आप उस कोड के एक हिस्से पर टिप्पणी नहीं कर सकते जिस पर आपने अभी टिप्पणी की है।
यह एक बहुत ही कम तकनीक वाला समाधान है, लेकिन यह ठीक वही हो सकता है जिसकी आपको आवश्यकता है।
यदि आप यहां तक पहुंच गए हैं और कुछ भी मदद नहीं करता है :
बड़ी तोपों को बाहर निकालने का समय आ गया है।
यहां कुछ सिस्टम टूल दिए गए हैं जो आपको अक्सर मददगार लगेंगे।
इनमें से एक टूल Wireshark है, जो आपको नेटवर्क ट्रैफ़िक का निरीक्षण करने देगा।
यदि आप एसएसएल-एन्क्रिप्टेड ट्रैफ़िक के साथ काम कर रहे हैं, तो मिटमप्रॉक्सी जैसा मिटम (मैन इन द बीच) प्रॉक्सी आपकी मदद करने में सक्षम हो सकता है।
आप कर्ल . भी आज़मा सकते हैं अपने टर्मिनल से HTTP कनेक्शन शुरू करने के लिए, जो आपको अमान्य सर्वर प्रतिक्रियाओं को डीबग करने में मदद कर सकता है।
एक अन्य उपकरण जो परिचित होने के लिए उपयोगी है वह है स्ट्रेस (केवल लिनक्स)।
स्ट्रेस आपको वे सभी सिस्टम कॉल दिखाएगा जो आपका ऐप कर रहा है।
आप -e विकल्प का उपयोग करके विशिष्ट सिस्टम कॉल के लिए फ़िल्टर कर सकते हैं। स्ट्रेस का एक और आधुनिक विकल्प sysdig है।
<ब्लॉकक्वॉट>चेतावनी! आप उत्पादन में स्ट्रेस के उपयोग से बचना चाह सकते हैं क्योंकि यह परीक्षण के तहत सिस्टम के प्रदर्शन को गंभीर रूप से खराब कर देता है।
अंत में, यदि आप किसी ऐसे मुद्दे से निपट रहे हैं जो ऐसा लगता है कि यह किसी बाहरी रत्न से आ रहा है, तो एक स्पष्ट कदम रत्न के स्रोत कोड का निरीक्षण करना है।
आप मणि खुला
निष्कर्ष
भले ही डिबगिंग अब तक की सबसे मजेदार गतिविधि नहीं है, फिर भी बहुत सारे टूल और तकनीकें हैं जो आपके लिए इसे आसान बना सकती हैं, अपनी सहायता के लिए उनका उपयोग करें।
कृपया इस पोस्ट को साझा करें यदि आपको यह अच्छी लगी हो तो अधिक पीपीएल सीख सकते हैं!
धन्यवाद।