2009-12-03 10 views
19

से जुड़ी साझा लाइब्रेरी में फ़ंक्शंस के लिए कॉल ग्राफ़ कैसे उत्पन्न करें, मैं लिनक्स पर्यावरण पर काम कर रहा हूं। मेरे पास दो 'सी' स्रोत पैकेज ट्रेन और test_train है।gprof: मुख्य प्रोग्राम

  1. ट्रेन पैकेज जब संकलित libtrain.so
  2. test_train लिंक उत्पन्न करता है libtrain.so करने और निष्पादन योग्य ट्रेन परीक्षण उत्पन्न

अब मैं gprof जिनमें से बुला क्रम दर्शाती का उपयोग करके कॉल ग्राफ उत्पन्न करना चाहते हैं मुख्य कार्यक्रम के साथ-साथ libtrain.so

मैं दोनों पैकेजों को संकलित और लिंक कर रहा हूं -जीपी विकल्प और डीबगिंग स्तर o0 है। मैं करता हूं ./train-test, gmon.out उत्पन्न होता है। तब मैं कार्य करें:

$ gprof -q ./train-test gmon.out 

यहाँ, उत्पादन से पता चलता है ट्रेन की परीक्षा में कार्यों का ग्राफ फोन लेकिन libtrain.so

क्या समस्या हो सकती है में नहीं है?

उत्तर

17

gprof काम नहीं करेगा, आपको इसके बजाय sprof का उपयोग करने की आवश्यकता है। 2 लिंक से

सारांश::

  1. डिबग में अपनी साझा लाइब्रेरी (libmylib.so) संकलित (जी) मैं इन कड़ियों उपयोगी पाया मोड। नहीं -जीपी
  2. निर्यात LD_PROFILE_OUTPUT = `pwd`
  3. निर्यात LD_PROFILE = libmylib.so
  4. rm -f $ LD_PROFILE.profile
  5. अपने कार्यक्रम कि libmylib.so
  6. sprof पथ-से-उदारीकरण/$ लोड करता है पर अमल LD_PROFILE $ LD_PROFILE.profile -p> लॉग
  7. लॉग देखें।

मैंने पाया कि चरण 2 में, यह एक मौजूदा निर्देशिका होने की आवश्यकता है - अन्यथा आपको एक उपयोगी चेतावनी मिलती है। और चरण 3 में, आपको लाइब्रेरी को libmylib.so.X (शायद .X.Y, सुनिश्चित नहीं) के रूप में निर्दिष्ट करने की आवश्यकता हो सकती है - अन्यथा आपको कोई चेतावनी नहीं मिलती है।

+0

यह ध्यान देने योग्य है कि अक्सर आप काम कर सकते हैं कि लाइब्रेरी का नाम क्या है जो आपकी बाइनरी लोड करने की कोशिश कर रहा है (mylib.so बनाम mylib.so.1 बनाम mylib.so.1.1 आदि) एप्लिकेशन पर 'ldd' चलाकर) । यदि प्रत्यक्ष डायलोपेन कॉल के माध्यम से लाइब्रेरी खोला जा रहा है तो इसमें केवल एक प्रविष्टि नहीं होनी चाहिए। –

+1

बहुत खराब स्प्राफ बहुत बुरी तरह दुर्घटनाग्रस्त हो जाता है, जैसा कि [इस सवाल] में है (http://stackoverflow.com/questions/6216979/what-is-causing-sprof-to-complain-about-inconsistency-detected-by-ld-so) –

+0

क्या होगा अगर मेरी परियोजना के लिए चुने गए संकलक, मिनीजीडब्ल्यू के साथ स्पॉफ नहीं आती है? – Charles

0

यदि आप लिनक्स पर नहीं हैं (जैसे सोलारिस पर मुझे) तो आप बस भाग्य से बाहर हैं क्योंकि sprof कोई नहीं है। यदि आपके पास अपनी लाइब्रेरी का स्रोत है तो आप एक स्थिर लाइब्रेरी को जोड़कर और अपनी प्रोफाइलिंग बाइनरी को इसके बजाय बनाकर अपनी समस्या का समाधान कर सकते हैं। साझा पुस्तकालयों को कॉल का पता लगाने का एक और तरीका है, truss का उपयोग कर। विकल्प -u [!]lib,...:[:][!]func, ... के साथ एक रन के कॉल इतिहास की एक अच्छी तस्वीर मिल सकती है। यह प्रोफाइलिंग के समान नहीं है लेकिन कुछ परिदृश्यों में बहुत उपयोगी हो सकता है।

1

मैं अपनी लाइब्रेरी पाइथन से लोड कर रहा हूं और sprof के साथ कोई भाग्य नहीं है।इसके बजाय, मैं oprofile इस्तेमाल किया है, जो फेडोरा खजाने में था, कम से कम: आपके आवेदन के लिए

operf --callgraph /path/to/mybinary

प्रतीक्षा समाप्त या रूपरेखा को रोकने के लिए कर सीटीएल-सी है। अब हम एक प्रोफ़ाइल सारांश उत्पन्न करते हैं:

opreport --callgraph --symbols

documentation यह व्याख्या करने के लिए देखें। यह एक गड़बड़ है। जेनरेट की गई रिपोर्ट में, प्रत्येक प्रतीक को अपने ब्लॉक में सूचीबद्ध किया जाता है। ब्लॉक का मुख्य प्रतीक वह है जो इंडेंट नहीं है। इसके ऊपर की वस्तुएं वे कार्य हैं जो उस फ़ंक्शन को कॉल करती हैं, और इसके नीचे वाले लोग वे चीजें हैं जिन्हें इसके द्वारा बुलाया जाता है। नीचे दिए गए खंड में प्रतिशत उन कैलिफोर्निया में बिताए गए समय की सापेक्ष मात्रा हैं।

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