2012-04-18 7 views
7

मैं लिनक्स परफ का उपयोग कर एक सी ++ एप्लिकेशन प्रोफाइल कर रहा हूं, और मुझे GProf2dot का उपयोग करके एक अच्छा नियंत्रण प्रवाह ग्राफ मिल रहा है। हालांकि, सी लाइब्रेरी (libc6-2.13.so) से कुछ प्रतीकों कुल समय का एक बड़ा हिस्सा लेते हैं, और फिर भी इन-किनारों में नहीं हैं।मैं linux perf के साथ libc6 प्रतीकों (उदा। _int_malloc) के लिए कॉल अभिभावक कैसे प्राप्त करूं?

उदाहरण के लिए:

  • _int_malloc समय के 8% लेता है, लेकिन कोई कॉल माता-पिता है।
  • __strcmp_sse42 और __cxxabiv1::__si_class_type_info::__do_dyncast एक साथ समय का लगभग 10% ले, और एक फोन करने वाले जिसका नाम 0 है, जो कॉल करने 2d6935c, 2cc748c, और 6, जो कोई कॉल करने के लिए है है है।

नतीजतन, मुझे नहीं पता कि कौन सी दिनचर्या सिर्फ इस परफॉर्मिंग और गतिशील कास्टिंग के लिए जिम्मेदार है। हालांकि, ऐसा लगता है कि अन्य प्रतीकों (उदा। malloc लेकिन _int_malloc नहीं) माता-पिता को कॉल करें।

क्यों perf को माता-पिता को _int_malloc के लिए कॉल नहीं दिखाता है? मैं __do_dyn_cast के अंतिम कॉलर क्यों नहीं ढूंढ सकता? और, क्या मेरे सेटअप को संशोधित करने का कोई तरीका है ताकि मैं यह जानकारी प्राप्त कर सकूं? मैं x86-64 पर हूं, इसलिए मुझे आश्चर्य है कि मुझे फ्रेम पॉइंटर्स के साथ एक (गैर मानक) libc6 की आवश्यकता है।

+0

एमसीएमसी के लिए +1, और एसओ में आपका स्वागत है। –

उत्तर

5

अद्यतन: 3.7.0 गिरी के रूप में, एक प्रतीकों में से कॉल माता-पिता प्रणाली पुस्तकालयों में perf record -gdwarf <command> का उपयोग यह निर्धारित कर सकते हैं।

-gdwarf का उपयोग करके, -fno-omit-frame-pointer के साथ संकलित करने की कोई आवश्यकता नहीं है।

मूल जवाब: हाँ, एक शायद (24 मई, 2012) एक libc6 x86_64 पर फ्रेम संकेत (-fno-omit-framepointer), इस समय के साथ संकलित की आवश्यकता होगी।

हालांकि, डेवलपर वर्तमान में परफ टूल्स को डीडब्ल्यूएआरएफ का उपयोग करने की अनुमति देने के लिए काम कर रहे हैं। इसका मतलब है कि x86_64 पर बैकट्रैक जानकारी प्राप्त करने के लिए फ्रेम पॉइंटर्स की आवश्यकता नहीं है। हालांकि, लिनस कर्नेल में डीडब्ल्यूएआरएफ को अनचाहे नहीं चाहता है। इस प्रकार, perf उपकरण रजिस्टरों को सिस्टम के चलते सहेजते हैं, और libwwind लाइब्रेरी का उपयोग कर उपयोगकर्ता स्पेस पेर्फ टूल में डीडब्ल्यूएआरएफ को अनदेखा करते हैं।

इस तकनीक का सफलतापूर्वक कॉलर (उदाहरण के लिए) malloc और dynamic_cast के कॉलर निर्धारित करने के लिए परीक्षण किया गया है। हालांकि, पैच सेट अभी तक लिनक्स कर्नेल में एकीकृत नहीं है, और इसे तैयार होने से पहले और संशोधन करने की जरूरत है।

+0

धन्यवाद। '-gdwarf' की बजाय मेरी मशीन' -कॉल-ग्राफ बौने 'की आवश्यकता थी – Lack

1

_int_malloc और __do_dyn_cast को दिनचर्या से बुलाया जा रहा है कि प्रोफाइलर पहचान नहीं सकता है क्योंकि इसमें उनके लिए प्रतीक तालिका जानकारी नहीं है।

और क्या है, ऐसा लगता है कि आप स्वयं (अनन्य) समय दिखा रहे हैं। यह केवल दिनचर्या में हॉटस्पॉट खोजने के लिए उपयोगी है कि ए) बहुत अधिक समय है, और बी) आप ठीक कर सकते हैं।

मूल यूनिक्स profil के बाद एक कारण प्रोफाइलर बनाए गए थे। वास्तविक सॉफ़्टवेयर में ऐसे फ़ंक्शंस होते हैं जो लगभग सभी कार्यों को अन्य कार्यों को कॉल करते हैं, और आपको उस समय के ढेर पर मौजूद कोड को खोजने में सक्षम होना चाहिए, न कि उस समय प्रोग्राम का अधिकतर समय होता है।

तो आपको स्टैक नमूने लेने के लिए perf को कॉन्फ़िगर करने की आवश्यकता है और आपको में से प्रत्येक का समय बताता है स्टैक पर है। यह बेहतर है अगर यह न केवल दिनचर्या की रिपोर्ट करता है, लेकिन Zoom में कोड की रेखाएं। वॉल-घड़ी के समय नमूने लेना सबसे अच्छा है, इसलिए आप आईओ के लिए अंधे नहीं हैं।

There's more to say on all this.

+0

धन्यवाद माइक। मुझे स्वयं समय और कॉलर समय दोनों मिला है (मैंने कॉल स्टैक प्राप्त करने के लिए perf रिकॉर्ड -g का उपयोग किया था)। मैं गतिशील जानवरों को निष्पादित करने के समय के बारे में ज्यादा कुछ नहीं कर सकता (क्या जी ++ वास्तव में strcmp के साथ टाइपइन्फो की तुलना करता है ??) लेकिन मैं यह सुनिश्चित करने की योजना बना रहा हूं कि कम गतिशील कास्टिंग (और स्मृति आवंटन) किया जाता है। ऐसा करने के लिए यह जानना अच्छा होगा कि गतिशील कास्ट और मॉलोक फ़ंक्शन क्या कह रहे हैं। – BenRI

+0

धन्यवाद माइक। मुझे स्वयं समय और कॉलर समय दोनों मिला है (मैंने perf रिकॉर्ड-जी का उपयोग किया था)। स्पष्ट रूप से मैं मॉलोक या डायनामिक_कास्ट को तेज़ी से नहीं बना सकता, इसलिए मैं यह जानने की कोशिश कर रहा हूं कि कौन सी दिनचर्या उन्हें बुला रही हैं और सबसे खराब अपराधी को ठीक कर रही हैं। मुझे लगता है कि समस्या यह है कि कुछ मामलों में कर्नेल को स्टैक फ्रेम को अनदेखा करने में परेशानी हो सकती है (नोट, सभी मामलों में नहीं) और मुझे उत्सुकता है कि कर्नेल ढेर को खोलने में विफल क्यों है और कॉलर्स को कहें (कहना) __strcmp_sse_42। मुझे ** संदेह है कि इसका उपयोग टाइपइन्फो ऑब्जेक्ट्स की तुलना करने के लिए किया जा रहा है, लेकिन कॉलर्स को जानने के बिना, यह सुनिश्चित करना मुश्किल है। – BenRI

+1

@ बेनेरी: यह लिंक चर्चा करता है कि मैं इसे कैसे करता हूं, और * [यह लिंक] (http://sourceforge.net/projects/randompausedemo/files/) * के लगभग 700x के समग्र गति अनुपात को प्राप्त करने का एक छोटा स्लाइड शो है उस तरह की समस्याओं की एक श्रृंखला को ढूंढना और ठीक करना। –

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