ftrace ব্যবহার করে

লিনাক্স কার্নেলের ভিতরে কী ঘটছে তা বোঝার জন্য ftrace একটি ডিবাগিং টুল। নিম্নলিখিত বিভাগগুলি মৌলিক ftrace কার্যকারিতা, অ্যাট্রেসের সাথে ftrace ব্যবহার (যা কার্নেল ইভেন্টগুলি ক্যাপচার করে), এবং গতিশীল ftrace বিস্তারিত করে।

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

অ্যাট্রেস দিয়ে কার্নেল ইভেন্ট ক্যাপচার করা হচ্ছে

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

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

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

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 দ্বারা পুনরায় সেট করা হবে না । কোয়ালকম ডিভাইস আনার জন্য একটি সাধারণ প্যাটার্ন হল kgsl (GPU) এবং mdss (ডিসপ্লে পাইপলাইন) ট্রেসপয়েন্ট সক্রিয় করা এবং তারপর অ্যাট্রেস বা সিস্ট্রেস ব্যবহার করা:

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
    

ট্রেস_আউটপুট টেক্সট আকারে ট্রেস দেয়। Catapult ব্যবহার করে এটি কল্পনা করতে, GitHub থেকে Catapult সংগ্রহস্থলটি পান এবং trace2html চালান:

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

ডিফল্টরূপে, এটি একই ডিরেক্টরিতে trace_file.html লিখে।

সম্পর্কযুক্ত ঘটনা

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

একটি Catapult ইভেন্ট থেকে একটি প্রদত্ত ftrace ইভেন্ট খুঁজে পেতে:

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

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

এই পদক্ষেপগুলি আপনাকে ইভেন্টে (বা অন্তত খুব কাছাকাছি) রাখতে হবে।

গতিশীল ftrace ব্যবহার করে

যখন systrace এবং স্ট্যান্ডার্ড ftrace অপর্যাপ্ত হয়, তখন একটি শেষ অবলম্বন পাওয়া যায়: গতিশীল ftrace । ডায়নামিক ftrace বুট করার পরে কার্নেল কোড পুনর্লিখন জড়িত, এবং ফলস্বরূপ এটি নিরাপত্তার কারণে উৎপাদন কার্নেলে উপলব্ধ নয়। যাইহোক, 2015 এবং 2016 এর প্রতিটি কঠিন পারফরম্যান্স বাগ শেষ পর্যন্ত গতিশীল ftrace ব্যবহার করে রুট-সৃষ্ট হয়েছিল। এটি নিরবচ্ছিন্ন ঘুম ডিবাগ করার জন্য বিশেষভাবে শক্তিশালী কারণ আপনি যখনই নিরবচ্ছিন্ন ঘুমের ট্রিগার ফাংশনটি আঘাত করেন তখন আপনি কার্নেলে একটি স্ট্যাক ট্রেস পেতে পারেন। আপনি বাধা এবং প্রিম্পশনগুলি অক্ষম করে বিভাগগুলি ডিবাগ করতে পারেন, যা সমস্যাগুলি প্রমাণ করার জন্য খুব কার্যকর হতে পারে।

ডাইনামিক ftrace চালু করতে, আপনার কার্নেলের ডিফকনফিগ সম্পাদনা করুন:

  1. CONFIG_STRICT_MEMORY_RWX সরান (যদি এটি উপস্থিত থাকে)। আপনি যদি 3.18 বা নতুন এবং আর্ম64 এ থাকেন তবে এটি সেখানে নেই।
  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. গতিশীল ftrace কাজ করছে তা নিশ্চিত করতে নিম্নলিখিতটি চালান:
    cat /sys/kernel/tracing/available_filter_functions | grep <a function you care about>
    

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

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


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

লকস্ট্যাট ব্যবহার করে

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

যাইহোক, লকস্ট্যাট ডিবাগ লকিং অবকাঠামো ব্যবহার করে, যা অন্যান্য অনেক অ্যাপ্লিকেশনের জন্য উপযোগী। ডিভাইস আনয়নে কাজ করা প্রত্যেকেরই প্রতিটি ডিভাইসে এই বিকল্পটি কাজ করার জন্য কিছু উপায় খুঁজে বের করা উচিত কারণ এমন একটি সময় আসবে যখন আপনি মনে করেন "যদি আমি 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 পরিষেবা দ্বারা ট্রেসপয়েন্টগুলি এক্সটেনসিবল যা আপনাকে ডিভাইসের নির্দিষ্ট ট্রেস পয়েন্ট/বিভাগ যোগ করতে দেয়। ট্রেসপয়েন্টগুলি পারফেটো, অ্যাট্রেস/সিস্ট্রেস এবং অন-ডিভাইস সিস্টেম ট্রেসিং অ্যাপের সাথে একত্রিত করা হয়েছে।

ট্রেসপয়েন্ট/বিভাগ বাস্তবায়নের জন্য APIগুলি হল:

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