রুবির একটি অন্তর্নির্মিত ট্রেসিং সিস্টেম রয়েছে যা আপনি TracePoint
ব্যবহার করে অ্যাক্সেস করতে পারেন ক্লাস কিছু জিনিস যা আপনি ট্রেস করতে পারেন তা হল মেথড কল, নতুন থ্রেড এবং ব্যতিক্রম।
কেন আপনি এটি ব্যবহার করতে চান?
ঠিক আছে, আপনি যদি একটি নির্দিষ্ট পদ্ধতির সম্পাদনের ট্রেস করতে চান তবে এটি কার্যকর হতে পারে। আপনি দেখতে সক্ষম হবেন অন্যান্য পদ্ধতিগুলিকে কী বলা হচ্ছে এবং রিটার্নের মানগুলি কী৷
৷আসুন কয়েকটি উদাহরণ দেখি!
ট্রেসিং পদ্ধতি কল
বেশিরভাগ সময় আপনি TracePoint
চাইবেন অ্যাপ্লিকেশন কোড ট্রেস করতে এবং অন্তর্নির্মিত পদ্ধতি (যেমন পুট, আকার, ইত্যাদি) নয়।
আপনি call
ব্যবহার করে এটি করতে পারেন ঘটনা।
উদাহরণ :
def the_method; other_method; end def other_method; end def start_trace trace = TracePoint.new(:call) { |tp| p [tp.path, tp.lineno, tp.event, tp.method_id] } trace.enable yield trace.disable end start_trace { the_method }
এটি ফাইলের পথ, লাইন নম্বর, ইভেন্টের নাম এবং পদ্ধতির নাম প্রিন্ট করে।
["test.rb", 1, :call, :the_method] ["test.rb", 2, :call, :other_method]
আপনি যদি কোনো ইভেন্ট নির্দিষ্ট না করেন তবে রুবি আপনার ব্লককে তাদের সকলের জন্য কল করবে, যার ফলে আরও আউটপুট হবে। তাই আমি সুপারিশ করব যে আপনি যা চান তা দ্রুত খুঁজে পেতে নির্দিষ্ট ইভেন্টগুলিতে ফোকাস করুন 🙂
এখানে TracePoint
এর একটি সারণী আছে ঘটনা:
ইভেন্টের নাম | বিবরণ |
---|---|
কল করুন | আবেদন পদ্ধতি |
c_call | সি-লেভেল পদ্ধতি (যেমন পুট) |
রিটার্ন | পদ্ধতি রিটার্ন (রিটার্ন মান এবং কল গভীরতা ট্রেস করার জন্য) |
b_call | কল ব্লক করুন |
b_return | ব্লক রিটার্ন |
বাড়ান | ব্যতিক্রম উত্থাপিত |
thread_begin | নতুন থ্রেড |
thread_end | থ্রেড এন্ডিং |
ট্রেসপয়েন্ট + গ্রাফভিজ
অনেক পদ্ধতি মাত্র ৩টির বেশি পদ্ধতি কল করবে, বিশেষ করে ফ্রেমওয়ার্ক কোডে, তাই Tracepoint
থেকে আউটপুট কল্পনা করা কঠিন হতে পারে।
তাই আমি একটি রত্ন তৈরি করেছি যা আপনাকে এই মত একটি ভিজ্যুয়াল কল গ্রাফ তৈরি করতে দেয়:
require 'visual_call_graph' VisualCallGraph.trace { "Your method call here..." }
এটি একটি call_graph.png
তৈরি করে ফলাফল সহ ফাইল।
মনে রাখবেন যে এটি স্ট্যাটিক বিশ্লেষণ নয়, এটি আসলে পদ্ধতিকে কল করবে!
ফাইল পাথ দেখানো হচ্ছে
আপনি কি জানতে চান এই পদ্ধতিগুলো কোথায় সংজ্ঞায়িত করা হয়েছে?
চিন্তা করবেন না, আমি আপনাকে কভার করেছি! আমি একটি বিকল্প যোগ করেছি আপনি প্রতিটি পদ্ধতি কলের জন্য ফাইল পাথ দেখাতে সক্ষম করতে পারেন৷
৷VisualCallGraph.trace(show_path: true) { Foo.aaa }
যার ফলাফল :
আপনি যদি কিছু বিশাল কল গ্রাফ দেখতে চান তবে আপনাকে কিছু রেল পদ্ধতি ট্রেস করতে হবে 😉
রিটার্ন মান
ভূমিকায় আমি উল্লেখ করেছি যে আপনি রিটার্ন মানও পেতে পারেন...
এর জন্য আপনাকে return
ট্রেস করতে হবে ইভেন্ট এবং return_value
ব্যবহার করুন পদ্ধতি।
উদাহরণ :
def the_method; "A" * 10; end trace = TracePoint.new(:return) { |tp| puts "Return value for #{tp.method_id} is #{tp.return_value}." } trace.enable the_method trace.disable
এটি প্রিন্ট করবে:
Return value for the_method is AAAAAAAAAA.
প্রথম ঘটনা
কেউ একজন reddit-এ জিজ্ঞাসা করেছিল যে foo
কল করার সময় "বার" শব্দটি প্রিন্ট করা এড়ানো কীভাবে সম্ভব? নিম্নলিখিত কোডে পদ্ধতি:
class Thing def foo puts "foo" bar end def bar puts "bar" end end # your code here t = Thing.new t.foo
এটি অর্জন করার অনেক উপায় আছে, যেমন একটি মডিউল প্রিপেন্ড করা, $stdout
রিডাইরেক্ট করা অথবা bar
পুনরায় সংজ্ঞায়িত করা পদ্ধতি।
আপনি যদি সৃজনশীল বোধ করেন তবে আপনার নিজের ধারণা দিয়ে এই পোস্টে মন্তব্য করুন!
কিন্তু আমি একটি উত্তর খুঁজে পেয়েছি বিশেষ করে আকর্ষণীয় কারণ এটি TracePoint
ব্যবহার করেছে ক্লাস।
এটি এখানে :
TracePoint.trace(:call) { |tp| exit if tp.method_id == :bar }
এই কোডটি exit
কল করবে যখন পদ্ধতি bar
বলা হয়, যা প্রোগ্রাম শেষ করে স্ট্রিংকে প্রিন্ট হতে বাধা দেয়।
সম্ভবত আপনি বাস্তব কোডে ব্যবহার করতে চান এমন কিছু নয়, তবে এটি TracePoint
সম্পর্কে একটি জিনিস প্রমাণ করে :ঘটনা ঘটার আগেই ট্রিগার হয়।
আপনি যদি এর আশেপাশে কোনও ধরণের টুল তৈরি করতে যাচ্ছেন তবে কিছু মনে রাখতে হবে 🙂
সারাংশ
এই পোস্টে আপনি TracePoint
সম্পর্কে শিখেছেন ক্লাস, যা আপনাকে পদ্ধতি কল বা নতুন থ্রেডের মতো কয়েকটি ইভেন্ট ট্রেস করতে দেয়। এটি একটি ডিবাগিং টুল হিসাবে বা কোড অন্বেষণের জন্য দরকারী হতে পারে৷
মনে রাখবেন এই পোস্টটি শেয়ার করুন যাতে আরও বেশি মানুষ এটি উপভোগ করতে পারে 🙂