मैंने इंटरनेट से निम्नलिखित रूबी कोड को कॉपी किया और कुछ बदलाव किए लेकिन यह काम नहीं करता है।
मैं खुद से इस कार्यक्रम को डिबग करने के लिए क्या कर सकता हूं?
मैंने इंटरनेट से निम्नलिखित रूबी कोड को कॉपी किया और कुछ बदलाव किए लेकिन यह काम नहीं करता है।
मैं खुद से इस कार्यक्रम को डिबग करने के लिए क्या कर सकता हूं?
जवाबों:
Pry ( GitHub ) का उपयोग करें ।
इसके माध्यम से स्थापित करें:
$ gem install pry
$ pry
फिर जोड़िए:
require 'pry'; binding.pry
अपने कार्यक्रम में।
के रूप में pry
0.12.2 तथापि, वहाँ कोई नेविगेशन जैसे आदेश हैं next
, break
आदि कुछ अन्य जवाहरात अतिरिक्त इस प्रदान करते हैं उदाहरण के लिए देखें pry-byedebug
।
binding.pry
। यह रंग पूर्णता, दस्तावेज़ीकरण लुकअप, और संभावना के साथ गतिशील रूप से संपादन और पुनः लोड करने की संभावना के साथ आता है ..
Pry
/ byebug
महान हैं, लेकिन डिबगिंग के दौरान आपका पहला चरण नहीं है। ज्यादातर मामलों में, एक अपवाद को बढ़ाने raise object.inspect
से एक irb सत्र खोलने की तुलना में आपकी समस्या तेजी से हल हो जाएगी। मैं केवल कंसोल डिबगर्स का उपयोग करने की सलाह देता हूं एक बार और अधिक सरल समाधान जैसे कि एक अपवाद उठाना आपकी समस्या को हल करने में असमर्थ हैं।
pry
? मैं नहीं कर पाया कि यह कैसे करना है; और यही मैं एक डिबगर की अपेक्षा करता हूं।
रूबी में:
ruby -rdebug myscript.rb
फिर,
b <line>
: ब्रेक-पॉइंट लगाएं n(ext)
या s(tep)
औरc(ontinue)
p(uts)
प्रदर्शन के लिए(पर्ल डिबग की तरह)
रेल में: सर्वर के साथ लॉन्च करें
script/server --debugger
और debugger
कोड में जोड़ें ।
-r debug
बकवास है?
facets
तक मणि आवश्यकताओं के एक विशिष्ट संस्करण के साथ रेल 2.2 ऐप पर चलने के लिए Pry का एक प्राचीन संस्करण खोजने की कोशिश की , और असफल रहा। प्राचीन रेल एप्लिकेशन के ruby-debug
लिए थोड़ा बुरा है, लेकिन काम हो जाता है।
जैसा कि बैनिस्टर की सिफारिश की गई है: pry का उपयोग करें! मैं केवल इस पर सहमत हो सकता हूं।
pry irb की तुलना में बहुत बेहतर उत्तर है।
आपको जोड़ने की आवश्यकता है
require 'pry'
अपनी स्रोत फ़ाइल में और फिर जोड़कर अपने स्रोत कोड में एक ब्रेकपॉइंट डालें
binding.pry
उस स्थान पर जहां आप चीजों को देखना चाहते हैं (यह एक क्लासिक आईडीई वातावरण में एक ब्रेकपॉइंट को ट्रिगर करने जैसा है)
एक बार आपका प्रोग्राम हिट हो जाए
binding.pry
पंक्ति, आपको अपने कार्यक्रम के सभी संदर्भों के साथ, सही उत्तर को pry उत्तर में फेंक दिया जाएगा, ताकि आप बस सब कुछ का पता लगा सकें, सभी वस्तुओं की जांच कर सकें, राज्य बदल सकें, और यहां तक कि मक्खी पर कोड भी बदल सकें।
मेरा मानना है कि आप उस पद्धति के कोड को नहीं बदल सकते हैं जो आप वर्तमान में हैं, इसलिए आप दुख की बात है कि निष्पादित होने वाली अगली पंक्ति को नहीं बदल सकते। लेकिन अच्छा रूबी कोड वैसे भी सिंगल लाइन हो जाता है ;-)
अपवादों को ऊपर उठाने के द्वारा डिबगिंग है काफी आसान के माध्यम से देखने में सेprint
लॉग बयान है, और सबसे कीड़े के लिए, अपनी आम तौर पर बहुत तेजी से की तरह एक आईआरबी डिबगर खोलने सेpry
याbyebug
। वे उपकरण हमेशा आपका पहला कदम नहीं होना चाहिए।
Exception
और.inspect
उसके परिणामरूबी (विशेषकर रेल) कोड को डीबग करने का सबसे तेज़ तरीका विधि या ऑब्जेक्ट (जैसे ) पर raise
कॉल करते समय आपके कोड के निष्पादन पथ के साथ एक अपवाद है :.inspect
foo
raise foo.inspect
उपरोक्त कोड में, raise
एक से चलाता है Exception
कि अपने कोड की हाल्ट निष्पादन , और एक त्रुटि संदेश है कि आसानी से शामिल रिटर्न .inspect
वस्तु / विधि के बारे में जानकारी (यानीfoo
) लाइन पर है कि आप डिबग करने की कोशिश कर रहे हैं।
यह तकनीक किसी वस्तु या विधि ( जैसे यह है ? ) की त्वरित जांच के लिए उपयोगी है और तुरंत इस बात की पुष्टि करने के लिए कि क्या किसी दिए गए संदर्भ में कोड की एक पंक्ति को भी निष्पादित किया जा रहा है।nil
byebug
याpry
अपने कोड निष्पादन प्रवाह की स्थिति के बारे में जानकारी होने के बाद ही आपको एक रूबी रत्न irb डीबगर की तरह जाने पर विचार करना चाहिए pry
या byebug
जहाँ आप अपने निष्पादन पथ के भीतर वस्तुओं की स्थिति में अधिक गहराई तक जा सकते हैं।
जब आप किसी समस्या को डीबग करने का प्रयास कर रहे हैं, तो हमेशा के लिए अच्छी सलाह है: Read @! # $ Ing त्रुटि संदेश (RTFM)
इसका मतलब है कि एक्टिंग से पहले ध्यान से और पूरी तरह से एरर मैसेज पढ़ना ताकि आप समझ सकें कि यह आपको बताने की कोशिश कर रहा है। जब आप डीबग करते हैं, तो एक त्रुटि संदेश पढ़ते समय, इस क्रम में निम्नलिखित मानसिक प्रश्न पूछें :
nil
? ) स्टैक ट्रेस में आपके प्रोजेक्ट से आने वाली कोड की लाइनों पर विशेष ध्यान दें (जैसे 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 डीबगर का उपयोग करें। डिबगिंग से पहले त्रुटियों को ध्यान से पढ़कर खरगोश के छेद से बचें।
जब भी संभव हो, चर का प्रिंट आउट लें। (इसे प्रिंटफ डीबगिंग कहा जाता है) आप इसे चलाकर कर सकते हैं
STDERR.puts x.inspect
या
STDERR.puts "Variable x is #{x.inspect}"
यदि आप इस प्रकार को आसान बनाना चाहते हैं, तो आप अनुकरणीय मणि का उपयोग करना चाह सकते हैं ।
चेतावनी चालू करें। यदि आप चला रहे हैं ruby
तो इसे -w
स्विच (जैसे ruby -w script.rb
) से चलाएं । यदि आप इसे irb से चला रहे हैं, और आप 1.9.2 से पहले माणिक के संस्करण का उपयोग कर रहे हैं, तो $VERBOSE = true
अपने सत्र की शुरुआत में टाइप करें। यदि आप एक उदाहरण चर को याद करते हैं, तो एक बार चेतावनी आपको मिल जाएगी
चेतावनी: उदाहरण चर
@valeus
आरंभिक नहीं
बाइनरी चॉप की अवधारणा को समझें (निम्नलिखित उद्धरण एक चुस्त प्रैक्टिस के प्रैक्टिस से है )
समस्या स्थान को आधे भाग में विभाजित करें, और देखें कि किस आधे में समस्या है। फिर उस आधे हिस्से को फिर से आधा भाग दें, और दोहराएं।
यदि आप बाइनरी चॉप के साथ सफल होते हैं, तो आप पा सकते हैं कि एक एकल पंक्ति है जो ऐसा नहीं करती है जो आप इसे करने की अपेक्षा करते हैं। उदाहरण के लिए
[1, 2, 3].include?([1,2])
का मान देता है false
, भले ही आपको लगता है कि यह वापस आ जाएगा true
। उस स्थिति में, आप दस्तावेज़ देखना चाहते हैं। प्रलेखन के लिए वेब साइटों में रूबी- doc.org , या एपीआईडॉक शामिल हैं । उत्तरार्द्ध मामले में, आप टाइप करेंगे include?
शीर्ष दाएं कोने में स्थित आवर्धक कांच के बगल में, चुनें include?
जो Array
इसे नीचे (आप क्या वर्ग नहीं जानता कि अगर [1, 2, 3]
, प्रकार है [1, 2, 3].class
आईआरबी में), और आप के लिए मिलता है शामिल हैं? (एरे) , जो वर्णन करता है कि यह क्या करता है।
हालाँकि, यदि दस्तावेज़ मदद नहीं करता है, तो आपको एक अच्छा जवाब मिलने की संभावना है यदि आप एक प्रश्न पूछ सकते हैं कि एक विशिष्ट रेखा यह कैसे नहीं कर रही है, बजाय इसके कि एक पूरी स्क्रिप्ट क्या नहीं कर रही है यह होना चाहिए।
सभी चीजों को हटा देता है
2017 ^ _ ^ में आपका स्वागत है
ठीक है, इसलिए यदि आप एक नई IDE आज़माने के विरोध में नहीं हैं, तो आप निम्न कार्य निशुल्क कर सकते हैं ।
launch.json
उपयोग करने के लिए "cwd"
और और "program"
फ़ील्ड का उपयोग{workspaceRoot}
मैक्रो"showDebuggerOutput"
और इसे सेट करेंtrue
"debug.allowBreakpointsEverywhere": true
vscode
; यह विजुअल स्टूडियो जैसा नहीं है । यह नि: शुल्क, हल्के वजन और आमतौर पर सकारात्मक रूप से माना जाता है।View->Extensions
.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
}
]
}
File->Preferences->Settings
(या Ctrl,) और तब तक स्क्रॉल करें जब तक आप Debug
अनुभाग तक नहीं पहुंच जाते । इसे विस्तारित करें और नामक फ़ील्ड देखें "debug.allowBreakpointsEverywhere"
- उस फ़ील्ड का चयन करें और थोड़ा पेंसिल-दिखने वाले आइकन पर क्लिक करें और इसे सेट करें true
।उस सभी मज़ेदार सामग्री को करने के बाद, आपको 2017 के मध्य और एक अंधेरे विषय के समान मेनू में ब्रेकपॉइंट और डीबग सेट करने में सक्षम होना चाहिए: सभी मज़ेदार सामान जैसे आपके कॉल स्टैक, चर दर्शक, आदि।
सबसे बड़ा पीटीए 1 है) पूर्व-रीक्स स्थापित करना और 2) .vscode\launch.json
फ़ाइल को कॉन्फ़िगर करने के लिए याद रखना । केवल # 2 को भविष्य की परियोजनाओं में किसी भी सामान को जोड़ना चाहिए, और आप बस ऊपर सूचीबद्ध एक जैसे सामान्य पर्याप्त कॉन्फ़िगरेशन की प्रतिलिपि बना सकते हैं। वहाँ शायद एक अधिक सामान्य विन्यास स्थान है, लेकिन मैं अपने सिर के ऊपर से पता नहीं है।
मैं इस वीडियो की दृढ़ता से अनुशंसा करता हूं, ताकि हमारे कोड को डीबग करने के लिए इस समय उचित टूल चुना जा सके।
https://www.youtube.com/watch?v=GwgF8GcynV0
व्यक्तिगत रूप से, मैं इस वीडियो में दो बड़े विषयों पर प्रकाश डालूंगा।
वह मेरा दो सेंट है!
अन्य सभी उत्तर पहले से ही लगभग सब कुछ दे देते हैं ... बस थोड़ा सा अतिरिक्त।
यदि आप कुछ और आईडीई-जैसे डिबगर (गैर-सीएलआई) चाहते हैं और संपादक के रूप में विम का उपयोग करने से डरते नहीं हैं, तो मैं इसके लिए विम रूबी डीबगर प्लगइन का सुझाव देता हूं ।
इसका प्रलेखन बहुत सीधा है, इसलिए लिंक का अनुसरण करें और देखें। संक्षेप में, यह आपको संपादक में करंट लाइन पर ब्रेकपॉइंट सेट करने की अनुमति देता है, पॉज़ पर निफ्टी विंडो में स्थानीय चर देखें, स्टेप ओवर / इन - लगभग सभी सामान्य डिबगर फीचर।
मेरे लिए एक रेल एप्लिकेशन को डीबग करने के लिए इस विम डिबगर का उपयोग करना बहुत सुखद था, हालांकि रेल की समृद्ध लकड़हारा क्षमताएं इसके लिए आवश्यकता को लगभग समाप्त कर देती हैं।
मैंने अभी इस रत्न की खोज की है (एमआरआई रूबी 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.
-w
(चेतावनियाँ) ध्वज को चालू करेंirb
एक शानदार शुरुआत है। छोटे संदिग्ध चोंच के साथ irb का उपयोग करने का प्रयास करें। मुझे रूबी-डिबग (रूबी 1.9+ के लिए रूबी-डिबग 19) से प्यार है, क्योंकि इससे रनिंग प्रोग्राम को रोकना, चरों की जांच करना, आईआरबी में गिरावट, फिर रनिंग जारी रखना आसान हो जाता है।
रूबी शेल स्क्रिप्ट को आसानी से डीबग करने के लिए, बस इसकी पहली पंक्ति को इसमें से बदलें:
#!/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
साथ बदलें gdb
। sudo
गैर-स्वामित्व वाली प्रक्रिया को डीबग करने के लिए उपसर्ग ।
रूबी 2.4.0 के रूप में, किसी भी रूबी कार्यक्रम के बीच में आईआरबी आरईपीएल सत्र शुरू करना आसान है। इन पंक्तियों को उस प्रोग्राम में बिंदु पर रखें, जिसे आप डीबग करना चाहते हैं:
require 'irb'
binding.irb
आप रूबी कोड चला सकते हैं और स्थानीय चर प्रिंट कर सकते हैं। Ctrl + D टाइप करें या quit
REPL को समाप्त करें और Ruby प्रोग्राम को चालू रखें।
जैसा कि यह चल रहा है आप अपने प्रोग्राम से मूल्यों का उपयोग puts
और p
प्रिंट आउट भी कर सकते हैं ।
यदि आप RubyMine का उपयोग कर रहे हैं , तो रूबी स्क्रिप्ट को डीबग करना सरल और सीधा है।
मान लीजिए कि आपके पास रूबी स्क्रिप्ट है hello_world.rb
नीचे के रूप में 6 लाइन पर एक ब्रेकपॉइंट सेट करें।
अब आप स्क्रिप्ट चलाने के लिए डिबगर शुरू कर सकते हैं:
फिर जब निष्पादन एक ब्रेकपॉइंट मारता है, तो आप चर आदि का निरीक्षण करने में सक्षम होंगे।
प्रिंटफ डीबगिंग
हमेशा डिबगिंग तकनीकों के आसपास एक विवाद रहा है, कुछ लोग प्रिंट स्टेटमेंट द्वारा डिबग करना पसंद करते हैं, कुछ अन्य डीबगर के साथ गहरी खुदाई करना पसंद करते हैं।
मेरा सुझाव है कि आप दोनों तरीकों की कोशिश करेंगे।
दरअसल हाल ही में एक पुराने यूनिक्स पुरुषों ने कहा, कि प्रिंटफ डीबगिंग कुछ बिंदुओं पर उनके लिए जाने का एक तेज़ तरीका था।
लेकिन अगर आप किसी काम में नए हैं और कोड के एक बड़े ब्लूब को समझने की जरूरत है, तो यह वास्तव में उपयोगी है कि वहां कदम रखें, कुछ ब्रेकपॉइंट्स को इधर-उधर कर दें, साथ में यह कैसे चलेगा।
यह आपको कुछ समझ देना चाहिए कि कोड कैसे बुना जाता है।
यदि आप कुछ अन्य लोगों के सॉफ्टवेयर के लिए नए हैं, तो यह आपको वहां से आगे बढ़ने में मदद कर सकता है।
यदि आप इसे एक चतुर तरीके से व्यवस्थित करते हैं, या अगर यह सिर्फ बकवास का एक गुच्छा है, तो आपको जल्दी से पता चल जाएगा।
अच्छी तरह से, रूबी स्टैंडर्ड लिब में gdb जैसे कंसोल डीबगर का उपयोग करने में आसान है: http://ruby-doc.org/stdlib-2.1.0/libdoc/debug/rdoc/DEBUGGER__ कोई अतिरिक्त रत्न स्थापित करने की आवश्यकता नहीं है। रेल स्क्रिप्ट को इस तरह भी डीबग किया जा सकता है।
जैसे
def say(word)
require 'debug'
puts word
end
सभी डिबगर की माँ सादे पुरानी प्रिंट स्क्रीन है। ज्यादातर समय, आप शायद केवल कुछ सरल वस्तुओं का निरीक्षण करना चाहते हैं, एक त्वरित और आसान तरीका इस तरह है:
@result = fetch_result
p "--------------------------"
p @result
यह आसान पहचान के लिए सामने वाली लाइन के साथ @result से STDOUT की सामग्री का प्रिंट आउट लेगा।
यदि आप एक ऑटोलैड / रीलोड सक्षम ढांचे जैसे रेल का उपयोग करते हैं, तो आपको अपने ऐप को पुनः आरंभ करने की आवश्यकता नहीं होगी। (जब तक आप कोड डिबगिंग नहीं कर रहे हैं, फ्रेमवर्क विशिष्ट सेटिंग्स के कारण पुनः लोड नहीं किया गया है)
मुझे लगता है कि यह मेरे लिए उपयोग के मामले का 90% काम करता है। आप रूबी-डिबग का भी उपयोग कर सकते हैं, लेकिन मुझे लगता है कि यह ज्यादातर समय खत्म हो जाता है।
विभिन्न विशेषताओं के साथ कई डिबगर्स हैं, जिसके आधार पर आप चुनाव करते हैं। मेरी प्राथमिकताएँ प्री-चाल से संतुष्ट थीं जो थीं: