কম্পিউটার

রুবি স্ট্যাক ট্রেস পড়া এবং বোঝা

যখন আপনার অ্যাপ্লিকেশনে একটি ত্রুটি ঘটে, তখন রুবি একটি ব্যতিক্রম উত্থাপন করে এবং স্ট্যাক ট্রেস মুদ্রণ করে লগে এই নিবন্ধে, আমরা স্ট্যাক ট্রেসটি কীভাবে পড়তে হয় এবং আপনার অ্যাপ্লিকেশনে একটি ব্যতিক্রমের উত্স সনাক্ত করতে এটি কীভাবে ব্যবহার করতে হয় তা দেখব৷

কল স্ট্যাক

যখনই আপনি একটি পদ্ধতি কল করেন, রুবি একটি স্ট্যাক ফ্রেম রাখে কল স্ট্যাক-এ (বা "রানটাইম স্ট্যাক", কিন্তু প্রায়ই শুধু "স্ট্যাক" বলা হয়)। স্ট্যাক ফ্রেম হল একটি মেমরি বরাদ্দ যা পদ্ধতির আর্গুমেন্ট, অভ্যন্তরীণ ভেরিয়েবলের জন্য কিছু স্থান এবং কলারের রিটার্ন ঠিকানা রাখে।

# divide.rb
def divide(a, b)
  "Dividing #{a} by #{b} gives #{a / b}."
end
 
puts divide(8, 4)

যখন একটি পদ্ধতি (divide ) অন্য পদ্ধতিতে কল করে (Fixnum#/ , অথবা / সংক্ষেপে), পরেরটি স্ট্যাকের উপরে রাখা হয়, কারণ প্রথমটি শেষ করার আগে এটি কার্যকর করতে হবে। divide(8, 4) কল করার সময় এই উদাহরণে, রুবি ক্রমানুসারে নিম্নলিখিত ক্রিয়াগুলি সম্পাদন করবে:

  1. কল করুন 8./(4)
  2. বিভাগের ফলাফল সংগ্রহ করুন (2 ), এবং এটি একটি স্ট্রিং এ রাখুন
  3. স্ট্রিং সংগ্রহ করুন ("Dividing 8 by 4 gives 2" ), এবং এটিকে puts দিয়ে কনসোলে প্রিন্ট করুন

স্ট্যাক ট্রেস

স্ট্যাক ট্রেস (সাধারণত রুবিতে "ব্যাকট্রেস" নামে পরিচিত, তবে "স্ট্যাক ব্যাকট্রেস" এবং "স্ট্যাক ট্রেসব্যাক" হিসাবেও উল্লেখ করা হয়) আপনার প্রোগ্রাম চালানোর সময় একটি নির্দিষ্ট মুহুর্তে স্ট্যাকের একটি মানব-পাঠযোগ্য উপস্থাপনা। /-এ কলের স্ট্যাক ট্রেস পদ্ধতিটি এইরকম দেখাবে, দেখানো হচ্ছে যে এটিকে divide এ বলা হয়েছে লাইন 2-এর পদ্ধতি, যাকে <main>-এ বলা হয়েছিল পদ্ধতি 5 লাইনে।

divide.rb:2:in `/'
divide.rb:2:in `divide'
divide.rb:5:in `<main>'

উপরের উদাহরণে, আমাদের divide কল করা একটি 0 এর সাথে একটি আর্গুমেন্টের একটি পদ্ধতির ফলে একটি ZeroDivisionError হবে ব্যতিক্রম।

# divide_by_zero.rb
def divide(a, b)
  "Dividing #{a} by #{b} gives #{a / b}."
end
 
puts divide(8, 0)

যখন এটি ঘটবে, রুবি ব্যতিক্রমটি স্ট্যাক ট্রেস সহ কনসোলে প্রিন্ট করবে। স্ট্যাক ট্রেস স্ট্যাকটিকে মানব-পাঠযোগ্য বিন্যাসে দেখায়, আপনার কোডে প্রতিটি পদ্ধতির অবস্থান সহ, ব্যতিক্রমটি কোথা থেকে এসেছে তা চিহ্নিত করতে আপনাকে সহায়তা করতে।

$ ruby divide_by_zero.rb
divide_by_zero.rb:2:in `/': divided by 0 (ZeroDivisionError)
        from divide_by_zero.rb:2:in `divide'
        from divide_by_zero.rb:5:in `<main>'
  1. উপরের স্ট্যাক ট্রেসের প্রথম লাইনে, আমরা দেখতে পাচ্ছি যে একটি ZeroDivisionError এটির বার্তা হিসাবে "0 দ্বারা বিভক্ত" দিয়ে উত্থাপিত হয়েছিল। ব্যতিক্রম ছাড়াও, আমরা দেখতে পাচ্ছি যে এটি divide_by_zero.rb:2:in `/' এ ঘটেছে , যার অর্থ আমাদের উদাহরণ ফাইলের দ্বিতীয় লাইন থেকে / নামের একটি পদ্ধতি থেকে ত্রুটিটি উত্থাপিত হয়েছে (যা Fixnum#/ , কারণ প্রথম আর্গুমেন্ট হল Fixnum 8 )।

  2. স্ট্যাক ট্রেসের দ্বিতীয় লাইন দেখায় কোথায় / পদ্ধতি থেকে বলা হয়েছিল। এই ক্ষেত্রে, এটি আমাদের divide থেকে পদ্ধতি 2 লাইনে।

  3. শেষ লাইনটি দেখায় যে divide <main> থেকে কল করা হয়েছিল , যা একটি রুবি অ্যাপ্লিকেশনের প্রাথমিক প্রেক্ষাপটকে বোঝায়। সাধারনত, এর মানে হল যে কোন "বাস্তব" পদ্ধতির বাইরে থেকে ডাকা হয়েছিল।

দ্রষ্টব্য :রুবি 2.5-এ, লগার স্ট্যাক ট্রেসটিকে একটি টার্মিনাল উইন্ডোতে ফিট করার জন্য বিপরীতে মুদ্রণ করে। শেষ লাইনটি ব্যতিক্রম দেখায়, যে লাইনে ব্যতিক্রম ঘটেছে তার পূর্বে। উপরের লাইনগুলি স্ট্যাকের উপরে যাওয়ার পথ।

স্ট্যাক ট্রেস বোঝা

স্ট্যাক ট্রেস আপনাকে আপনার কল স্ট্যাকের বর্তমান অবস্থার একটি ডাম্প দেয় যখনই একটি ব্যতিক্রম উত্থাপিত হয়, এবং জিনিসগুলি কোথায় ভুল হয়েছে তা খুঁজে বের করতে সহায়ক৷

যদিও স্ট্যাকট্রেসের প্রথম লাইন লাইনটি দেখায় যে ব্যতিক্রমটি ঘটেছে, এটি সর্বদা ত্রুটির উত্স দেখায় না। উপরের উদাহরণে, প্রোগ্রামটি সঠিকভাবে সম্পাদিত হয়েছে, কিন্তু এটি divide-এ পাস করা ডেটা পরিচালনা করতে পারেনি পদ্ধতি স্ট্যাক ট্রেস ধরে হাঁটা যেখানে এটিকে বলা হয় সেখানে নিয়ে যায়, যা হয় সমস্যার উৎস।

বরাবরের মতো, আমরা জানতে চাই যে আপনি এই নিবন্ধটি কীভাবে পছন্দ করেছেন, যদি এটি সম্পর্কে আপনার কোন প্রশ্ন থাকে এবং আপনি পরবর্তীতে কী পড়তে চান, তাই @AppSignal-এ আমাদের জানাতে ভুলবেন না।


  1. রুবি অবজেক্ট মডেল গভীরভাবে বোঝা

  2. রুবির সাথে সিলেকশন সর্ট বোঝা

  3. কিভাবে Rbenv, RubyGems এবং Bundler একসাথে কাজ করে তা বোঝা

  4. রুবিতে সন্নিবেশ বাছাই বোঝা