আপনি প্রথমবার যা চান তা ঠিক কতবার আপনার প্রোগ্রাম করে?
অনেক সময় আমাদের প্রোগ্রামগুলি আমাদের প্রত্যাশা মতো কাজ করে না, তাই আমাদের রুবি ডিবাগিং এর শিল্প ব্যবহার করতে হবে কারণ খুঁজে বের করতে আমাদের সাহায্য করার জন্য৷
৷আপনি নিম্নলিখিত ত্রুটি বার্তার সাথে পরিচিত হতে পারেন:
nil:NilClass এর জন্য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 ''
এটিই স্ট্যাক ট্রেস হিসাবে পরিচিত৷
৷আসুন একসাথে এটি বিশ্লেষণ করি!
আমরা উপরের লাইন দিয়ে শুরু করি।
এখানেই প্রকৃত ত্রুটি ঘটেছে, কিন্তু এর অর্থ এই নয় যে ত্রুটির অবস্থাটি এখানে এসেছে।
যাইহোক, আমাদের তদন্ত শুরু করা একটি ভালো বিষয়।
এই হল চুক্তি :
পাঠ্য | বর্ণনা |
---|---|
/tmp/stack.rb :6 | ফাইল এবং লাইন নম্বর |
`পদ্ধতি2-এ ' | পদ্ধতির নাম |
অসংজ্ঞায়িত স্থানীয় পরিবর্তনশীল বা পদ্ধতি ‘অবৈধ_ভেরিয়েবল ' | ত্রুটির বার্তা |
প্রধান:অবজেক্ট | শ্রেণির নাম |
(NameError) | ব্যতিক্রম নাম |
আপনি দেখতে পাচ্ছেন যে এইভাবে ভেঙে পড়লে ত্রুটিটি এতটা ভীতিজনক নয়।
যাইহোক, আপনি এখানে ব্যতিক্রমগুলির একটি তালিকা খুঁজে পেতে পারেন৷
৷এখন :
প্রথমটির নীচে স্ট্যাক ট্রেসের প্রতিটি লাইন আপনাকে বলে যে কোডটি এখানে কীভাবে এসেছে৷
এটি মূলত একটি পদ্ধতি শৃঙ্খল, যদি আপনি নিচে যেতে থাকেন তাহলে শেষ পর্যন্ত আপনার অ্যাপের মূল পদ্ধতি খুঁজে বের করতে হবে।
এখানে একটি স্ট্যাক ট্রেস নিয়ে কাজ করার জন্য একটি সাধারণ অ্যালগরিদম রয়েছে৷ :
- স্ট্যাক ট্রেসের উপরের লাইনটি পড়ুন
- ফাইলটি আপনার প্রকল্পের অংশ হলে:নির্দেশিত লাইন নম্বরে ত্রুটিপূর্ণ ফাইলটি খুলুন। যদি তা না হয়, স্ট্যাক ট্রেসের নিচে যেতে থাকুন যতক্ষণ না আপনি আপনার শনাক্ত করা একটি ফাইলের প্রথম রেফারেন্স খুঁজে পান
- দেখুন সুস্পষ্ট কিছু আপনার কাছে আসে কিনা এবং এটি ঠিক করুন (ত্রুটির বার্তায় উল্লেখ করা জিনিসগুলি দেখুন)
- যদি এটি সাহায্য না করে তবে আপনাকে আরও তথ্য খুঁজে বের করতে হবে, যেমন প্রভাবিত ভেরিয়েবলের মান।
রুবি ডিবাগ করা
সবচেয়ে মৌলিক (যা অগত্যা খারাপ মানে না) ডিবাগিং টেকনিক যার সাথে আপনি সম্ভবত পরিচিত তা হল সন্দেহজনক ভেরিয়েবলের মানগুলিকে ডাম্প করা৷
রুবিতে আপনি পুট ব্যবহার করে এটি করতে পারেন অথবা 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 # This will print our book object book = find_book('POODR') p book # This will print nil book.name # Guess what happens next!
প্রাই দিয়ে আরও গভীর খনন করা
আপনার যখন চেক করার জন্য অনেকগুলি ভেরিয়েবল থাকে, তখন puts
যোগ করা সব জায়গায় খুব ব্যবহারিক নাও হতে পারে।
সেক্ষেত্রে আপনার চেষ্টা করা উচিত।
pry ব্যবহার করে আপনি আপনার কোডটিকে কোডের একটি নির্দিষ্ট লাইনে (একটি ব্রেকপয়েন্ট হিসাবেও পরিচিত) থামাতে পারেন এবং এটি আপনাকে একটি IRB-এর মতো পরিবেশে ফেলে দেবে, যেখানে আপনি আপনার প্রকল্পের প্রসঙ্গে রুবি কোড মূল্যায়ন করতে পারেন, বা অনেকগুলির মধ্যে একটি কার্যকর করতে পারেন দরকারী pry কমান্ড।
প্রি ব্যবহার করা সত্যিই সহজ :
আপনাকে যা করতে হবে তা হল binding.pry
ড্রপ যেখানে আপনি একটি প্রাই ব্রেকপয়েন্ট ইনস্টল করতে চান।
এছাড়াও আপনার প্রজেক্টের জন্য আপনার প্রয়োজন হবে ('প্রাই' প্রয়োজন)।
আপনি যদি এটি সাময়িকভাবে করতে চান তবে আপনি আপনার রুবি স্ক্রিপ্টটিকে এভাবে কল করতে পারেন:
ruby -rpry app.rb
এটি একটি রেল অ্যাপের জন্য খুব সহায়ক হবে না, তাই আপনি আপনার জেমফাইলে প্রি যোগ করতে চাইতে পারেন।
আমি যা করতে চাই তা হল আমার সম্পাদকে একটি ম্যাক্রো/স্নিপেট থাকা যাতে ব্রেকপয়েন্টের চেয়ে একই লাইনে আগে থেকেই প্রয়োজন অন্তর্ভুক্ত থাকে, তাই যখন আমি এটি মুছে দেব তখন আমি উভয় জিনিসই মুছে ফেলব।
আপনি যখন একটি প্রি সেশনে বাদ পড়বেন তখন আপনি এটি দেখতে পাবেন:
আপনি যদি একটি প্রি সেশন সম্পূর্ণভাবে ছেড়ে দিতে চান তাহলে আপনি প্রস্থান করুন! টাইপ করতে পারেন৷ , যদি আপনি নিয়মিত প্রস্থান করুন করেন এটি পরবর্তী ব্রেকপয়েন্ট পর্যন্ত আপনার প্রোগ্রাম চালায়।
প্রিয়ার শক্তি এখানেই শেষ নয়। উদাহরণস্বরূপ, আপনি ls
ব্যবহার করতে পারেন একটি বস্তুর অ্যাক্সেস আছে কি পদ্ধতি এবং উদাহরণ ভেরিয়েবল দেখতে কমান্ড.
সহায়তা চালাতে ভুলবেন না সব গুডির একটি তালিকা পেতে কমান্ড!
অন্য রুবি ডিবাগার:বাইবাগ
Byebug একটি pry প্রতিস্থাপন হিসাবে বা রুবির জন্য একটি gdb-এর মতো ডিবাগার হিসাবে কাজ করতে পারে৷
আপনি যদি পূর্বের জন্য এটি ব্যবহার করতে চান তাহলে আপনি শুধু বাইবাগ বাদ দিন binding.pry
এর পরিবর্তে যেখানে আপনি আপনার কোড বন্ধ করতে চান। বাইবাগ ওভার প্রি ব্যবহার করার একটি অসুবিধা হল এটি সিনট্যাক্স হাইলাইটিং প্রদান করে না।
আসুন দেখি কিভাবে আপনি ব্রেকপয়েন্ট সেট করতে পারেন এবং বাইবাগের ভিতরে আপনার কোড ডিবাগ করতে পারেন!
সাধারণত আপনি সাহায্য কমান্ড কল করবেন, কিন্তু এই ক্ষেত্রে এটির তথ্যের কিছুটা অভাব রয়েছে:
তাই আপনাকে ডকুমেন্টেশনের সাথে পরামর্শ করতে হবে।
আপনি কিভাবে ব্রেক কমান্ড ব্যবহার করে দেখতে পারেন এবং একটি লাইন নম্বর আপনি আপনার ব্রেকপয়েন্ট সেট করতে পারেন।
ব্রেকপয়েন্টের তালিকা পেতে আপনি তথ্য ব্রেকপয়েন্ট ব্যবহার করতে পারেন .
একবার আপনার ব্রেকপয়েন্ট সেট হয়ে গেলে, আপনি নিম্নলিখিত কমান্ডগুলি ব্যবহার করে প্রোগ্রাম এক্সিকিউশনের মাধ্যমে যেতে পারেন:
- পদক্ষেপ (একটি নির্দেশনা, মেথড কলে ধাপে ধাপে)
- পরবর্তী (একটি নির্দেশনা অগ্রিম, ভিতরের পদ্ধতিগুলি পান না)
- চালিয়ে যান (শেষ বা পরবর্তী ব্রেকপয়েন্ট পর্যন্ত চালান)
আপনি যদি কোনো কমান্ড ছাড়াই এন্টার টাইপ করেন তবে শেষেরটি পুনরাবৃত্তি করুন, আপনার কোডের মাধ্যমে চলার সময় এটি খুবই কার্যকর।
যখন অন্য সব ব্যর্থ হয়
আপনি যখন একটি ভাল পরিমাণে সময় রেখেছেন এবং সমাধানটি দেখতে পাচ্ছেন না তখন বিরতি নেওয়ার বিষয়টি নিশ্চিত করুন, যখন আপনি তাজা চোখ নিয়ে ফিরে আসবেন তখন আপনি বুঝতে পারবেন সমাধানটি আপনার সামনে ছিল। আপনি অন্য কাউকে সমস্যাটি ব্যাখ্যা করার চেষ্টা করতে পারেন৷
কিছু সময় আপনি নিশ্চিত নন যে সমস্যাটি কোথায়, যখন এটি ঘটে তখনও আপনার কাছে প্রচুর বিকল্প থাকে।
উদাহরণস্বরূপ, আপনি চেষ্টা করতে এবং সমস্যাটি বিচ্ছিন্ন করার জন্য কোডের ব্লকগুলি মন্তব্য করতে চাইতে পারেন৷
৷যদি সমস্যাটি অদৃশ্য হয়ে যায় তাহলে আপনি এইমাত্র যে কোডটি মন্তব্য করেছেন তার একটি অংশকে আনকমেন্ট করতে পারেন।
এটি একটি খুব কম প্রযুক্তির সমাধান, তবে এটি আপনার যা প্রয়োজন তা হতে পারে৷
যদি আপনি এতদূর পেয়েছেন এবং কিছুই সাহায্য করবে বলে মনে হচ্ছে না :
বড় বন্দুক বের করার সময় এসেছে।
এখানে কিছু সিস্টেম টুল রয়েছে যা আপনি প্রায়শই সহায়ক বলে মনে করবেন।
এই টুলগুলির মধ্যে একটি হল Wireshark, যা আপনাকে নেটওয়ার্ক ট্র্যাফিক পরিদর্শন করতে দেবে৷
আপনি যদি SSL-এনক্রিপ্ট করা ট্র্যাফিক নিয়ে কাজ করেন তবে mitmproxy-এর মতো একটি mitm (Man in the Middle) প্রক্সি আপনাকে সাহায্য করতে সক্ষম হতে পারে৷
এছাড়াও আপনি কার্ল চেষ্টা করতে পারেন৷ আপনার টার্মিনাল থেকে HTTP সংযোগ শুরু করতে, যা আপনাকে অবৈধ সার্ভার প্রতিক্রিয়া ডিবাগ করতে সাহায্য করতে পারে।
আরেকটি টুল যা পরিচিত হতে উপযোগী তা হল স্ট্রেস (শুধুমাত্র লিনাক্স)।
স্ট্রেস আপনাকে সমস্ত সিস্টেম কল দেখাবে যা আপনার অ্যাপ করছে।
আপনি -e বিকল্পটি ব্যবহার করে নির্দিষ্ট সিস্টেম কলের জন্য ফিল্টার করতে পারেন। স্ট্রেসের আরও আধুনিক বিকল্প হল সিসডিগ।
সতর্কতা ! আপনি উত্পাদনে স্ট্রেস ব্যবহার এড়াতে চাইতে পারেন কারণ এটি পরীক্ষার অধীনে সিস্টেমের কার্যকারিতা মারাত্মকভাবে হ্রাস করে৷
পরিশেষে, আপনি যদি এমন কোনো সমস্যা নিয়ে কাজ করেন যা দেখে মনে হচ্ছে এটি কোনো বাহ্যিক রত্ন থেকে আসছে, তাহলে একটি সুস্পষ্ট পদক্ষেপ হল রত্নটির উৎস কোড পরীক্ষা করা।
আপনি মণি খোলা
উপসংহার
এমনকি যদি ডিবাগিং সবচেয়ে মজার ক্রিয়াকলাপ না হয় তবে প্রচুর সরঞ্জাম এবং কৌশল রয়েছে যা আপনার জন্য এটিকে সহজ করে তুলতে পারে, আপনাকে সাহায্য করার জন্য সেগুলি ব্যবহার করুন৷
আপনি যদি এটি উপভোগ করেন তাহলে এই পোস্টটি শেয়ার করুন যাতে আরো পিপিএল শিখতে পারে! 🙂
ধন্যবাদ।