रूबी लिपियों को कैसे डीबग करें [बंद]


153

मैंने इंटरनेट से निम्नलिखित रूबी कोड को कॉपी किया और कुछ बदलाव किए लेकिन यह काम नहीं करता है।

मैं खुद से इस कार्यक्रम को डिबग करने के लिए क्या कर सकता हूं?


1
फिर से मतदान करना। ओपी स्पष्ट रूप से GDB की तरह कदम डिबग चाहता है।
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 '

जवाबों:


145

Pry ( GitHub ) का उपयोग करें ।

इसके माध्यम से स्थापित करें:

$ gem install pry
$ pry

फिर जोड़िए:

require 'pry'; binding.pry

अपने कार्यक्रम में।

के रूप में pry0.12.2 तथापि, वहाँ कोई नेविगेशन जैसे आदेश हैं next, breakआदि कुछ अन्य जवाहरात अतिरिक्त इस प्रदान करते हैं उदाहरण के लिए देखें pry-byedebug


10
मैं Pry (निश्चित रूप से एक जीवन परिवर्तक!) का उपयोग करने की सलाह देता हूं .. एक बार आपके प्रोग्राम में स्थापित और आवश्यक होने पर, एक ब्रेकपॉइंट सेट करना लेखन के जितना आसान है binding.pry। यह रंग पूर्णता, दस्तावेज़ीकरण लुकअप, और संभावना के साथ गतिशील रूप से संपादन और पुनः लोड करने की संभावना के साथ आता है ..
Andrea Fiore

5
जिज्ञासा के होमपेज पर यहाँ उपलब्ध है: pryrepl.org
शैडबाक

4
Pry/ byebugमहान हैं, लेकिन डिबगिंग के दौरान आपका पहला चरण नहीं है। ज्यादातर मामलों में, एक अपवाद को बढ़ाने raise object.inspectसे एक irb सत्र खोलने की तुलना में आपकी समस्या तेजी से हल हो जाएगी। मैं केवल कंसोल डिबगर्स का उपयोग करने की सलाह देता हूं एक बार और अधिक सरल समाधान जैसे कि एक अपवाद उठाना आपकी समस्या को हल करने में असमर्थ हैं।
केल्सी हन्नान

3
क्या एकल-चरण कोड के साथ एक तरीका है pry? मैं नहीं कर पाया कि यह कैसे करना है; और यही मैं एक डिबगर की अपेक्षा करता हूं।
जापताज़ो

2
@jpetazzo हाँ, 'अगला' टाइप करके
marcbest

114
  1. रूबी में:

    ruby -rdebug myscript.rb 

    फिर,

    • b <line>: ब्रेक-पॉइंट लगाएं
    • और n(ext)या s(tep)औरc(ontinue)
    • p(uts) प्रदर्शन के लिए

    (पर्ल डिबग की तरह)

  2. रेल में: सर्वर के साथ लॉन्च करें

    script/server --debugger

    और debuggerकोड में जोड़ें ।


7
-रेडबग बकवास है। और अकिंचन। Pry का उपयोग करें (अन्य उत्तर देखें)।
स्नोक्रैश

3
@SnowCrash - आप क्यों कहते हैं कि -r debugबकवास है?
साइड स्मिथ

8
-debug के साथ: डिबग करने के लिए स्रोत फ़ाइल को बदलने की कोई आवश्यकता नहीं है
जर्मनलाइन बॉक्स

2
एक नई रूबी / रेल एप्लिकेशन के लिए, Pry सही उत्तर है। लेकिन मैंने एक घंटे से अधिक समय facetsतक मणि आवश्यकताओं के एक विशिष्ट संस्करण के साथ रेल 2.2 ऐप पर चलने के लिए Pry का एक प्राचीन संस्करण खोजने की कोशिश की , और असफल रहा। प्राचीन रेल एप्लिकेशन के ruby-debugलिए थोड़ा बुरा है, लेकिन काम हो जाता है।
अबे वोल्कर

56

जैसा कि बैनिस्टर की सिफारिश की गई है: pry का उपयोग करें! मैं केवल इस पर सहमत हो सकता हूं।

pry irb की तुलना में बहुत बेहतर उत्तर है।

आपको जोड़ने की आवश्यकता है

require 'pry'

अपनी स्रोत फ़ाइल में और फिर जोड़कर अपने स्रोत कोड में एक ब्रेकपॉइंट डालें

binding.pry

उस स्थान पर जहां आप चीजों को देखना चाहते हैं (यह एक क्लासिक आईडीई वातावरण में एक ब्रेकपॉइंट को ट्रिगर करने जैसा है)

एक बार आपका प्रोग्राम हिट हो जाए

binding.pry

पंक्ति, आपको अपने कार्यक्रम के सभी संदर्भों के साथ, सही उत्तर को pry उत्तर में फेंक दिया जाएगा, ताकि आप बस सब कुछ का पता लगा सकें, सभी वस्तुओं की जांच कर सकें, राज्य बदल सकें, और यहां तक ​​कि मक्खी पर कोड भी बदल सकें।

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


30

अपवादों को ऊपर उठाने के द्वारा डिबगिंग है काफी आसान के माध्यम से देखने में सेprintलॉग बयान है, और सबसे कीड़े के लिए, अपनी आम तौर पर बहुत तेजी से की तरह एक आईआरबी डिबगर खोलने सेpryयाbyebug। वे उपकरण हमेशा आपका पहला कदम नहीं होना चाहिए।


रूबी / रेल को जल्दी से डिबग करना:

1. फास्ट विधि: एक बार उठाएं Exceptionऔर.inspect उसके परिणाम

रूबी (विशेषकर रेल) ​​कोड को डीबग करने का सबसे तेज़ तरीका विधि या ऑब्जेक्ट (जैसे ) पर raiseकॉल करते समय आपके कोड के निष्पादन पथ के साथ एक अपवाद है :.inspectfoo

raise foo.inspect

उपरोक्त कोड में, raiseएक से चलाता है Exceptionकि अपने कोड की हाल्ट निष्पादन , और एक त्रुटि संदेश है कि आसानी से शामिल रिटर्न .inspectवस्तु / विधि के बारे में जानकारी (यानीfoo ) लाइन पर है कि आप डिबग करने की कोशिश कर रहे हैं।

यह तकनीक किसी वस्तु या विधि ( जैसे यह है ? ) की त्वरित जांच के लिए उपयोगी है और तुरंत इस बात की पुष्टि करने के लिए कि क्या किसी दिए गए संदर्भ में कोड की एक पंक्ति को भी निष्पादित किया जा रहा है।nil

2. फॉलबैक: एक रूबी IRB डीबगर का उपयोग करेंbyebug याpry

अपने कोड निष्पादन प्रवाह की स्थिति के बारे में जानकारी होने के बाद ही आपको एक रूबी रत्न irb डीबगर की तरह जाने पर विचार करना चाहिए pryया byebugजहाँ आप अपने निष्पादन पथ के भीतर वस्तुओं की स्थिति में अधिक गहराई तक जा सकते हैं।


सामान्य शुरुआत सलाह

जब आप किसी समस्या को डीबग करने का प्रयास कर रहे हैं, तो हमेशा के लिए अच्छी सलाह है: Read @! # $ Ing त्रुटि संदेश (RTFM)

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

  1. त्रुटि संदर्भ किस वर्ग का है? (यानी मेरे पास सही ऑब्जेक्ट क्लास है या मेरी ऑब्जेक्ट है nil? )
  2. त्रुटि संदर्भ किस पद्धति से आता है? (अर्थात विधि में उनका एक प्रकार है; क्या मैं इस विधि को इस प्रकार / वस्तु के वर्ग पर कॉल कर सकता हूं? )
  3. अंत में, मैं अपने पिछले दो प्रश्नों से क्या अनुमान लगा सकता हूं, मुझे किस कोड की जांच करनी चाहिए? (याद रखें: स्टैक ट्रेस में कोड की अंतिम पंक्ति जरूरी नहीं है कि समस्या कहां है।)

स्टैक ट्रेस में आपके प्रोजेक्ट से आने वाली कोड की लाइनों पर विशेष ध्यान दें (जैसे app/...कि यदि आप रेल का उपयोग कर रहे हैं तो शुरू होने वाली लाइनें )। समय का 99% समस्या आपके अपने कोड के साथ है।


इस क्रम में व्याख्या करना क्यों स्पष्ट करना महत्वपूर्ण है ...

उदा। एक रूबी त्रुटि संदेश जो कई शुरुआती लोगों को भ्रमित करता है:

आप कोड निष्पादित करते हैं जो कुछ बिंदु पर इस तरह निष्पादित होता है:

@foo = Foo.new

...

@foo.bar

और आपको एक त्रुटि मिलती है जो बताता है:

undefined method "bar" for Nil:nilClass

शुरुआती यह त्रुटि दिखाई और लगता है कि समस्या यह है कि विधि है barहै अपरिभाषितयह। इस त्रुटि में वास्तविक हिस्सा जो मायने रखता है:

for Nil:nilClass

for Nil:nilClassइसका मतलब है कि @fooनील है! @fooएक Fooउदाहरण चर नहीं है ! आपके पास एक वस्तु है Nil। जब आप इस त्रुटि को देखते हैं, तो यह केवल यह बताने की कोशिश कर रहा है कि विधि barकक्षा की वस्तुओं के लिए मौजूद नहीं है Nil। (अच्छी तरह से ओह! क्योंकि हम वर्ग की एक वस्तु के लिए एक विधि का उपयोग करने की कोशिश कर रहे Fooनहीं Nil)।

दुर्भाग्य से, कैसे इस त्रुटि को लिखा है (के कारण undefined method "bar" for Nil:nilClass) अपनी आसान धोखा नहीं खाना में इस त्रुटि सोच के साथ क्या करना है barजा रहा है undefined। जब ध्यान से नहीं पढ़ा जाता है तो इस त्रुटि के कारण शुरुआती लोग गलती से barविधि के विवरण पर खुदाई करने लगते हैं Foo, पूरी तरह से त्रुटि का वह हिस्सा गायब हो जाता है जो संकेत देता है कि वस्तु गलत वर्ग की है (इस मामले में: nil)। यह एक गलती है जिसे आसानी से त्रुटि संदेशों को उनकी संपूर्णता में पढ़ने से बचा जाता है।

सारांश:

किसी भी डिबगिंग की शुरुआत करने से पहले हमेशा पूरी त्रुटि संदेश पढ़ें । इसका मतलब है कि: हमेशा की जाँच करें वर्ग एक वस्तु के प्रकार के एक त्रुटि संदेश में पहले इसकी तो, तरीकों , इससे पहले कि आप किसी भी स्टैकट्रेस या कोड का लाइन में sleuthing जहां आपको लगता है त्रुटि होने वाली हो सकती है शुरू करते हैं। वे 5 सेकंड आपको 5 घंटे की निराशा से बचा सकते हैं।

tl; dr: प्रिंट लॉग में स्क्विंट न करें: अपवादों को उठाएं या इसके बजाय एक irb डीबगर का उपयोग करें। डिबगिंग से पहले त्रुटियों को ध्यान से पढ़कर खरगोश के छेद से बचें।


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

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

1
हा! त्रुटि संदेश पढ़ना रूबी, लेकिन अन्य स्क्रिप्टिंग भाषाओं के लिए सहायक है ? मैं ओपी को भी परेशान नहीं कर सकता।
kayleeFrye_onDeck

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

20
  1. जब भी संभव हो, चर का प्रिंट आउट लें। (इसे प्रिंटफ डीबगिंग कहा जाता है) आप इसे चलाकर कर सकते हैं

    STDERR.puts x.inspect

    या

    STDERR.puts "Variable x is #{x.inspect}"

    यदि आप इस प्रकार को आसान बनाना चाहते हैं, तो आप अनुकरणीय मणि का उपयोग करना चाह सकते हैं ।

  2. चेतावनी चालू करें। यदि आप चला रहे हैं rubyतो इसे -wस्विच (जैसे ruby -w script.rb) से चलाएं । यदि आप इसे irb से चला रहे हैं, और आप 1.9.2 से पहले माणिक के संस्करण का उपयोग कर रहे हैं, तो $VERBOSE = trueअपने सत्र की शुरुआत में टाइप करें। यदि आप एक उदाहरण चर को याद करते हैं, तो एक बार चेतावनी आपको मिल जाएगी

    चेतावनी: उदाहरण चर @valeusआरंभिक नहीं

  3. बाइनरी चॉप की अवधारणा को समझें (निम्नलिखित उद्धरण एक चुस्त प्रैक्टिस के प्रैक्टिस से है )

    समस्या स्थान को आधे भाग में विभाजित करें, और देखें कि किस आधे में समस्या है। फिर उस आधे हिस्से को फिर से आधा भाग दें, और दोहराएं।

  4. यदि आप बाइनरी चॉप के साथ सफल होते हैं, तो आप पा सकते हैं कि एक एकल पंक्ति है जो ऐसा नहीं करती है जो आप इसे करने की अपेक्षा करते हैं। उदाहरण के लिए

    [1, 2, 3].include?([1,2])

    का मान देता है false, भले ही आपको लगता है कि यह वापस आ जाएगा true। उस स्थिति में, आप दस्तावेज़ देखना चाहते हैं। प्रलेखन के लिए वेब साइटों में रूबी- doc.org , या एपीआईडॉक शामिल हैं । उत्तरार्द्ध मामले में, आप टाइप करेंगे include?शीर्ष दाएं कोने में स्थित आवर्धक कांच के बगल में, चुनें include?जो Arrayइसे नीचे (आप क्या वर्ग नहीं जानता कि अगर [1, 2, 3], प्रकार है [1, 2, 3].classआईआरबी में), और आप के लिए मिलता है शामिल हैं? (एरे) , जो वर्णन करता है कि यह क्या करता है।

    हालाँकि, यदि दस्तावेज़ मदद नहीं करता है, तो आपको एक अच्छा जवाब मिलने की संभावना है यदि आप एक प्रश्न पूछ सकते हैं कि एक विशिष्ट रेखा यह कैसे नहीं कर रही है, बजाय इसके कि एक पूरी स्क्रिप्ट क्या नहीं कर रही है यह होना चाहिए।


7

सभी चीजों को हटा देता है

2017 ^ _ ^ में आपका स्वागत है

ठीक है, इसलिए यदि आप एक नई IDE आज़माने के विरोध में नहीं हैं, तो आप निम्न कार्य निशुल्क कर सकते हैं

त्वरित निर्देश

  1. Vscode स्थापित करें
  2. यदि आप पहले से ही नहीं रूबी देव किट स्थापित करें
  3. रूबी, रूबी-लिंटर और रूबी-रूबोक एक्सटेंशन को vscode के लिए इंस्टॉल करें
  4. जो भी रत्न माणिक्य / विस्कोस-रूबी निर्दिष्ट करता है उसे मैन्युअल रूप से स्थापित करेंजरूरत पड़ने पर ,
  5. अपने कॉन्फ़िगर launch.jsonउपयोग करने के लिए "cwd"और और "program" फ़ील्ड का उपयोग{workspaceRoot} मैक्रो
  6. नामक फ़ील्ड जोड़ें "showDebuggerOutput"और इसे सेट करेंtrue
  7. अपने डिबग प्राथमिकताओं में हर जगह ब्रेकपॉइंट को सक्षम करें "debug.allowBreakpointsEverywhere": true

विस्तृत निर्देश

  1. डाउनलोड विज़ुअल स्टूडियो कोड उर्फ vscode; यह विजुअल स्टूडियो जैसा नहीं है । यह नि: शुल्क, हल्के वजन और आमतौर पर सकारात्मक रूप से माना जाता है।
  2. रूबी देव किट स्थापित करें; आपको उनके रेपो पर दिए गए निर्देशों का पालन करना चाहिए: https://github.com/oneclick/rubyinstaller/wiki/Development-Kit
  3. आगे आप या तो एक वेब ब्राउज़र के माध्यम से, या आईडीई के अंदर एक्सटेंशन स्थापित कर सकते हैं; यह आईडीई के अंदर के लिए है। यदि आप दूसरे को चुनते हैं, तो आप यहां जा सकते हैं । Vscode के विस्तार भाग पर नेविगेट करें; आप इसे कुछ तरीके से कर सकते हैं, लेकिन भविष्य की सबसे अधिक प्रूफ विधि संभवत: हिट होगी F1, और extतब तक टाइप की जाएगी जब तक कि एक्सटेंशन्स: इंस्टॉल एक्सटेंशन्स नामक विकल्प उपलब्ध न हो जाए। विकल्प हैं CtrlShiftxऔर शीर्ष मेनू बार से,View->Extensions
  4. आगे आप निम्नलिखित एक्सटेंशन चाहते हैं; ये 100% आवश्यक नहीं हैं, लेकिन मैं आपको यह तय करने दूंगा कि कुछ रखने के बाद आपको क्या रखना चाहिए:
    • माणिक; विस्तार लेखक पेंग ल्व
    • माणिक rubocop; विस्तार लेखक मिसोगी
    • माणिक लिंटर; विस्तार लेखक कोडी हूवर
  5. आपकी रूबी लिपि की निर्देशिका के अंदर, हम कमांड-लाइन के माध्यम से एक निर्देशिका बनाने जा रहे हैं .vscodeऔर वहां हम करेंगे लेकिन एक फ़ाइल जिसे launch.jsonहम कुछ विन्यास विकल्पों को संग्रहीत करने जा रहे हैं।
    • launch.json अंतर्वस्तु

{ "version": "0.2.0", "configurations": [ { "name": "Debug Local File", "type":"Ruby", "request": "launch", "cwd": "${workspaceRoot}", "program": "{workspaceRoot}/../script_name.rb", "args": [], "showDebuggerOutput": true } ] }

  1. मणि मणि प्रतिष्ठानों के लिए विस्तार लेखकों से निर्देशों का पालन करें। यह अब के लिए यहां स्थित है: https://github.com/rubyide/vscode-ruby#install-ruby-mentience
  2. आप शायद जहाँ कहीं भी चाहें ब्रेकपॉइंट लगाने की क्षमता चाहते हैं; यह विकल्प सक्षम नहीं होने से भ्रम की स्थिति पैदा हो सकती है। ऐसा करने के लिए, हम शीर्ष मेनू बार पर जाएंगे और तब तक चुनें File->Preferences->Settings(या Ctrl,) और तब तक स्क्रॉल करें जब तक आप Debugअनुभाग तक नहीं पहुंच जाते । इसे विस्तारित करें और नामक फ़ील्ड देखें "debug.allowBreakpointsEverywhere"- उस फ़ील्ड का चयन करें और थोड़ा पेंसिल-दिखने वाले आइकन पर क्लिक करें और इसे सेट करें true

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

सबसे बड़ा पीटीए 1 है) पूर्व-रीक्स स्थापित करना और 2) .vscode\launch.jsonफ़ाइल को कॉन्फ़िगर करने के लिए याद रखना । केवल # 2 को भविष्य की परियोजनाओं में किसी भी सामान को जोड़ना चाहिए, और आप बस ऊपर सूचीबद्ध एक जैसे सामान्य पर्याप्त कॉन्फ़िगरेशन की प्रतिलिपि बना सकते हैं। वहाँ शायद एक अधिक सामान्य विन्यास स्थान है, लेकिन मैं अपने सिर के ऊपर से पता नहीं है।


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

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

अरे @kayleeFrye_onDeck! आपकी प्रतिक्रिया बहुत अच्छी है, मैं आपको पूरी तरह से देता हूं। लेकिन, पिछली बार जब मैंने वीएससी के लिए पेंग ल्वी के रूबी प्लगइन की जाँच की, तो यह एक यूनिट टेस्ट (या किसी अन्य परीक्षण) के अंदर ब्रेकप्वाइंट सेट करने में सक्षम नहीं था। यह प्लगइन की ज्ञात सीमाओं में से एक था। मुझे लगता है कि लोगों को वीएससी के अपने उदाहरण को कॉन्फ़िगर करने की कोशिश करने से पहले यह जानने की जरूरत है: इसमें समय लगता है और, कई लोगों के लिए, एक परीक्षण चलाने के लिए कोड लिखने और डिबग करने का नंबर एक तरीका है। Ie
महाशय

6

मैं इस वीडियो की दृढ़ता से अनुशंसा करता हूं, ताकि हमारे कोड को डीबग करने के लिए इस समय उचित टूल चुना जा सके।

https://www.youtube.com/watch?v=GwgF8GcynV0

व्यक्तिगत रूप से, मैं इस वीडियो में दो बड़े विषयों पर प्रकाश डालूंगा।

  • Pry डिबग डेटा के लिए बहुत बढ़िया है, "pry एक डेटा एक्सप्लोरर है" (sic)
  • डीबगर कदम से कदम डिबग करने के लिए बेहतर लगता है।

वह मेरा दो सेंट है!


6

अन्य सभी उत्तर पहले से ही लगभग सब कुछ दे देते हैं ... बस थोड़ा सा अतिरिक्त।

यदि आप कुछ और आईडीई-जैसे डिबगर (गैर-सीएलआई) चाहते हैं और संपादक के रूप में विम का उपयोग करने से डरते नहीं हैं, तो मैं इसके लिए विम रूबी डीबगर प्लगइन का सुझाव देता हूं ।

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

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


6

मैंने अभी इस रत्न की खोज की है (एमआरआई रूबी 2.0+ के लिए एक डिबगर में पेरी को बदल दिया है)

https://github.com/deivid-rodriguez/pry-byebug

इसके साथ स्थापित करें:

gem install pry-byebug

फिर बिल्कुल उसी तरह का उपयोग pryकरें, जिस लाइन को आप तोड़ना चाहते हैं उसे चिह्नित करें:

require 'pry'; binding.pry

हालांकि वेनिला प्राई के विपरीत, इस मणि में कुछ महत्वपूर्ण GDB जैसे नेविगेशन कमांड हैं next, stepऔर break:

break SomeClass#run            # Break at the start of `SomeClass#run`.
break Foo#bar if baz?          # Break at `Foo#bar` only if `baz?`.
break app/models/user.rb:15    # Break at line 15 in user.rb.
break 14                       # Break at line 14 in the current file.

5
  1. आप अपने चरों को रास्ते से प्रिंट कर सकते हैं
  2. -w(चेतावनियाँ) ध्वज को चालू करें
  3. माणिक-डीबग जैसे उपकरण का उपयोग करें

2
मैं जोड़ता हूँ कि irbएक शानदार शुरुआत है। छोटे संदिग्ध चोंच के साथ irb का उपयोग करने का प्रयास करें। मुझे रूबी-डिबग (रूबी 1.9+ के लिए रूबी-डिबग 19) से प्यार है, क्योंकि इससे रनिंग प्रोग्राम को रोकना, चरों की जांच करना, आईआरबी में गिरावट, फिर रनिंग जारी रखना आसान हो जाता है।
टीन मैन

5

रूबी शेल स्क्रिप्ट को आसानी से डीबग करने के लिए, बस इसकी पहली पंक्ति को इसमें से बदलें:

#!/usr/bin/env ruby

सेवा:

#!/usr/bin/env ruby -rdebug

फिर हर बार जब डिबगर कंसोल दिखाया जाता है, तो आप चुन सकते हैं:

  • cजारी रखने के लिए (अगले अपवाद के लिए, ब्रेकपॉइंट या लाइन के साथ:) debugger,
  • n अगली पंक्ति के लिए,
  • w/ whereप्रदर्शन फ्रेम / कॉल स्टैक के लिए,
  • l वर्तमान कोड दिखाने के लिए,
  • cat कैच पॉइंट दिखाने के लिए।
  • h अधिक सहायता के लिए।

यह भी देखें: माणिक डिबग साथ डिबगिंग , माणिक डिबग मणि के लिए कुंजी शॉर्टकट


मामले में स्क्रिप्ट सिर्फ लटकी रहती है और आपको बैकट्रेस की आवश्यकता होती है, उपयोग करने का प्रयास करें lldb/ gdbजैसे:

echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)

और फिर अपनी प्रक्रिया को अग्रभूमि की जाँच करें।

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


1
रूबी-डिबग बहुत दिनांकित दिखता है। रूबी-डिबग के लिए गिट रेपो ने इस वर्ष केवल एक ही प्रतिबद्ध किया है - क्या यह अभी भी सक्रिय रूप से बनाए रखा गया है?
एंड्रयू ग्रिम

यह भी रूबी के साथ पैक किया गया लगता है, जो जब आप एक चुटकी में हो तो बहुत अच्छा लगता है। बहुत बढ़िया जवाब!
नस्ल

5

रूबी 2.4.0 के रूप में, किसी भी रूबी कार्यक्रम के बीच में आईआरबी आरईपीएल सत्र शुरू करना आसान है। इन पंक्तियों को उस प्रोग्राम में बिंदु पर रखें, जिसे आप डीबग करना चाहते हैं:

require 'irb'
binding.irb

आप रूबी कोड चला सकते हैं और स्थानीय चर प्रिंट कर सकते हैं। Ctrl + D टाइप करें या quitREPL को समाप्त करें और Ruby प्रोग्राम को चालू रखें।

जैसा कि यह चल रहा है आप अपने प्रोग्राम से मूल्यों का उपयोग putsऔर pप्रिंट आउट भी कर सकते हैं ।


4

यदि आप RubyMine का उपयोग कर रहे हैं , तो रूबी स्क्रिप्ट को डीबग करना सरल और सीधा है।

मान लीजिए कि आपके पास रूबी स्क्रिप्ट है hello_world.rb

1. ब्रेकप्वाइंट सेट करें

नीचे के रूप में 6 लाइन पर एक ब्रेकपॉइंट सेट करें।

यहाँ छवि विवरण दर्ज करें

2. डिबगिंग शुरू करें

अब आप स्क्रिप्ट चलाने के लिए डिबगर शुरू कर सकते हैं:

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

3. चर आदि का निरीक्षण करें।

फिर जब निष्पादन एक ब्रेकपॉइंट मारता है, तो आप चर आदि का निरीक्षण करने में सक्षम होंगे।

यहाँ छवि विवरण दर्ज करें

आपके संदर्भ के लिए आगे की जानकारी

  1. यदि आप दूरस्थ डिबगिंग करने के लिए रूबीमाइन का उपयोग करना चाहते हैं , तो आप ऐसा कर सकते हैं।
  2. यदि आप रूबीमाइन का उपयोग डॉकटर के अंदर चल रहे दूरस्थ डिबग रेल के लिए करना चाहते हैं , तो यह भी सीधा है।

क्या हमारे पास रूबाइन में बाहरी पुस्तकालयों को डीबग करने का एक तरीका है?
Am33d

2

प्रिंटफ डीबगिंग

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

मेरा सुझाव है कि आप दोनों तरीकों की कोशिश करेंगे।

दरअसल हाल ही में एक पुराने यूनिक्स पुरुषों ने कहा, कि प्रिंटफ डीबगिंग कुछ बिंदुओं पर उनके लिए जाने का एक तेज़ तरीका था।

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

यह आपको कुछ समझ देना चाहिए कि कोड कैसे बुना जाता है।

यदि आप कुछ अन्य लोगों के सॉफ्टवेयर के लिए नए हैं, तो यह आपको वहां से आगे बढ़ने में मदद कर सकता है।

यदि आप इसे एक चतुर तरीके से व्यवस्थित करते हैं, या अगर यह सिर्फ बकवास का एक गुच्छा है, तो आपको जल्दी से पता चल जाएगा।


यह एक शक के बिना सबसे अच्छा जवाब है ,,, यह निर्भर करता है
menriquez

2

अच्छी तरह से, रूबी स्टैंडर्ड लिब में gdb जैसे कंसोल डीबगर का उपयोग करने में आसान है: http://ruby-doc.org/stdlib-2.1.0/libdoc/debug/rdoc/DEBUGGER__ कोई अतिरिक्त रत्न स्थापित करने की आवश्यकता नहीं है। रेल स्क्रिप्ट को इस तरह भी डीबग किया जा सकता है।

जैसे

def say(word)
  require 'debug'
  puts word
end

1

सभी डिबगर की माँ सादे पुरानी प्रिंट स्क्रीन है। ज्यादातर समय, आप शायद केवल कुछ सरल वस्तुओं का निरीक्षण करना चाहते हैं, एक त्वरित और आसान तरीका इस तरह है:

@result = fetch_result

p "--------------------------"
p @result

यह आसान पहचान के लिए सामने वाली लाइन के साथ @result से STDOUT की सामग्री का प्रिंट आउट लेगा।

यदि आप एक ऑटोलैड / रीलोड सक्षम ढांचे जैसे रेल का उपयोग करते हैं, तो आपको अपने ऐप को पुनः आरंभ करने की आवश्यकता नहीं होगी। (जब तक आप कोड डिबगिंग नहीं कर रहे हैं, फ्रेमवर्क विशिष्ट सेटिंग्स के कारण पुनः लोड नहीं किया गया है)

मुझे लगता है कि यह मेरे लिए उपयोग के मामले का 90% काम करता है। आप रूबी-डिबग का भी उपयोग कर सकते हैं, लेकिन मुझे लगता है कि यह ज्यादातर समय खत्म हो जाता है।


1

विभिन्न विशेषताओं के साथ कई डिबगर्स हैं, जिसके आधार पर आप चुनाव करते हैं। मेरी प्राथमिकताएँ प्री-चाल से संतुष्ट थीं जो थीं:

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