2013-03-07 4 views
12

मैं कर्नेल बूट प्रक्रिया के दौरान ftrace function_graph के साथ एक फ़ंक्शन का पता लगाने के लिए यह जानना चाहता हूं कि यह क्या करता है, लेकिन यह available_filter_functions में उपलब्ध नहीं है।ftrace function_graph tracer के लिए एक linux कर्नेल फ़ंक्शन उपलब्ध कैसे करें?

मैंने इसे EXPORT_SYMBOL() के साथ निर्यात करने का प्रयास किया, अनुमान लगाया कि यह इसे उपलब्ध कराएगा लेकिन ऐसा नहीं है।

क्या आपके पास कोई समाधान है?

जानकारी के लिए, मैं ट्रेस करना चाहता हूं, persistent_ram_init_ringbuffer और persistent_ram_early_init एंड्रॉइड कर्नेल 3.4 में हैं।

मैं प्रलेखन के माध्यम से पढ़ने, लेकिन इस पर कुछ भी नहीं मिला और ग्रेप अधिक मदद नहीं था ...

धन्यवाद

+0

Ftrace की मेरी समझ से, कार्यों की गतिशील ट्रेसिंग प्रत्येक कर्नेल फ़ंक्शन की शुरुआत में एक mcount फ़ंक्शन कॉल पर निर्भर करती है। यदि आपके द्वारा रुचि रखने वाले फ़ंक्शन में यह नहीं है कि एक उपलब्ध फ़िल्टर दिखाई नहीं दे रहा है। क्या आपने गतिशील ट्रेसिंग का उपयोग नहीं किया है? यह बेहतर परिणाम पैदा कर सकता है। –

+1

EXPORT_SYMBOL को कर्नेल मॉड्यूल लोडर के साथ जीपीएल/गैर-जीपीएल लाइसेंसिंग मुद्दों को हल करने के लिए अधिक प्रतीत होता है, न कि Ftrace। – bazza

+1

जब आप available_filter_functions सूचीबद्ध करते हैं तो कुछ भी सूचीबद्ध होता है? जब आप CONFIG_FUNCTION_TRACER (और अन्य सभी ftrace gubbins) के साथ कर्नेल को संकलित करते हैं तो मैं बता सकता हूं कि कर्नेल फ़ंक्शन एंट्री/एक्जिट ट्रेसिंग पर स्विच किया गया है gcc कमांड लाइन पर विकल्प सेट करके कार्यान्वित किया जाता है। ये विकल्प जीसीसी को संकलित करने वाले प्रत्येक फ़ंक्शन के लिए एक विशेष फ़ंक्शन कॉल को उत्सर्जित करने का कारण बनते हैं। अगर मैं इसे सही समझ गया हूं तो इसका मतलब है कि किसी भी लिनक्स कर्नेल फ़ंक्शन को स्वचालित रूप से ftrace द्वारा कैप्चर किया जाना चाहिए। इससे मुझे आश्चर्य होता है कि वर्तमान में आपके कर्नेल में कुछ भी पता लगाने योग्य था। – bazza

उत्तर

8

समस्या यह है कि उन कार्यों को __init और __devinit के साथ एनोटेट किया गया है, जो काले रंग के फ़ंक्शन ट्रेस द्वारा सूचीबद्ध हैं।

क्यों? चूंकि मॉड्यूल इनिट फ़ंक्शन (या कर्नेल इनिट फ़ंक्शंस) के रूप में वे प्रारंभिकरण के दौरान लोड होते हैं और प्रारंभ होने पर हटा दिए जाते हैं। प्रत्येक कार्य जो निशान को छेड़छाड़ करता है उसे एक विशेष कॉम्पैक्ट टेबल में रखा जाता है। वर्तमान में, ftrace को बताने का कोई तरीका नहीं है कि उन कार्यों को हटा दिया गया है (मुक्त) और उस ftrace उन्हें अपनी मेज से हटा देना चाहिए। अगर हम इसे अनदेखा करना चाहते थे, तो जब फंक्शन ट्रेसिंग सक्षम होती है, तो ftrace उन स्थानों को संशोधित करने का प्रयास करेगा जो अब मौजूद नहीं हैं और सभी प्रकार के मुद्दों का कारण बन सकते हैं (e1000e बग याद रखें?)।

यदि आप वास्तव में उन्हें ढूंढना चाहते हैं, तो उन टिप्पणियों को हटा दें। फिर उन्हें ट्रेस करने के लिए कार्यों की सूची में दिखाई देना चाहिए।

+0

उत्तर के लिए धन्यवाद। मुझे 'नोट्रेस' के बारे में पता था, लेकिन '__init' और' __devinit' के दायरे से नहीं। –

+1

वाह .... आपको यहां देखकर अच्छा लगा स्टीवन रोस्टेड। आप निश्चित रूप से linux कर्नेल में ftrace API के मूल लेखक में से एक हैं। –

+0

मैं * sched_wakeup * का पता नहीं लगा सकता, भले ही इसमें स्पष्ट रूप से __init या __devinit झंडे न हों। – Claudio

संबंधित मुद्दे