2012-11-29 23 views
9

gperftools documentation का कहना है कि libprofiler लक्ष्य कार्यक्रम में जोड़ा जाना चाहिए।

और फिर कार्यक्रम एक विशिष्ट वातावरण चर के साथ चलाने की जानी चाहिए:

CPUPROFILE=/tmp/profiler_output ./a.out 

सवाल यह है: कैसे libprofile शुरू करने और एक प्रोफाइलर जब यह महज भरी हुई है खत्म करने के लिए एक मौका है, लेकिन अपने कार्यों बुलाया नहीं जाता है?

उस लाइब्रेरी में कोई कन्स्ट्रक्टर फ़ंक्शन नहीं है (proof)। लाइब्रेरी कोड में All occasions of "CPUPROFILE" किसी भी स्थान का संदर्भ नहीं देता है जहां प्रोफाइलर प्रारंभ होता है।

मैं विचारों से बाहर हूं, कहां देखना है?

उत्तर

8

लाइब्रेरी को लिंक करने के तहत लिंक किए गए वेबपृष्ठ के दस्तावेज के अनुसार, यह वर्णन करता है कि -प्रोफाइलर चरण LD_PRELOAD विकल्प के साथ साझा ऑब्जेक्ट फ़ाइल के विरुद्ध लिंक करने जैसा ही है।

साझा ऑब्जेक्ट फ़ाइल केवल हेडर फ़ाइल के समान नहीं है। हेडर फ़ाइल में फ़ंक्शन घोषणाएं होती हैं जिन्हें प्रोग्राम को संकलित करते समय देखा जाता है, इसलिए फ़ंक्शंस के नाम हल होते हैं, लेकिन नाम केवल नाम हैं, कार्यान्वयन नहीं। साझा ऑब्जेक्ट फ़ाइल (.so) में फ़ंक्शंस के कार्यान्वयन शामिल हैं। अधिक जानकारी के लिए the following StackOverflow answer देखें।

Source file of /trunk/src/profiler.cc लाइन 182 पर, एक सीपीयूप्रोफाइलर कन्स्ट्रक्टर है, जो यह जांचता है कि प्रोफाइलिंग सक्षम होना चाहिए या CPUPROFILE पर्यावरण चर (रेखा 187 और रेखा 230) पर आधारित नहीं है।

यह तो रेखा 237. पर प्रारंभ समारोह इस फ़ाइल में टिप्पणी के अनुसार, नाशक लाइन 273 पर स्टॉप फ़ंक्शन को कॉल

अपने प्रश्न का उत्तर देने कॉल मेरा मानना ​​है कि लाइन 132 CpuProfiler CpuProfiler::instance_; लाइन है, जहां CpuProfiler तत्काल है।

gperftools प्रलेखन में स्पष्टता की कमी ज्ञात समस्या here देखें।

+0

हाय Appleman1234 (मेरा उत्तर gperftools के 2.0 संस्करण पर आधारित है), अपने जवाब के लिए धन्यवाद। हां, आपके द्वारा इंगित लाइन संख्याओं में CPUPROFILE पर्यावरण परिवर्तक के साथ कुछ करना है। लेकिन वे उस env चर के _absence_ की जांच करते हैं, उपस्थिति नहीं। इसका मतलब है कि प्रोफाइलर के लिंक के आधार पर सीपीयूप्रोफाइलर पहले से ही तत्काल हो चुका है।तो जुड़ाव (और उसके बाद कन्स्ट्रक्टर चेक करता है अगर चर प्रस्तुत करता है आदि)। और अभी भी ऐसी कोई जगह नहीं है! लाइब्रेरी लोडिंग पर प्रतिक्रिया दे सकते हैं, लेकिन यह नहीं है (मैंने ओपी पोस्ट में एक प्रोफेसर रखा है)। कोई भी विचार जहां (और कैसे/क्यों) CpuProfile को केवल एक लिंक के कारण तुरंत चालू किया जाता है? –

+0

ओह ठीक है! यह बिल्कुल जगह है। संस्करण के लिए धन्यवाद, अंत में यह कुल स्पष्ट है। बहुत बहुत शुक्रिया। –

0

मुझे लगता है कि प्रोफाइलर प्रोफाइल-handler.cc के साथ-साथ heap-checker.cc, heap-profiler.cc, आदि के नीचे देखे गए REGISTER_MODULE_INITIALIZER मैक्रो के साथ प्रारंभ होता है। यह src/base/googleinit.h को कॉल करता है जो एक डमी स्थिर ऑब्जेक्ट को परिभाषित करता है जिसका लाइब्रेरी लोड होने पर कन्स्ट्रक्टर कहलाता है। उस डमी कन्स्ट्रक्टर को फिर प्रोफाइलहैंडलर रजिस्ट्रार थ्रेड() कहते हैं जो सिंगलटन ऑब्जेक्ट (प्रोफाइलहैंडलर :: instance_) को प्रारंभ करने के लिए pthread_once चर का उपयोग करता है।

फ़ंक्शन REGISTER_MODULE_INITIALIZER Linux लोड करने योग्य कर्नेल मॉड्यूल में देखे गए मॉड्यूल_इनिट()/module_exit() फ़ंक्शंस को अनुकरण करता है।

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

  • कोई संबंधित समस्या नहीं^_^