রুবি স্ক্রিপ্টগুলি কীভাবে ডিবাগ করবেন [বন্ধ]


153

আমি নিম্নলিখিত রুবি কোডটি ইন্টারনেট থেকে অনুলিপি করেছি এবং কয়েকটি পরিবর্তন করেছি তবে এটি কার্যকর হয় না।

নিজে থেকে প্রোগ্রামটি ডিবাগ করতে আমি কী করতে পারি?


1
পুনরায় খুলতে ভোট। ওপি স্পষ্টভাবে জিডিবি -র মতো ধাপে ডিবাগ চায়।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

উত্তর:


145

প্রাই ( গিটহাব ) ব্যবহার করুন ।

এর মাধ্যমে ইনস্টল করুন:

$ gem install pry
$ pry

তারপর যোগ:

require 'pry'; binding.pry

আপনার প্রোগ্রামের মধ্যে।

এর মতো pry0.12.2 তবে, কোন গৌণ যেমন কমান্ড হয় next, breakইত্যাদি অন্যান্য বেশ কয়েকটি রত্ন অতিরিক্ত এই প্রদান, উদাহরণস্বরূপ দেখুন pry-byedebug


10
আমি প্রাই (অবশ্যই একটি লাইফ চেঞ্জার!) ব্যবহার করার পরামর্শ দিচ্ছি .. আপনার প্রোগ্রামে একবার ইনস্টল হয়ে গেলে এবং প্রয়োজনীয় হয়ে যাওয়ার পরে ব্রেকআপপয়েন্ট সেট করা লেখার মতোই সহজ binding.pry। এটি রঙিন সমাপ্তি, ডকুমেন্টেশন সন্ধান, এবং কোনও পদ্ধতি গতিশীলভাবে সম্পাদনা এবং পুনরায় লোড করার সম্ভাবনা সহ আসে ..
Andrea Fiore

5
প্রাইয়ের হোমপেজটি এখানে পাওয়া যায়: pryrepl.org
শেডবিক

4
Pry/ byebugদুর্দান্ত, তবে ডিবাগ করার সময় আপনার প্রথম পদক্ষেপ হিসাবে নয়। বেশিরভাগ ক্ষেত্রে, একটি ব্যতিক্রম উত্থাপন raise object.inspectকোনও আইআরবি সেশন খোলার চেয়ে আপনার সমস্যাটি দ্রুত সমাধান করবে। আমি কেবলমাত্র কনসোল ডিবাগারগুলি ব্যবহার করার পরামর্শ দিই যে আরও একবার ব্যতিক্রম উত্থাপনের মতো সহজ সমাধানগুলি আপনার সমস্যার সমাধান করতে অক্ষম।
কেলসি হান্নান

3
একক-পদক্ষেপের কোডের সাথে pryকী উপায় আছে ? কীভাবে করব তা আমি খুঁজে পেলাম না; এবং এটিই আমি একটি ডিবাগারের প্রত্যাশা করি।
জেপাজাজো

2
@ জেপতাজ্জো হ্যাঁ, 'পরের' টাইপ করে
মারকবেস্ট

114
  1. রুবিতে:

    ruby -rdebug myscript.rb 

    তারপর,

    • b <line>: ব্রেক ব্রেক পয়েন্ট
    • এবং n(ext)বা s(tep)এবংc(ontinue)
    • p(uts) প্রদর্শনের জন্য

    (পার্ল ডিবাগের মতো)

  2. কারাগারে: এর সাথে সার্ভারটি চালু করুন

    script/server --debugger

    এবং debuggerকোড যুক্ত করুন।


7
-ডিডিবাগ আবর্জনা। এবং অবিস্মরণীয়। প্রাই ব্যবহার করুন (অন্যান্য উত্তর দেখুন)।
স্নো ক্র্যাশ

3
@ স্নো ক্র্যাশ - আপনি কেন -r debugএটি আবর্জনা বলছেন ?
স্মিথ

8
-rdebug সহ: ডিবাগ করার জন্য উত্স ফাইল পরিবর্তন করার দরকার নেই
জার্মানিলাকস

2
একটি নতুন রুবি / রেল অ্যাপ্লিকেশনগুলির জন্য, প্রাই সঠিক উত্তর। তবে আমি facetsরত্নের প্রয়োজনীয়তার নির্দিষ্ট সংস্করণ সহ একটি রেলস ২.২ অ্যাপ্লিকেশনটিতে চালানোর জন্য প্রাইয়ের একটি প্রাচীন সংস্করণ সন্ধানের জন্য এক ঘন্টা সময় ব্যয় করেছি এবং এটি ব্যর্থ হয়েছিল। প্রাচীন রেল অ্যাপসের ruby-debugজন্য কিছুটা কদর্য হলেও কাজটি হয়ে যায়।
অ্যাবে ভোলেকার

56

হিসাবে সুপারিশ সুপারিশ: ব্যবহার pry! আমি কেবল এই বিষয়ে একমত হতে পারি।

পিআরএব আইআরব চেয়ে অনেক ভাল repl।

আপনি যোগ করা প্রয়োজন

require 'pry'

আপনার উত্স ফাইলটিতে এবং তারপরে যোগ করে আপনার উত্স কোডে একটি ব্রেকপয়েন্ট .োকান

binding.pry

যে জায়গাগুলিতে আপনি জিনিসগুলি দেখতে চান সেই স্থানে (এটি ক্লাসিক আইডিই পরিবেশে ব্রেকপয়েন্টটি ট্রিগার করার মতো)

আপনার প্রোগ্রাম একবার হিট

binding.pry

লাইন, আপনার ডানদিকে আপনার প্রোগ্রামের সমস্ত প্রসঙ্গের সাথে ডানদিকে সরাসরি প্রাইপ রিপ্লেলে ফেলে দেওয়া হবে, যাতে আপনি কেবল চারপাশের সমস্ত কিছু অন্বেষণ করতে পারবেন, সমস্ত বিষয়গুলি তদন্ত করতে পারবেন, রাষ্ট্র পরিবর্তন করতে পারবেন এবং এমনকি ফ্লাইতে কোড পরিবর্তন করতে পারবেন।

আমি বিশ্বাস করি আপনি বর্তমানে যে পদ্ধতিতে রয়েছেন তার কোডটি আপনি পরিবর্তন করতে পারবেন না, তাই দুঃখের সাথে আপনি পরের লাইনটি কার্যকর করতে পারবেন না। তবে ভাল রুবি কোড যেভাবেই একক লাইন হয়ে থাকে ;-)


30

ব্যতিক্রম উত্থাপন দ্বারা ডিবাগ হয় অনেক সহজ মাধ্যমে অক্ষিবিকূর্ণন চেয়েprintলগ বিবৃতি, এবং সবচেয়ে বাগগুলির জন্য তার সাধারণত অনেক দ্রুত মতো irb ডিবাগার খোলার আপ চেয়েpryবাbyebug। এই সরঞ্জামগুলি সর্বদা আপনার প্রথম পদক্ষেপ হওয়া উচিত নয়।


রুবি / রেলগুলি দ্রুত ডিবাগ করুন:

1. দ্রুত পদ্ধতি: Exceptionতারপরে এবং .inspectএর ফলাফল উত্থাপন করুন

দ্রুততম ডিবাগ পথে রুবি (বিশেষ করে পাগল) কোড হয় raiseযখন কলিং আপনার কোড সঞ্চালনের পথ বরাবর একটি ব্যতিক্রম .inspectপদ্ধতি বা বস্তুর (যেমন উপর foo):

raise foo.inspect

উপরের কোডে, এমন raiseএকটি ট্রিগার করে Exceptionযা আপনার কোডটির সম্পাদন বন্ধ করে দেয় এবং এমন একটি ত্রুটি বার্তা দেয় যা আপনি ডিবাগ করার চেষ্টা করছেন সেই লাইনে .inspectঅবজেক্ট / পদ্ধতি (ie foo) সম্পর্কে সহজেই তথ্য রয়েছে contains

এই কৌশলটি কোনও অবজেক্ট বা পদ্ধতিটি দ্রুত পরীক্ষা করার জন্য ( উদাহরণস্বরূপ এটি nilকি? ) এবং তাৎক্ষণিকভাবে নিশ্চিত করার জন্য কোডের একটি লাইন কোনও নির্দিষ্ট প্রসঙ্গে পুরোপুরি কার্যকর করা হচ্ছে কিনা।

২. ফ্যালব্যাক: একটি রুবি আইআরবি ডিবাগারের মতো byebugবা ব্যবহার করুনpry

আপনার কোডগুলি কার্যকর করার প্রবাহের অবস্থা সম্পর্কে আপনার কেবলমাত্র কোনও রুবি রত্ন আইআরবি ডিবাগারের দিকে যাওয়ার বিষয়ে বিবেচনা করা উচিত pryবা byebugআপনি যেখানে মৃত্যুদন্ড কার্যকর করার পথের মধ্যে অবজেক্টগুলির স্থানে আরও গভীরভাবে আবিষ্কার করতে পারেন।


সাধারণ সূচনা পরামর্শ

আপনি যখন কোনও সমস্যা ডিবাগ করার চেষ্টা করছেন, তখন সর্বদা ভাল পরামর্শটি হ'ল: @ # $ ত্রুটি বার্তাটি পড়ুন (আরটিএফএম)

এর অর্থ হ'ল ত্রুটি বার্তাগুলি সাবধানতার সাথে এবং সম্পূর্ণরূপে অভিনয়ের আগে পড়া যাতে আপনি বুঝতে চান এটি আপনাকে কী বলার চেষ্টা করছে। আপনি যখন ডিবাগ করেন, ত্রুটি বার্তাটি পড়ার সময় এই ক্রমে নিম্নলিখিত মানসিক প্রশ্নগুলি জিজ্ঞাসা করুন :

  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, ত্রুটির অংশটি পুরোপুরি অনুপস্থিত যা ইঙ্গিত দেয় যে বস্তুটি ভুল শ্রেণীর (এই ক্ষেত্রে: শূন্য)। এটি সম্পূর্ণরূপে ত্রুটি বার্তাগুলি পড়ে সহজেই এড়ানো যায় এমন একটি ভুল।

সারসংক্ষেপ:

কোনও ডিবাগিং শুরু করার আগে সর্বদা সতর্কতার সাথে পুরো ত্রুটি বার্তাটি পড়ুন । এর অর্থ: সর্বদা ত্রুটি বার্তায় কোনও শ্রেণীর শ্রেণীর ধরণটি প্রথমে পরীক্ষা করুন , তারপরে এর পদ্ধতিগুলি , আপনি কোনও স্ট্যাকট্রেস বা কোডের লাইনটিতে স্যুথিং শুরু করার আগে যেখানে আপনার মনে হয় ত্রুটি ঘটতে পারে। এই 5 সেকেন্ড আপনাকে হতাশার 5 ঘন্টা বাঁচাতে পারে।

tl; dr: মুদ্রণ লগগুলিতে স্কুইন্ট করবেন না: ব্যতিক্রম বাড়াতে বা পরিবর্তে একটি আইআরবি ডিবাগার ব্যবহার করুন। ডিবাগ করার আগে সাবধানে ত্রুটিগুলি পড়ে খরগোশের গর্তগুলি এড়িয়ে চলুন।


3
যদিও আমি আপনার সাথে একমত যে মুদ্রণ লগগুলি পড়া বিরক্তিকর, তবুও আমি মনে করি যে প্রথমে ডিবাগারটি ব্যবহার না করার পরামর্শ দেওয়া খুব খারাপ পরামর্শ। ব্রেকপয়েন্ট পয়েন্ট যুক্ত করা এবং এটি ট্রিগার করা ঠিক একটি ব্যতিক্রম উত্থাপনের সমান প্রচেষ্টা তবে এটি আপনাকে অ্যাপ্লিকেশনটির বর্তমান অবস্থার একটি সম্পূর্ণ দর্শন দেয়। সন্দেহজনক রাজ্যটি পরিদর্শন করার ফলাফল হিসাবে যদি আর কোনও প্রশ্ন আসে তবে আপনি আর একটি ব্যতিক্রম যুক্ত করার পরিবর্তে এবং অ্যাপ্লিকেশনটি পুনরায় চালু করার পরিবর্তে ইন্টারেক্টিভভাবে ড্রিল করতে পারেন।
প্যাট্রিক আর।

2
@PatrickR। আমার অভিজ্ঞতায় আইআরবি ডিবাগারগুলি যখন আপনার কোডটিতে কোন সমস্যাটি ঠিক সেখানে রয়েছে ঠিক তখনই চেষ্টা করার চেষ্টা করা ভাল নয় । অনেকগুলি আইআরবি ব্রেকপয়েন্টগুলি যুক্ত করা এবং অপসারণ ব্যতিক্রমগুলি যুক্ত করার চেয়ে বেশি সময় নেয় এবং আপনার কোডের নিয়ন্ত্রণ প্রবাহ সম্পর্কে ব্যতিক্রমগুলি যেমন খারাপ অনুমানগুলি ছাঁটাইয়ের সাথে ব্যতিক্রমগুলি করতে পারে সে বিষয়ে সুনির্দিষ্ট উত্তর দেবেন না। আইআরবি ব্রেকপয়েন্টগুলি ভুলে যাওয়া সহজ, অনুরোধগুলি স্থগিত হওয়ার পরে বিভ্রান্তি সৃষ্টি করে। সমস্যাটি ঠিক কোথায় রয়েছে তা যদি আপনি জানেন এবং তার রাষ্ট্রটি ডিবাগ করার দরকার রয়েছে তবে অবশ্যই, একটি আইআরবি ডিবাগার দিয়ে শুরু করুন। তবে প্রায়শই এটি সত্য হয় না।
কেলসি হান্নান

1
Hah! ত্রুটি বার্তাগুলি পড়া রুবির পক্ষে সহায়ক, তবে অন্যান্য স্ক্রিপ্টিং ভাষা? বিরক্তি না দেওয়ার জন্য আমি ওপিকে দোষ দিতে পারি না।
kayleeFrye_onDeck

1
আমার প্রাথমিক প্রতিক্রিয়া @ পেট্রিকআর এর অনুরূপ, তবে আমি যাইহোক এটি চেষ্টা করেছি। শেষ পর্যন্ত, আমি এটিকে খারাপ পরামর্শ বলে মনে করি, বা হতে পারে সেরা আলোতে, পরামর্শটি আমার চেয়ে আলাদা ব্যবহারের ক্ষেত্রে তৈরি করা হয়েছে। বিশেষত একটি ক্ষেত্রে যেখানে (ক) রেলগুলি ব্যবহার না করা এবং (খ) এর একটি ভুল ফলাফল রয়েছে তবে কোনও ত্রুটি বা ব্যতিক্রম উত্থাপিত হয়নি, অর্থাত কোডটি একটি সংখ্যাকে গণনা করে, এটি কেবল ভুল নম্বর। পুনরায় চালু এবং পুনরায় চালিয়ে যেতে হবে এমন কাজটি অন্যথায় ক্র্যাশ কার্যকর করতে পারে এমন কোনও প্রোগ্রামটি কোথায় করা যায় তা পুনরুদ্ধার করে অনুমান করার চেষ্টা করা strategy প্রতিটি চক্রের নিজস্ব শুরুর সময়টি নষ্ট হয়।
ইট

20
  1. যখনই সম্ভব ভেরিয়েবলগুলি মুদ্রণ করুন। (একে প্রিন্টফ ডিবাগিং বলা হয়) আপনি এটি চালিয়ে করতে পারেন

    STDERR.puts x.inspect

    অথবা

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

    আপনি যদি এটিকে টাইপ করা সহজ করতে চান তবে আপনি উদাহরণ রত্নটি ব্যবহার করতে পারেন ।

  2. সতর্কতা চালু করুন। আপনি যদি দৌড়তে থাকেন rubyতবে এটি -wসুইচ দিয়ে চালান (উদাঃ ruby -w script.rb)। যদি আপনি এটি আইআরবি থেকে চালাচ্ছেন, এবং আপনি ১.৯.২০ এর আগে রুবীর একটি সংস্করণ ব্যবহার করছেন $VERBOSE = trueতবে আপনার সেশনটির শুরুতে টাইপ করুন। আপনি যদি কোনও উদাহরণ ভেরিয়েবলের ভুল বানান করে থাকেন, একবার সতর্কতা শুরু হলে আপনি পাবেন

    সতর্কতা: দৃষ্টান্ত পরিবর্তনশীল @valeusআরম্ভ হয় না

  3. বাইনারি চপের ধারণাটি বুঝুন (নিম্নোক্ত উক্তিটি একটি এগ্রিল ডেভেলপারের অনুশীলনসমূহ থেকে )

    সমস্যার জায়গাকে অর্ধেক ভাগ করুন এবং দেখুন কোন অর্ধেকটিতে সমস্যা রয়েছে contains তারপরে সেই অর্ধেকটি আবার ভাগ করুন এবং পুনরাবৃত্তি করুন।

  4. আপনি যদি বাইনারি চপ দিয়ে সফল হন তবে আপনি দেখতে পাবেন যে একটি একক লাইন রয়েছে যা আপনি যা আশা করেন তা করেন না। উদাহরণ স্বরূপ

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

    falseআপনি যদি ভাবেন যে এটি ফিরে আসবে তার একটি মান দেয় true। সেক্ষেত্রে আপনি ডকুমেন্টেশনটি দেখতে চাইতে পারেন। ডকুমেন্টেশনের জন্য ওয়েবসাইটগুলিতে রুবি ডক.অর্গ.অর্গ বা এপিআইডক অন্তর্ভুক্ত রয়েছে । পরেরটির ক্ষেত্রে, আপনি টাইপ চাই include?উপরের ডান দিকের কোণায় কাছাকাছি বিবর্ধক কাচ পাশে চয়ন include?যা হয়েছে Arrayতা নীচে (আপনি কোন ক্লাসে জানি না যদি [1, 2, 3], প্রকার [1, 2, 3].classirb মধ্যে), এবং আপনার সাথে যোগাযোগ অন্তর্ভুক্ত? (অ্যারে) , যা এটি কী করে তা বর্ণনা করে।

    তবে, যদি ডকুমেন্টেশনটি সহায়তা না করে, আপনি একটি নির্দিষ্ট লাইন কীভাবে করা উচিত নয় সে বিষয়ে কোনও প্রশ্ন জিজ্ঞাসা করতে পারেন তবে পুরো স্ক্রিপ্টটি কী করছে না তার চেয়ে আপনি খুব ভাল উত্তর পেতে পারেন more এটা করা উচিত।


7

সমস্ত জিনিস মুছে দেয়

2017 ^ _ ^ এ আপনাকে স্বাগতম ^

ঠিক আছে, সুতরাং আপনি যদি নতুন আইডিই চেষ্টা করার বিরোধিতা না করেন তবে নিচের দিকে নিখরচায় করতে পারেন ।

দ্রুত নির্দেশাবলী

  1. Vscode ইনস্টল করুন
  2. আপনার যদি ইতিমধ্যে না থাকে তবে রুবি দেব কিট ইনস্টল করুন
  3. Vscode এর জন্য রুবি, রুবি-লিংটার এবং রুবি-রুবোকপ এক্সটেনশন ইনস্টল করুন
  4. ম্যানুয়ালি ইনস্টল যাই হোক না কেন রত্ন rubyide / vscode-রুবি নির্দিষ্ট করে , প্রয়োজন হলে
  5. আপনার কনফিগার launch.jsonব্যবহার করতে "cwd"এবং এবং "program" ক্ষেত্র ব্যবহার {workspaceRoot}ম্যাক্রো
  6. নামক একটি ক্ষেত্র যুক্ত করুন "showDebuggerOutput"এবং সেট করুনtrue
  7. আপনার ডিবাগ পছন্দ হিসাবে সর্বত্র ব্রেকপয়েন্টগুলি সক্ষম করুন "debug.allowBreakpointsEverywhere": true

বিস্তারিত নির্দেশাবলী

  1. ভিজ্যুয়াল স্টুডিও কোড ওরফে ডাউনলোড করুন vscode; এটি ভিজ্যুয়াল স্টুডিওর মতো নয় । এটি বিনামূল্যে, হালকা ওজন এবং সাধারণভাবে ইতিবাচকভাবে বিবেচিত।
  2. রুবি দেব কিট ইনস্টল করুন; আপনার রেপোতে আপনাকে এখানে নির্দেশিকা অনুসরণ করতে হবে: https://github.com/oneclick/rubyinstaller/wiki/De વિકાસment- কিট
  3. এরপরে আপনি হয় ওয়েব ব্রাউজারের মাধ্যমে বা আইডিইর ভিতরে এক্সটেনশন ইনস্টল করতে পারেন; এটি আইডিইর ভিতরে। আপনি যদি অন্যটি চয়ন করেন তবে আপনি এখানে যেতে পারেন । Vscode এর এক্সটেনশন অংশে নেভিগেট করুন; আপনি এটি বেশ কয়েকটি উপায়ে করতে পারেন তবে সর্বাধিক ভবিষ্যতের প্রুফ পদ্ধতিটি সম্ভবত হিট হবে F1এবং এক্সটেনশানসext নামে একটি বিকল্প পাওয়া না যাওয়া অবধি টাইপ করা হবে : এক্সটেনশানগুলি ইনস্টল করুন উপলভ্য হবে। বিকল্পগুলি CtrlShiftxহ'ল উপরের মেনু বার থেকে,View->Extensions
  4. এরপরে আপনি নিম্নলিখিত এক্সটেনশনগুলি চাইবেন; এগুলি ১০০% প্রয়োজনীয় নয়, তবে কিছু সিদ্ধান্ত দেওয়ার পরে আমি কী রাখব তা সিদ্ধান্ত নেব:
    • রুবি; এক্সটেনশন লেখক পেং এলভি
    • রুবি-rubocop; এক্সটেনশন লেখক মিসোগি
    • রুবি-Linter; এক্সটেনশন লেখক কডি হুভার
  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- নির্ভরতা
  2. আপনি সম্ভবত আপনি যেখানে চান ব্রেকপয়েন্টগুলি রাখার ক্ষমতা চাইবেন; এই বিকল্পটি সক্ষম না করা বিভ্রান্তির কারণ হতে পারে। এটি করতে, আমরা উপরের মেনু বারে যাব এবং File->Preferences->Settings(বা Ctrl,) নির্বাচন করব এবং আপনি Debugবিভাগে পৌঁছা পর্যন্ত স্ক্রোল করব । এটি প্রসারিত করুন এবং নামক একটি ক্ষেত্রটি সন্ধান "debug.allowBreakpointsEverywhere"করুন - সেই ক্ষেত্রটি নির্বাচন করুন এবং ছোট পেন্সিল দেখাচ্ছে আইকনে ক্লিক করুন এবং সেট করুন true

এই সমস্ত মজাদার স্টাফ করার পরে, আপনার 2017 সালের মাঝামাঝি এবং গাer় থিমের জন্য অনুরূপ একটি মেনুতে ব্রেকপয়েন্টগুলি সেট করতে এবং ডিবাগ করতে সক্ষম হওয়া উচিত: এখানে চিত্র বর্ণনা লিখুনআপনার কল স্ট্যাক, ভেরিয়েবল ভিউয়ার ইত্যাদির মতো সমস্ত মজাদার জিনিস সহ break

বৃহত্তম পিআইটিএ হ'ল 1) প্রাক-রিক্স ইনস্টল করা এবং 2) .vscode\launch.jsonফাইলটি কনফিগার করার জন্য মনে রাখা । কেবলমাত্র # 2 এর ভবিষ্যতের প্রকল্পগুলিতে কোনও লাগেজ যুক্ত করা উচিত এবং আপনি উপরের তালিকাভুক্ত জেনেরিক পর্যায়ে কনফিগার করতে পারবেন। সম্ভবত আরও সাধারণ কনফিগারেশন অবস্থান রয়েছে, তবে আমি আমার মাথার উপরের অংশটি জানি না।


এটি এখন 2018 😉 তবে দুর্ভাগ্যক্রমে, আপনি এখানে তালিকাভুক্ত প্লাগইনগুলি ব্যবহার করে আপনি এখনও ইউনিট পরীক্ষাটি ডিবাগ করতে পারবেন না 😕 বেশ দুঃখজনক।
MonsieurDart

1
@ মনসিয়ারডার্ট যখন আমি এটি লিখেছিলাম, এটি রুবি স্ক্রিপ্টগুলির বেসিক ডিবাগিংয়ের জন্য ছিল। আমি ইউনিট টেস্ট সম্পর্কে বিশেষভাবে কোনও কিছুর সাথে পরিচিত নই। যদি এই উত্তরটি ভুল বা পুরানো হয়, দয়া করে আমাকে কীসের দিকে মনোযোগের প্রয়োজন এবং কোনও প্রক্রিয়া যা প্রক্রিয়াটি গতি বাড়িয়ে তুলতে সহায়তা করতে পারে তা আমাকে জানান।
kayleeFrye_onDeck

আরে @KayleeFrye_onDeck! আপনার প্রতিক্রিয়া দুর্দান্ত, আমি আপনাকে সম্পূর্ণরূপে এটি দিতে। তবে, গতবার আমি ভিএসসির জন্য পেং এলভিয়ের রুবি প্লাগইনটি পরীক্ষা করেছিলাম, এটি ইউনিট পরীক্ষার (বা অন্য কোনও পরীক্ষার) জন্য ব্রেকপয়েন্টগুলি সেট করতে সক্ষম হয় নি। এটি প্লাগইনের অন্যতম সীমাবদ্ধতা ছিল। আমি মনে করি লোকেরা তাদের ভিএসসি-র উদাহরণটি কনফিগার করার চেষ্টা করার আগে এটি জানতে হবে: এটি সময় নেয় এবং, অনেকের পক্ষে, টেস্ট চালানো কোডটি লেখার এবং ডিবাগ করার এক নম্বর উপায়। 😊
মনসিয়রডার্ট

6

আমাদের কোডটি ডিবাগ করার জন্য এই মুহুর্তে সঠিক সরঞ্জামটি বাছাই করার জন্য, আমি এই ভিডিওটিকে দৃ strongly়ভাবে প্রস্তাব দিচ্ছি।

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

ব্যক্তিগতভাবে, আমি এই ভিডিওতে দুটি বড় বিষয় হাইলাইট করব।

  • প্রাই ডিবাগ ডেটার জন্য দুর্দান্ত, "পিআর একটি ডেটা এক্সপ্লোরার" (sic)
  • ডিবাগারটি ধাপে ধাপে ডিবাগ করা ভাল বলে মনে হচ্ছে।

এটাই আমার দুই সেন্ট!


6

অন্যান্য সমস্ত উত্তর ইতিমধ্যে প্রায় সমস্ত কিছু দেয় ... কেবলমাত্র একটি সামান্য সংযোজন।

আপনি যদি আরও কিছু আইডিই-জাতীয় ডিবাগার (নন-সিএমআই) চান এবং ভিমকে সম্পাদক হিসাবে ব্যবহার করতে ভয় পান না, তবে আমি এর জন্য ভিম রুবি ডিবাগার প্লাগইনটি প্রস্তাব করছি।

এর ডকুমেন্টেশনটি বেশ সোজা, সুতরাং লিঙ্কটি অনুসরণ করুন এবং দেখুন। সংক্ষেপে, এটি আপনাকে সম্পাদকের বর্তমান লাইনে ব্রেকপয়েন্ট নির্ধারণ করতে, বিরতিতে নিফটি উইন্ডোতে স্থানীয় ভেরিয়েবলগুলি দেখতে, উপরে / উপরে পদক্ষেপ - প্রায় সমস্ত সাধারণ ডিবাগার বৈশিষ্ট্যগুলিকে অনুমতি দেয়।

আমার কাছে রেলস অ্যাপটি ডিবাগ করার জন্য এই ভিআইএম ডিবাগারটি ব্যবহার করা বেশ উপভোগ্য ছিল যদিও রেলের সমৃদ্ধ লগার ক্ষমতাগুলি এর প্রয়োজনীয়তা প্রায় শেষ করে দেয়।


6

আমি সবেমাত্র এই রত্নটি আবিষ্কার করেছি (এমআরআই রুবি ২.০++ এর জন্য প্রাইকে একটি ডিবাগারে পরিণত করে)

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এটি একটি দুর্দান্ত শুরুর জায়গা যুক্ত করব। ছোট প্রশ্নবিদ্ধ অংশগুলির সাথে আইআরবি ব্যবহার করার চেষ্টা করুন। আমি রুবি-ডিবাগ (রুবি ১.৯++ এর জন্য রুবি-ডিবাগ ১৯) পছন্দ করি কারণ এটি চলমান প্রোগ্রামটি থামানো, ভেরিয়েবলগুলি পরীক্ষা করে নেওয়া, আইআরবিতে ফেলে রাখা এবং তারপরে চালিয়ে যাওয়া সহজ করে তোলে।
টিন ম্যান

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

রুবি ২.৪.০ অনুসারে, যে কোনও রুবি প্রোগ্রামের মাঝখানে আইআরবি রিপল অধিবেশন শুরু করা সহজ। আপনি যে প্রোগ্রামটি ডিবাগ করতে চান সেই বিন্দুতে এই লাইনগুলি রাখুন:

require 'irb'
binding.irb

আপনি রুবি কোড চালাতে এবং স্থানীয় ভেরিয়েবলগুলি মুদ্রণ করতে পারেন। quitসিআরটিএল + ডি টাইপ করুন বা আরপিএল শেষ করতে এবং রুবি প্রোগ্রামটি চালিয়ে যেতে দিন।

এছাড়াও আপনি ব্যবহার করতে পারেন putsএবং pআপনার প্রোগ্রাম থেকে মানগুলি প্রিন্ট আউট করতে যেমন চলছে।


4

আপনি যদি রুবিমাইন ব্যবহার করছেন , রুবি স্ক্রিপ্টগুলি ডিবাগ করা সহজ এবং সোজা।

মনে করুন আপনার কাছে একটি রুবি স্ক্রিপ্ট হ্যালো_ওয়ার্ল্ড.আরবি রয়েছে

1. ব্রেকপয়েন্টগুলি সেট করুন

নীচের মত 6 লাইনে একটি ব্রেকপয়েন্ট সেট করুন।

এখানে চিত্র বর্ণনা লিখুন

2. ডিবাগিং শুরু করুন

এখন আপনি স্ক্রিপ্টটি চালাতে ডিবাগারটি শুরু করতে পারেন:

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

৩. ভেরিয়েবল ইত্যাদি পরিদর্শন করুন

তারপরে যখন এক্সিকিউশন কোনও ব্রেকপয়েন্টে হিট হয়, আপনি ভেরিয়েবল ইত্যাদি পরিদর্শন করতে সক্ষম হবেন

এখানে চিত্র বর্ণনা লিখুন

আপনার রেফারেন্সের জন্য আরও তথ্য

  1. আপনি যদি রিমোট ডিবাগিং করতে রুবিমাইন ব্যবহার করতে চান তবে আপনি এটি করতে পারেন।
  2. আপনি যদি কোনও ডকারের অভ্যন্তরে চলমান দূরবর্তী ডিবাগ রেলগুলিতে রুবিমাইন ব্যবহার করতে চান তবে এটিও সোজা।

রুবিমাইনে কী আমাদের বাহ্যিক লাইব্রেরিগুলি ডিবাগ করার কোনও উপায় আছে?
Am33d

2

প্রিন্টফ ডিবাগিং

ডিবাগিং কৌশলগুলি নিয়ে সর্বদা একটি বিতর্ক ছিল, কিছু লোক মুদ্রণ বিবৃতি দিয়ে ডিবাগ করতে পছন্দ করে, আবার কেউ কেউ ডিবাগারের সাথে গভীর খনন করতে পছন্দ করে।

আমি আপনাকে উভয় পদ্ধতির চেষ্টা করার পরামর্শ দিচ্ছি।

প্রকৃতপক্ষে পুরানো ইউনিক্সের একজন সম্প্রতি বলেছিলেন, প্রিন্টফ ডিবাগিংটি তার জন্য কিছু পর্যায়ে যাওয়ার দ্রুততর উপায় ছিল।

তবে আপনি যদি কোনও চাকরিতে নতুন হন এবং কোডের একটি বড় অঙ্ক বুঝতে হবে তবে সেখানে কিছুটা ব্রেকপয়েন্ট রেখে এখানে কীভাবে এটি কাজ করে তা চালিয়ে যাওয়া সত্যই কার্যকর।

কোডটি বুনা কীভাবে তা আপনাকে কিছুটা বোঝার দরকার।

আপনি যদি কিছু অন্যান্য লোকের সফ্টওয়্যার থেকে নতুন হন তবে এটি আপনাকে সেখান থেকে পা রাখতে সহায়তা করতে পারে।

তারা এটিকে চালাক উপায়ে সাজিয়েছে কিনা তা আপনি খুব শীঘ্রই খুঁজে পাবেন বা যদি তা কেবল বিষ্ঠা।


এটি কোনও সন্দেহ ছাড়াই সেরা উত্তর ,,, এটি নির্ভর করে
20 ই

2

ঠিক আছে, রুবি স্ট্যান্ডার্ড লিবিবের একটি সহজে জিডিবি -র মতো কনসোল ডিবাগার ব্যবহার করা যায়: http://ruby-doc.org/stdlib-2.1.0/libdoc/debug/rdoc/DEBUGGER__.html কোনও অতিরিক্ত রত্ন ইনস্টল করার দরকার নেই। রেল স্ক্রিপ্টগুলিও সেভাবে ডিবাগ করা যায়।

যেমন

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

1

সমস্ত ডিবাগারের মা প্লেইন পুরানো প্রিন্ট স্ক্রিন। বেশিরভাগ সময়, আপনি সম্ভবত কিছু সাধারণ বিষয়গুলিই পরিদর্শন করতে চান, একটি দ্রুত এবং সহজ উপায় এরকম:

@result = fetch_result

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

এটি সহজ শনাক্তকরণের জন্য সামনে একটি লাইনের সাহায্যে @ ফলাফলের সামগ্রীগুলি মুদ্রণ করবে।

বোনাস যদি আপনি রেলের মতো অটোল্যাড / পুনরায় লোড সক্ষম কাঠামো ব্যবহার করেন তবে আপনাকে নিজের অ্যাপ্লিকেশনটি পুনরায় আরম্ভ করার প্রয়োজন হবে না। (ফ্রেমওয়ার্ক নির্দিষ্ট সেটিংসের কারণে আপনি যে ডিবাগিং করছেন কোডটি পুনরায় লোড করা হয়নি)

আমি এটি আমার জন্য ব্যবহারের 90% ক্ষেত্রে কাজ করে দেখি। আপনি রুবি-ডিবাগও ব্যবহার করতে পারেন, তবে আমি এটি বেশিরভাগ সময় ওভারকিলকে পাই।


1

বিভিন্ন বৈশিষ্ট্যযুক্ত অনেকগুলি ডিবাগার রয়েছে যার ভিত্তিতে আপনি পছন্দ করেন। আমার অগ্রাধিকারগুলি পিআর-মুভসে সন্তুষ্ট ছিল যা ছিল:

  • কীভাবে ব্যবহার করবেন সে সম্পর্কে দ্রুত বোধগম্য তথ্য
  • স্বজ্ঞাত পদক্ষেপগুলি (ব্লকগুলিতে সহজ পদক্ষেপের মতো)
  • "পিছনে পদক্ষেপ" (পিআর-মুভস আংশিকভাবে প্রয়োজনটি পূরণ করে)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.