আপনার প্রোগ্রাম কতবার প্রথমবারেই আপনার ইচ্ছামতো কাজ করে?
অনেকসময় আমাদের প্রোগ্রাম আমাদের এক্সপেক্টেশন অনুযায়ী কাজ করে না, তাই আমাদের রুবি ডিবাগিং কലা ব্যবহার করতে হয় কেন হচ্ছে সেটা বের করার জন্য।
আপনি নিচের এরর মেসেজটি থেকে পরিচিত হতে পারেন:
undefined method 'some_method' for nil:NilClass
এই মানে একটি nil ভ্যালু আমাদের কোডে گھুসপেঠ করতে সফল হয়েছে।
এই আর্টিকেলে আলোচিত টেকনিকগুলো ব্যবহার করে আপনি শিখবেন কীভাবে এই সমস্যা এবং সাদৃশ্য সমস্যাগুলো হ্যান্ডেল করতে হয়!
এরর এবং স্ট্যাক ট্রেস বোঝা
যখন আপনি রুবি ইন্টারপ্রেটার থেকে একটি এরর পাচ্ছেন বা আপনার প্রোগ্রাম সেটি যা করা উচিত সেটা না করছে তখন আপনার ডিবাগিং হ্যাট पहনতে হবে।
যদি সমস্যা হয় আপনার প্রোগ্রাম ক্র্যাশ করছে, তবে এরর মেসেজে মনোযোগ দিতে হবে, যা সাধারণত কী ভুল হচ্ছে সেটার কlu দিয়ে থাকে।
এখানে একটি উদাহরণ:
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 ''
এটি হলো যাকে স্ট্যাক ট্রেস বলা হয়।
চলুন একসাথে এটিকে বিশ্লেষণ করি!
আমরা 탑 লাইন থেকে শুরু করি।
এটি হলো যেখানে আসল এররটি ঘটেছে, কিন্তু এটা মানে নয় এরর কন্ডিশনটি ইহান থেকেই ওরিজিনেট করেছে।
তবে, এটি আমাদের তদন্ত শুরু করার একটি ভালো পয়েন্ট।
ডিল হলো:
| টেক্সট | বিবরণ |
|---|---|
| /tmp/stack.rb:6 | ফাইল এবং লাইন নম্বর |
| in `method2‘ | মেথড নাম |
| undefined local variable or method ‘invalid_variable‘ | এরর মেসেজ |
| main:Object | ক্লাস নাম |
| (NameError) | এক্সেপশন নাম |
আপনি দেখতে পাচ্ছেন এই ভাবে ব্রেক ডাউন করলে এররটি সেটা ভয়ঙ্কর নয়।
ব্রব, আপনি এক্সেপশন লিস্ট এখানে পাবেন।
এখন:
স্ট্যাক ট্রেসের প্রথম লাইনের নিচের প্রতিটি লাইন আপনাকে বলে দেয় কোডটি এখানে কীভাবে পৌঁছেছে।
এটি বেসিক্যালি একটি মেথড চেইন, আপনি যদি নিচে যান তবে আপনার অ্যাপের মেইন মেথড পর্যন্ত পৌঁছাবেন।
এখানে একটি স্ট্যাক ট্রেস ডিল করার সাধারণ অ্যালগরিদম:
- স্ট্যাক ট্রেসের টপ লাইন পড়ুন
- যদি ফাইলটি আপনার প্রজেক্টের অংশ হয়: ফল্টিং ফাইলটি ইন্ডিকেটেড লাইন নম্বরে খুলুন। যদি না হয়, স্ট্যাক ট্রেসের নিচে যান যতক্ষণ না আপনি আপনার পরিচিত একটি ফাইলের রেফারেন্স পান
- দেখুন কিছু очеবিয়াস আউট করে কিনা এবং ফিক্স করুন (এরর মেসেজে উল্লেখিত জিনিসগুলো খুঁজুন)
- যদি এতে সাহায্য না হয় তবে আপনাকে আরও ইনফরমেশন খুঁজতে হবে, যেমন প্রভাবিত ভেরিয়েবলগুলোর ভ্যালু।
রুবি ডিবাগিং
সর্বাধিক বেসিক (যা বichel মানে না) ডিবাগিং টেকনিক जिससे আপনি সম্ভবত পরিচিত, সেটি হলো সাস্পেক্টেড ভেরিয়েবলগুলোর ভ্যালু ডাম্প করা।
রুবিতে আপনি এটা puts বা p দিয়ে করতে পারেন।
p ব্যবহার করা সমান puts 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 # এটি আমাদের বুক অবজেক্ট প্রিন্ট করবে book = find_book('POODR') p book # এটি nil প্রিন্ট করবে book.name # অনুমান করুন এরপর কী হবে!
Pry দিয়ে গভীরে খোদা
যখন আপনার চেক করার জন্য অনেক ভেরিয়েবল থাকে, সব জায়গায় puts যোগ করা খুব প্র্যাকটিক্যাল নাও হতে পারে।
সেক্ষেত্রে আপনাকে pry ট্রাই করা উচিত।
pry ব্যবহার করে আপনি আপনার কোডকে একটি নির্দিষ্ট লাইনে রোকতে পারেন (যাকে ব্রেকপয়েন্টও বলা হয়) এবং এটি আপনাকে একটি irb-লাইক এনভায়রনমেন্টে ড্রপ করবে, যেখানে আপনি আপনার প্রজেক্টের কনটেক্সটে রুবি কোড ইভ্যালুয়েট করতে পারবেন, বা অনেক উপকারী pry কমান্ড এক্সিকিউট করতে পারবেন।
pry ব্যবহার করা খুব সহজ:
আপনার যা লাইনে pry ব্রেকপয়েন্ট ইনস্টল করতে চান সেখানে binding.pry ড্রপ করুন।
আপনাকে pry আপনার প্রজেক্টে রিকোয়ার করতেও হবে (require 'pry')।
আপনি যদি শুধু সাময়িকভাবে করতে চান তবে আপনি আপনার রুবি স্ক্রিপ্টকে এভাবে কল করতে পারেন:
ruby -rpry app.rb
এটি রেইলস অ্যাপের জন্য ততো হেল্পফুল নয়, তাই আপনি আপনার Gemfile-এ pry যোগ করতে পারেন।
আমি যা করি সেটি হলো আমার এডিটরে একটি ম্যাক্রো/স্নিপেট রাখি যেটি ইতিমধ্যে require এবং ব্রেকপয়েন্ট একই লাইনে আছে, তাই যখন আমি এটি ডিলিট করব আমি দুটোই ডিলিট করব।
এটি হলো যা আপনি দেখবেন যখন আপনি একটি pry সেশনে ড্রপ হবেন:

আপনি যদি একটি pry সেশন সম্পূর্ণ কিয়ে বের হতে চান তবে আপনি exit! টাইপ করতে পারেন, আপনি যদি রেগুলার exit করেন তবে এটি আপনার প্রোগ্রামকে পরবর্তী ব্রেকপয়েন্ট পর্যন্ত চালাবে।
pry-এর পাওয়ার এখানেই শেষ হয় না। উদাহরণস্বরূপ, আপনি ls কমান্ড ব্যবহার করতে পারেন একটি অবজেক্টের কী মেথড এবং ইনস্ট্যান্স ভেরিয়েবল এক্সেস আছে সেটা देखने।

help কমান্ড রান করা ভুলবেন না সব গুডি পেতে!]
আরেকটি রুবি ডিবাগার: Byebug
Byebug pry-এর রিপ্লেসমেন্ট বা রুবির জন্য gdb-লাইক ডিবাগার হিসেবে কাজ করতে পারে।
আপনি যদি ফরমারটির জন্য এটি ব্যবহার করতে চান তবে আপনি শুধু byebug ড্রপ করুন binding.pry-এর বদলে যেখানে আপনি আপনার কোড রুকতে চান। Byebug প্রয়োগের একটি কন হলো এটি সিনট্যাক্স হাইলাইটিং দেয় না।
চলুন দেখি কীভাবে আপনি ব্রেকপয়েন্ট সেট করতে পারেন এবং byebug-এ আপনার কোড ডিবাগ করতে পারেন!
সাধারণত আপনি help কমান্ড কল করবেন, কিন্তু এই কেসে এটি কিছুটা ইনফো দিয়ে থাকে:

তাই আপনাকে ডকুমেন্টেশন কনসাল্ট করতে হবে।
আপনি দেখতে পাবেন কীভাবে break কমান্ড এবং একটি লাইন নম্বর দিয়ে আপনি আপনার ব্রেকপয়েন্ট সেট করতে পারেন।
ব্রেকপয়েন্টের লিস্ট পেতে আপনি info breakpoint ব্যবহার করতে পারেন।
একবার আপনার ব্রেকপয়েন্ট সেট হলে, আপনি নিচের কমান্ডগুলো ব্যবহার করে প্রোগ্রাম এক্সিকিউশন통 করে যেতে পারেন:
- step (এক ইনস্ট্রাকশন এডভান্স, মেথড কলগুলোতে ستيপ ইন)
- next (এক ইনস্ট্রাকশন এডভান্স, মেথডের ভেতরে না যায়)
- continue (এন্ড বা পরবর্তী ব্রেকপয়েন্ট পর্যন্ত রান)
আপনি যদি কমান্ড ছাড়া এন্টার টাইপ করেন তবে এটি শেষ কমান্ডটি রিপিট করবে, কোডের মধ্য দিয়ে হাঁটার সময় এটি খুব উপকারী।
যখন সব কিছু ফেল করে
নিশ্চিত করুন আপনি একটা ব্রেক নেন যখন আপনি khá সময় বিতিয়ে দিয়েছেন এবং সমাধান দেখতে পাচ্ছেন না, নতুন চোখে ফিরে আসলে আপনি বুঝতে পারবেন সমাধান আপনার সামনে ছিল। আপনি কাউকে সমস্যাটি ব্যাখ্যা করার চেষ্টা ও করতে পারেন।
কখনো কখনো আপনি নিশ্চিত নন সমস্যা কোথায়, যখন এটা হয় আপনার কাছে এখনও অনেক অপশন রয়েছে।
উদাহরণস্বরূপ, আপনি কোডের ব্লকগুলো কমেন্ট আউট করতে পারেন ইস্যুটা আইসোলেট করার চেষ্টায়।
যদি ইস্যুটা গায়েব হয় তবে আপনি কমেন্ট আউট করা কোডের একটি অংশ আনকমেন্ট করতে পারেন।
এটি একটি খুব লো-টেক সমাধান, কিন্তু এটি আপনার যা দরকার সেটি হতে পারে।
আপনি এতদূর এসেছেন এবং কিছুই সাহায্য করছে না মনে হলে:
বড় বন্দুক বের করার সময়।
এখানে কিছু সিস্টেম টুল রয়েছে যা আপনি খুব często হেল্পফুল পাবেন।
এই টুলগুলোর একটি হলো Wireshark, যা আপনাকে নেটওয়ার্ক ট্রাফিক ইন্সপেক্ট করতে দেবে।
আপনি যদি SSL-এনক্রিপ্টেড ট্রাফিকের সাথে ডील করেন তবে একটি mitm (Man in the middle) প্রক্সি যেন mitmproxy আপনাকে সাহায্য করতে পারে।
আপনি curl ট্রাই করতে পারেন আপনার টার্মিনাল থেকে HTTP কানেকশন ইনিশিয়েট করতে, যা আপনাকে ইনভ্যালিড সার্ভার রেসপন্স ডিবাগ করতে সাহায্য করতে পারে।
আরেকটি টুল যা জানা উপকারী হলো strace (লিনাক্স অনলি)।
Strace আপনাকে দেখাবে আপনার অ্যাপ যা সকল সিস্টেম কল করছে।
আপনি -e অপশন ব্যবহার করে স্পেসিফিক সিস্টেম কল ফিল্টার করতে পারেন। strace-এর একটি আধুনিক অল্টারনেটিভ হলো sysdig।
সতর্কতা! আপনি প্রোডাকশনে strace ব্যবহার এড়াতে চাইতে পারেন কারণ এটি সিস্টেমের পারফরম্যান্সকে तीক্ষ্ণভাবে ডিগ্রেড করে যা টেস্ট হচ্ছে।
শেষে, আপনি যদি এমন একটি ইস্যুর সাথে ডীল করছেন যা লাগছে কোনো এক্সটার্নাল জেম থেকে আসছে, একটি অনিবার্য স্টেপ হলো জেমের সোর্স কোড ইন্সপেক্ট করা।
আপনি gem open
উপসংহার
এভিন ডিবাগিং সবচেয়ে মজার এক্টিভিটি নয় এমনকি তবে অনেক টুল এবং টেকনিক রয়েছে যা আপনার জন্য এটাকে সহজ করে দিতে পারে, সেগুলো ব্যবহার করুন আপনাকে সাহায্য করতে।
দয়া করে এই পোস্ট শেয়ার করুন আপনি যদি এটিকে এনজয় করেন যাতে আরও মানুষ শিখতে পারে! 🙂
ধন্যবাদ।