ftrace ব্যবহার করা

ftrace হল একটি ডিবাগিং টুল যা Linux কার্নেলের ভিতরে কী ঘটছে তা বুঝতে সাহায্য করে। নিম্নলিখিত বিভাগে ftrace-এর প্রাথমিক কার্যকারিতা, atrace-এর সাথে ftrace-এর ব্যবহার (যা কার্নেল ইভেন্ট ক্যাপচার করে) এবং ডায়নামিক ftrace সম্পর্কে বিস্তারিত বলা হয়েছে।

ftrace-এর উন্নত কার্যকারিতা সম্পর্কে বিস্তারিত জানতে, যা systrace-এ উপলভ্য নয়, <kernel tree>/Documentation/trace/ftrace.txt-এ ftrace ডকুমেন্টেশন দেখুন।

atrace-এর মাধ্যমে কার্নেল ইভেন্ট ক্যাপচার করুন

atrace (frameworks/native/cmds/atrace) ftrace ব্যবহার করে কার্নেল ইভেন্ট ক্যাপচার করে। এর পরিবর্তে, systrace.py (অথবা Catapult-এর পরবর্তী ভার্সনে run_systrace.py) ডিভাইসে atrace চালানোর জন্য adb ব্যবহার করে। atrace নিম্নলিখিত কাজগুলি করে:

  • প্রপার্টি সেট করার মাধ্যমে ইউজার-মোড ট্রেসিং সেট-আপ করে (debug.atrace.tags.enableflags)।
  • উপযুক্ত ftrace sysfs নোডে লিখে কাঙ্ক্ষিত ftrace ফাংশনালিটি চালু করে। তবে, ftrace আরও বেশি ফিচার সাপোর্ট করে বলে, আপনি কিছু sysfs নোড নিজে সেট করে তারপরে atrace ব্যবহার করতে পারেন।

বুট-টাইম ট্রেসিং ছাড়া, উপযুক্ত ভ্যালুতে প্রপার্টি সেট করার জন্য atrace ব্যবহার করুন। প্রপার্টি হল বিটমাস্ক এবং সঠিক ভ্যালু নির্ধারণ করার কোনও ভাল উপায় নেই উপযুক্ত হেডার দেখা ছাড়া (যা Android রিলিজের মধ্যে পরিবর্তিত হতে পারে)।

ftrace ইভেন্ট চালু করা

ftrace sysfs নোডগুলি /sys/kernel/tracing-এ আছে এবং ট্রেস ইভেন্টগুলি /sys/kernel/tracing/events-এ বিভিন্ন বিভাগে বিভক্ত।

প্রতিটি বিভাগ অনুযায়ী ইভেন্ট চালু করতে, এগুলি ব্যবহার করুন:

echo 1 > /sys/kernel/tracing/events/irq/enable

প্রতিটি ইভেন্টের ভিত্তিতে ইভেন্ট চালু করতে, এগুলি ব্যবহার করুন:

echo 1 > /sys/kernel/tracing/events/sched/sched_wakeup/enable

sysfs নোডে লিখে অতিরিক্ত ইভেন্ট চালু করা হলে, সেগুলি atrace-এর মাধ্যমে রিসেট করা হবে না। Qualcomm ডিভাইসের জন্য একটি সাধারণ প্যাটার্ন হল kgsl (GPU) এবং mdss (ডিসপ্লে পাইপলাইন) ট্রেসপয়েন্ট চালু করা এবং তারপরে atrace বা systrace ব্যবহার করা:

adb shell "echo 1 > /sys/kernel/tracing/events/mdss/enable"
adb shell "echo 1 > /sys/kernel/tracing/events/kgsl/enable"
./systrace.py sched freq idle am wm gfx view binder_driver irq workq ss sync -t 10 -b 96000 -o full_trace.html

এছাড়াও, আপনি atrace বা systrace ছাড়াই ftrace ব্যবহার করতে পারেন, যা তখন কাজে লাগে যখন আপনি শুধুমাত্র কার্নেল ট্রেস চান (অথবা আপনি যদি নিজে হাতে ইউজার-মোড ট্রেসিং প্রপার্টি লেখার জন্য সময় নিয়ে থাকেন)। শুধু ftrace রান করতে:

  1. আপনার ট্রেসের জন্য যথেষ্ট বড় একটি মান বাফার সাইজ হিসেবে সেট করুন:
    echo 96000 > /sys/kernel/tracing/buffer_size_kb
    
  2. ট্রেসিং চালু করুন:
    echo 1 > /sys/kernel/tracing/tracing_on
    
  3. আপনার টেস্ট চালান, তারপর ট্রেসিং বন্ধ করুন:
    echo 0 > /sys/kernel/tracing/tracing_on
    
  4. ট্রেস ডাম্প করা:
    cat /sys/kernel/tracing/trace > /data/local/tmp/trace_output
    

trace_output টেক্সট ফর্ম্যাটে ট্রেস দেয়। Catapult ব্যবহার করে এটি ভিজ্যুয়ালাইজ করতে, GitHub থেকে Catapult রিপোজিটরি পান এবং trace2html চালান:

catapult/tracing/bin/trace2html ~/path/to/trace_file

সাধারণত, এটি একই ডিরেক্টরিতে trace_file.html লেখে।

ইভেন্ট কোরিলেট করা

Catapult ভিজ্যুয়ালাইজেশন এবং ftrace লগ একসাথে দেখলে প্রায়ই তা সহায়ক হয়; যেমন, কিছু ftrace ইভেন্ট (বিশেষ করে ভেন্ডর-নির্দিষ্ট ইভেন্ট) Catapult-এর মাধ্যমে ভিজ্যুয়ালাইজ করা হয় না। তবে, Catapult-এর টাইমস্ট্যাম্পগুলি ট্রেসের প্রথম ইভেন্ট বা atrace-এর ডাম্প করা নির্দিষ্ট টাইমস্ট্যাম্পের তুলনায় আপেক্ষিক, যেখানে কাঁচা ftrace টাইমস্ট্যাম্পগুলি Linux কার্নেলের একটি নির্দিষ্ট অ্যাবসলিউট ক্লক সোর্সের উপর ভিত্তি করে তৈরি হয়।

Catapult ইভেন্ট থেকে কোনও ftrace ইভেন্ট খুঁজে পেতে:

  1. র ftrace লগ খুলুন। systrace-এর সাম্প্রতিক ভার্সনে ট্রেসগুলি ডিফল্ট হিসেবে কম্প্রেস করা হয়:
    • আপনি --no-compress-এর মাধ্যমে systrace ক্যাপচার করে থাকলে, এটি html ফাইলে BEGIN TRACE দিয়ে শুরু হওয়া বিভাগে থাকে।
    • তা না হলে, ট্রেস আনকমপ্রেস করতে, Catapult ট্রি (tracing/bin/html2trace) থেকে html2trace রান করান।
  2. Catapult ভিজ্যুয়ালাইজেশনে আপেক্ষিক টাইমস্ট্যাম্প খুঁজুন।
  3. ট্রেসের শুরুতে একটি লাইন খুঁজুন যাতে tracing_mark_sync আছে। এটি দেখতে এইরকম হওয়া উচিত:
    <5134>-5134  (-----) [003] ...1    68.104349: tracing_mark_write: trace_event_clock_sync: parent_ts=68.104286
    

    এই লাইনটি না থাকলে (অথবা আপনি atrace ছাড়া ftrace ব্যবহার করলে), ftrace লগের প্রথম ইভেন্ট থেকে সময় আপেক্ষিক হবে।
    1. parent_ts (সেকেন্ডে) ভ্যালুতে আপেক্ষিক টাইমস্ট্যাম্প (মিলিসেকেন্ডে) যোগ করুন।
    2. নতুন টাইমস্ট্যাম্প সার্চ করুন।

এইসব ধাপ অনুসরণ করলে আপনি ইভেন্টে (বা অন্তত ইভেন্টের খুব কাছাকাছি) পৌঁছে যাবেন।

ডায়নামিক ftrace ব্যবহার করা

systrace ও standard ftrace যথেষ্ট না হলে, একটি শেষ বিকল্প উপলভ্য থাকে: dynamic ftrace. ডায়নামিক ftrace-এ বুট করার পরে কার্নেল কোড আবার লেখা হয় এবং এর ফলে নিরাপত্তার কারণে এটি প্রোডাকশন কার্নেলে উপলভ্য থাকে না। তবে, ২০১৫ এবং ২০১৬-এর প্রতিটি কঠিন পারফর্ম্যান্স বাগ ডায়নামিক ftrace ব্যবহার করে শেষ পর্যন্ত রুট-কজ করা হয়েছে। এটি বিশেষ করে অবাধ ঘুমানোর ডিবাগিংয়ের জন্য শক্তিশালী কারণ আপনি যখনই অবাধ ঘুম ট্রিগার করা ফাংশনে হিট করেন, তখনই কার্নেলে একটি স্ট্যাক ট্রেস পাবেন। এছাড়াও, আপনি ইন্টারাপ্ট ও প্রিএম্পশন বন্ধ করা বিভাগ ডিবাগ করতে পারবেন, যা সমস্যা প্রমাণ করার জন্য খুবই উপযোগী হতে পারে।

ডায়নামিক ftrace চালু করতে, আপনার কার্নেলের defconfig এডিট করুন:

  1. CONFIG_STRICT_MEMORY_RWX সরিয়ে দিন (যদি থাকে)। আপনি 3.18 বা তার পরবর্তী ভার্সন এবং arm64 ব্যবহার করলে, এটি সেখানে নেই।
  2. নিম্নলিখিতগুলি যোগ করুন: CONFIG_DYNAMIC_FTRACE=y, CONFIG_FUNCTION_TRACER=y, CONFIG_IRQSOFF_TRACER=y, CONFIG_FUNCTION_PROFILER=y এবং CONFIG_PREEMPT_TRACER=y
  3. নতুন কার্নেল রিবিল্ড ও বুট করুন।
  4. উপলভ্য ট্রেসার চেক করতে নিম্নলিখিত কমান্ড রান করুন:
    cat /sys/kernel/tracing/available_tracers
    
  5. কমান্ডের উত্তরে function, irqsoff, preemptoff এবং preemptirqsoff পাওয়া যাচ্ছে কিনা তা কনফার্ম করুন।
  6. dynamic ftrace কাজ করছে কিনা তা নিশ্চিত করতে নিম্নলিখিত কমান্ড চালান:
    cat /sys/kernel/tracing/available_filter_functions | grep <a function you care about>
    

এইসব ধাপ সম্পূর্ণ করার পরে, আপনার কাছে ডায়নামিক ftrace, ফাংশন প্রোফাইলার, irqsoff প্রোফাইলার এবং preemptoff প্রোফাইলার উপলভ্য। আমরা দৃঢ়ভাবে সাজেস্ট করি যে এগুলি ব্যবহার করার আগে ftrace ডকুমেন্টেশন পড়ে নিন, কারণ এগুলি শক্তিশালী হলেও জটিল। irqsoff এবং preemptoff মূলত এটি কনফার্ম করার জন্য উপযোগী যে ড্রাইভাররা ইন্টারাপ্ট বা প্রিএম্পশন অনেকক্ষণ ধরে বন্ধ করে রাখছেন কিনা।

পারফর্ম্যান্স সংক্রান্ত সমস্যার জন্য ফাংশন প্রোফাইলার হল সবচেয়ে ভালো বিকল্প এবং এটি প্রায়ই ব্যবহার করে দেখা হয় যে কোনও ফাংশন কোথায় কল করা হচ্ছে।


ফাংশন প্রোফাইলারের ডেটা যথেষ্ট নির্দিষ্ট না হলে, আপনি ফাংশন প্রোফাইলারের সাথে ftrace ট্রেসপয়েন্ট একত্রিত করতে পারবেন। ftrace ইভেন্টগুলি ঠিক একই উপায়ে চালু করা যেতে পারে এবং সেগুলি আপনার ট্রেসের সাথে ইন্টারলিভ করা হবে। আপনি যদি কোনও নির্দিষ্ট ফাংশনে মাঝে মাঝে দীর্ঘ, নিরবচ্ছিন্ন ঘুম ডিবাগ করতে চান, তাহলে এটি খুব ভাল: আপনি যে ফাংশনটি চান সেটিতে ftrace ফিল্টার সেট করুন, ট্রেসপয়েন্ট চালু করুন, ট্রেস নিন। আপনি trace2html-এর মাধ্যমে ফলাফল হিসেবে পাওয়া ট্রেস পার্স করতে পারবেন, আপনার পছন্দের ইভেন্ট খুঁজে নিতে পারবেন, তারপর র ট্রেসে আশেপাশের স্ট্যাক ট্রেস পেতে পারবেন।

lockstat ব্যবহার করা

কখনও কখনও, ftrace যথেষ্ট নয় এবং আপনাকে সত্যিই কার্নেল লক কনটেনশন কী তা ডিবাগ করতে হবে। আরও একটি কার্নেল বিকল্প আছে যা ব্যবহার করে দেখা যেতে পারে: CONFIG_LOCK_STAT. এটি হল শেষ উপায়, কারণ Android ডিভাইসে এটি কাজ করানো অত্যন্ত কঠিন, কারণ এটি কার্নেলের সাইজকে এমনভাবে বাড়িয়ে দেয় যা বেশিরভাগ ডিভাইস হ্যান্ডেল করতে পারে না।

তবে, lockstat, debug locking ইনফ্রাস্ট্রাকচার ব্যবহার করে, যা অন্যান্য অনেক অ্যাপের জন্য উপযোগী। ডিভাইস ব্রিং-আপে কাজ করা প্রত্যেককে প্রতিটি ডিভাইসে সেই বিকল্পটি কাজ করানোর কোনও উপায় খুঁজে বের করতে হবে কারণ এমন সময় আসবে যখন আপনি ভাববেন "যদি আমি LOCK_STAT চালু করতে পারতাম, তাহলে আমি এটি কনফার্ম বা অস্বীকার করতে পারতাম যে এটি পাঁচ দিনের পরিবর্তে পাঁচ মিনিটের মধ্যে সমস্যা।"


আপনি যদি কনফিগারেশন বিকল্পের সাথে কার্নেল বুট করতে পারেন, তাহলে লক ট্রেসিং ftrace-এর মতো:

  1. ট্রেসিং চালু করুন:
    echo 1 > /proc/sys/kernel/lock_stat
    
  2. আপনার পরীক্ষা চালান।
  3. ট্রেসিং বন্ধ করুন:
    echo 0 > /proc/sys/kernel/lock_stat
    
  4. আপনার ট্রেস ডাম্প করুন:
    cat /proc/lock_stat > /data/local/tmp/lock_stat
    

ফলাফল ব্যাখ্যা করার জন্য সাহায্য পেতে, <kernel>/Documentation/locking/lockstat.txt-এ lockstat ডকুমেন্টেশন দেখুন।

ভেন্ডর ট্রেসপয়েন্ট ব্যবহার করুন

প্রথমে আপস্ট্রিম ট্রেসপয়েন্ট ব্যবহার করুন, তবে কখনও কখনও আপনাকে ভেন্ডর ট্রেসপয়েন্ট ব্যবহার করতে হবে:

  { "gfx",        "Graphics",         ATRACE_TAG_GRAPHICS, {
        { OPT,      "events/mdss/enable" },
        { OPT,      "events/sde/enable" },
        { OPT,      "events/mali_systrace/enable" },
    } },

HAL পরিষেবা ব্যবহার করে ট্রেসপয়েন্ট এক্সটেন্ড করা যায়, এর ফলে আপনি ডিভাইস-নির্দিষ্ট ট্রেসপয়েন্ট/বিভাগ যোগ করতে পারেন। Tracepoint-কে perfetto, atrace/systrace এবং অন-ডিভাইস সিস্টেম ট্রেসিং অ্যাপের সাথে ইন্টিগ্রেট করা হয়।

ট্রেসপয়েন্ট/ক্যাটাগরি প্রয়োগ করার জন্য API হল:

  • listCategories()জেনারেট করে (vec<TracingCategory> categories);
  • enableCategories(vec<string> categories) generates (Status status);
  • disableAllCategories() (Status status) তৈরি করে;
আরও তথ্যের জন্য, HAL সংজ্ঞা এবং ডিফল্ট প্রয়োগের জন্য AOSP দেখুন: