ftrace का इस्तेमाल करें

ftrace, डीबग करने का एक टूल है जो यह समझने के लिए है कि वेबसाइट के अंदर क्या चल रहा है Linux कर्नेल. इन सेक्शन में, ftrace की बुनियादी सुविधाओं के बारे में बताया गया है atrace (जो कर्नेल इवेंट को कैप्चर करता है) और डायनैमिक ftrace के साथ इस्तेमाल.

उन ऐडवांस ftrace फ़ंक्शन की जानकारी के लिए जो यहां उपलब्ध नहीं है systrace, तो यहां ftrace दस्तावेज़ देखें <kernel tree>/Documentation/trace/ftrace.txt.

एट्रेस की मदद से कर्नेल इवेंट कैप्चर करें

Atrace (frameworks/native/cmds/atrace) कैप्चर करने के लिए ftrace का इस्तेमाल करता है कर्नेल इवेंट की संख्या डालें. इससे, systrace.py (या इसके बाद के वर्शन में Run_systrace.py का इस्तेमाल किया जाएगा) कैटापुल्ट), adb का इस्तेमाल करता है को ट्रैक किया जा सकता है. atrace यह काम करता है:

  • कोई प्रॉपर्टी सेट करके, उपयोगकर्ता-मोड ट्रेस करने की सुविधा सेट अप करता है (debug.atrace.tags.enableflags).
  • सही डोमेन पर मैसेज भेजकर, अपनी पसंद के ftrace की सुविधा चालू करता है ftrace sysfs नोड को प्रभावित करते हैं. हालांकि, क्योंकि 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 नोड पर टाइप करके अतिरिक्त इवेंट चालू किए गए हैं, तो वे नहीं होना चाहिए. एक सामान्य पैटर्न Qualcomm डिवाइस को लाने के लिए, 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
    

ट्रेस_आउटपुट ट्रेस को टेक्स्ट के रूप में दिखाता है. इसका इस्तेमाल करके विज़ुअलाइज़ करने के लिए गुलेल से आगे बढ़ें गुलेल डेटा स्टोर करने की जगह को GitHub से कॉपी करें और Tres2html चलाएं:

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

डिफ़ॉल्ट रूप से, यहtrace_file.html डायरेक्ट्री.

इवेंट को आपस में जोड़ें

गुलेल की विज़ुअल और फुटट्रेस को देखना अक्सर फ़ायदेमंद होता है एक साथ लॉग करें; उदाहरण के लिए, कुछ ftrace इवेंट (खास तौर पर वेंडर के हिसाब से) उन्हें कैटपल्ट से विज़ुअलाइज़ नहीं किया जाता. हालांकि, Cataplt के टाइमस्टैंप यह यूआरएल, ट्रेस में मौजूद पहले इवेंट या किसी खास टाइमस्टैंप से मिलता-जुलता हो को एट्रेस से डंप किया गया हो, जबकि रॉ फ़्टरेस टाइमस्टैंप Linux कर्नेल में ऐब्सलूट क्लॉक सोर्स.

किसी कैटापुल्ट इवेंट से, दिए गए ftrace इवेंट को ढूंढने के लिए:

  1. रॉ ftrace लॉग खोलें. systrace के हाल ही के वर्शन में मौजूद ट्रेस डिफ़ॉल्ट रूप से कंप्रेस किया हुआ:
    • अगर आपने --no-compress से अपना सिस्टम कैप्चर किया है, तो 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 का इस्तेमाल करें

जब सिस्टम ट्रेस करने की सुविधा और स्टैंडर्ड ब्रैकेट ठीक नहीं होते हैं, तो आखिरी संसाधन उपलब्ध: डाइनैमिक ftrace. डाइनैमिक ftrace में फिर से लिखना शामिल होता है कर्नेल कोड के चालू हो जाते हैं और इस वजह से, यह प्रोडक्शन में उपलब्ध नहीं होता कर्नल कर सकते हैं. हालांकि, परफ़ॉर्मेंस से जुड़ी हर मुश्किल गड़बड़ी को आखिर में, 2015 और 2016 की वजह से डाइनैमिक ftrace का इस्तेमाल हुआ है. यह खास तौर पर इसमें आपको स्टैक ट्रेस की सुविधा मिलती है, जो बिना किसी रुकावट के नींद के पैटर्न को डीबग करने में मदद करती है कर्नेल में हर बार फ़ंक्शन को दबाने पर, अबाधित नींद ट्रिगर होती है. ऐसे सेक्शन को भी डीबग किया जा सकता है जिनमें रुकावटें और पहले से तय करने की सुविधा बंद हो. इससे ये काम किए जा सकते हैं समस्याओं को साबित करने में काफ़ी मददगार होंगी.

डाइनैमिक ftrace चालू करने के लिए, अपने कर्नेल के defconfig में बदलाव करें:

  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 दस्तावेज़ पढ़ने की सलाह दें क्योंकि वे शक्तिशाली लेकिन जटिल हैं. इरक़्सऑफ़ और प्रीम्प्टऑफ़ मुख्य रूप से यह इस बात की पुष्टि करने में मदद करता है कि ड्राइवर की वजह से, रुकावटें पैदा हो सकती हैं या पहले से ही देरी हो सकती है के लिए बंद किया गया हो.

परफ़ॉर्मेंस की समस्याओं को हल करने के लिए, फ़ंक्शन प्रोफ़ाइलर सबसे अच्छा विकल्प होता है. अक्सर ऐसा होता है कि का इस्तेमाल यह पता लगाने के लिए किया जाता है कि फ़ंक्शन को कहां कॉल किया जा रहा है.


अगर फ़ंक्शन प्रोफ़ाइलर से मिला डेटा सटीक नहीं है, तो एक साथ जोड़ा जा सकता है फ़ंक्शन प्रोफ़ाइलर के साथ ftrace की ट्रेस फ़ाइलें. ftrace इवेंट को इसमें चालू किया जा सकता है बिलकुल पहले की तरह ही, और वे आपके ट्रेस के साथ शामिल हो जाएंगे. अगर किसी खास समय में लंबे समय तक बिना रुकावट की नींद आती है, तो यह बहुत बढ़िया है जिस फ़ंक्शन को डीबग करना है: ftrace फ़िल्टर को अपने मनचाहे फ़ंक्शन पर सेट करें, ट्रेस पॉइंट चालू कर सकते हैं, ट्रेस कर सकते हैं. आप इससे बनने वाले ट्रेस को पार्स कर सकते हैं trace2html, अपनी पसंद का इवेंट ढूंढें. इसके बाद, आस-पास के स्टैक ट्रेस पाएं रॉ ट्रेस में बदल जाता है.

लॉकस्टेट का इस्तेमाल करें

कभी-कभी, ftrace काफ़ी नहीं होता है और आपको असल में जो दिखता है उसे डीबग करने की ज़रूरत होती है कर्नेल लॉक का विवाद होना चाहिए. एक और कर्नेल विकल्प है जिसे आज़माएं: CONFIG_LOCK_STAT. यह आखिरी रिज़ॉर्ट है क्योंकि यह Android डिवाइसों पर काम करना कठिन होता है, क्योंकि यह कर्नेल को उस सीमा से आगे बढ़ाएं जिसे ज़्यादातर डिवाइस संभाल सकते हैं.

हालांकि, lockstat डीबग का इस्तेमाल करता है लॉकिंग इन्फ़्रास्ट्रक्चर है, जो कई दूसरे ऐप्लिकेशन के लिए काम का होता है. सभी के लिए उपलब्ध डिवाइस को लाने पर काम करने से कोई रास्ता तय करना चाहिए जिससे वह विकल्प काम करे पर अपने Google खाते से साइन इन करना होगा, क्योंकि एक ऐसा समय आता है जब आपको लगता है कि "अगर सिर्फ़ मैं 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
    

नतीजे के तौर पर मिले आउटपुट को समझने में मदद के लिए, lockstat दस्तावेज़ देखें <kernel>/Documentation/locking/lockstat.txt पर है.

वेंडर ट्रेसपॉइंट इस्तेमाल करें

पहले अपस्ट्रीम ट्रेसपॉइंट इस्तेमाल करें, लेकिन कभी-कभी आपको वेंडर ट्रेसपॉइंट का इस्तेमाल करना होगा:

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

HAL सेवा की मदद से, ट्रेसपॉइंट बढ़ाए जा सकते हैं. इससे आपको डिवाइस के हिसाब से ट्रेस जोड़ने की सुविधा मिलती है पॉइंट/कैटगरी. ट्रेसपॉइंट को परफ़ेटो, ऐटरेस/सिस्ट ट्रेस, और डिवाइस पर मौजूद सिस्टम के साथ इंटिग्रेट किया गया है ट्रेस करने वाला ऐप्लिकेशन.

ट्रेसपॉइंट/कैटगरी लागू करने के लिए, ये एपीआई इस्तेमाल किए जाते हैं:

  • listcategory()जनरेट करता है (vec<TracingCategory> कैटगरी);
  • सक्षम करने वाली श्रेणी(vec<string> श्रेणियां) जनरेट होती हैं (स्टेटस की स्थिति);
  • discountAllCategory() जनरेट करती है (स्टेटस की स्थिति);
ज़्यादा जानकारी के लिए, HAL की परिभाषा और डिफ़ॉल्ट तौर पर लागू होने वाली सेटिंग देखें AOSP: