2012-05-12 14 views
12

पर Google Perftools CPU प्रोफाइलर में लाइन नंबर मैकोज़क्स पर कुछ सी ++ प्रोग्राम प्रोफाइल करने का प्रयास कर रहा हूं। इसलिए मैंने google-perftools बनाया, मैकपॉर्ट्स जी ++ 4.7 का उपयोग करके संकलित एक प्रोग्राम लिखा, -g कंपाइलर ध्वज के साथ, और libprofiler से जुड़ा हुआ है। तब मैं भाग गया:मैकोज़क्स

CPUPROFILE=cpu.profile ./a.out 

तब मैं उत्पादन उत्पन्न करने के लिए pprof भाग गया:

[hidden ~]$ pprof --text ./a.out cpu.profile 
Using local file ./a.out. 
Using local file cpu.profile. 
Removing __sigtramp from all stack traces. 
Total: 282 samples 
    107 37.9% 37.9%  107 37.9% 0x000000010d72229e 
     16 5.7% 43.6%  16 5.7% 0x000000010d721a5f 
     12 4.3% 47.9%  12 4.3% 0x000000010d721de8 
     11 3.9% 51.8%  11 3.9% 0x000000010d721a4e 
     9 3.2% 55.0%  9 3.2% 0x000000010d721e13 
     8 2.8% 57.8%  8 2.8% 0x000000010d721a64 
     7 2.5% 60.3%  7 2.5% 0x000000010d7222f0 
     6 2.1% 62.4%  6 2.1% 0x000000010d721a4c 
     6 2.1% 64.5%  6 2.1% 0x000000010d721b1f 
     6 2.1% 66.7%  6 2.1% 0x000000010d721e0c 
     5 1.8% 68.4%  5 1.8% 0x000000010d721fba 
    ...... 

ऐसा लगता है कि perftools नाम से कार्य करने के पते नहीं करेंगे।

क्या कोई जानता है कि मैं यहां क्या खो रहा हूं? प्रोफाइलर को सही परिणाम उत्पन्न करने के लिए मुझे क्या करना चाहिए।

संपादित करें: अधिक जानकारी: यह पीप्रोफ या google-perftools की समस्या नहीं है, लेकिन जीसीसी या मैकोक्स की तरह कुछ और है, क्योंकि Instrument.app लाइन संख्याओं के बजाय पते भी दिखाता है। मैक ओएस एक्स के तहत डीबग प्रतीक कैसे काम करते हैं, इस बारे में मैं परिचित नहीं हूं, इसलिए मैं इसे जीसीसी या मैक ओएस एक्स में बग होने की बजाय यहां कुछ याद कर रहा हूं। मुझे आश्चर्य है कि कोई भी डिबग जानकारी कैसे काम करता है इस पर कुछ संकेत प्रदान कर सकता है मैक ओएस एक्स

+0

"मैं कुछ सी ++ प्रोग्राम प्रोफाइल की कोशिश कर रहा हूं" तो आप इस प्रश्न को सी के रूप में क्यों टैग करते हैं? –

+0

यह समस्या सी ++ के लिए विशिष्ट नहीं है, लेकिन सी –

+0

पर भी मैं ओएस एक्स देव और न ही googleperf से परिचित नहीं हूं, लेकिन मैंने पहले libs प्रोफाइलिंग का उपयोग किया है, और साथ ही साथ डीबगिंग के लिए ध्वज झंडा भी किया है, हमें प्रोफ़ाइल विवरण प्राप्त करने के लिए कंपाइलर और लिंकर को -पी ध्वज जोड़ें .. – fduff

उत्तर

4

मुझे इस प्लेटफ़ॉर्म में विश्वास है कि डीबग प्रतीक .o फ़ाइल में रहते हैं, वे निष्पादन योग्य में स्थानांतरित नहीं होते हैं। जीडीबी या प्रोफाइलर्स में प्रतीकों को प्राप्त करने के लिए आपको .o फ़ाइलों को सहेजने की आवश्यकता है। इसका अर्थ यह हो सकता है कि आपको .o फ़ाइलों को संरक्षित करने के लिए अपने एप्लिकेशन को दो चरणों (संकलित करें, फिर लिंक) में संकलित करने की आवश्यकता है।

अतिरिक्त जानकारी के लिए this question देखें।

pprof पर्ल स्रोत कोड देख में, प्रतीक नाम nm और c++filt के उपयोग के माध्यम से प्राप्त कर रहे हैं, ताकि आप उन स्टैंडअलोन चलाने के लिए और यह पता लगाने की है कि वे काम नहीं करते की कोशिश कर सकते। पीआरएफओफ़ स्रोत से ऐसा लगता है कि यह एनएम के कई संस्करणों को कवर करने के लिए विभिन्न कमांड लाइन तर्कों का एक गुच्छा करने की कोशिश करता है। यह

एनएम [-D] -n [-f] [--demangle] ऑब्जेक्ट-फ़ाइल 2>/dev/nul [| सीपीपी + फिल्टर]

जो हिस्सों मैंने ब्रैकेट में रखे हैं वे हैं कि स्क्रिप्ट आपके प्लेटफ़ॉर्म और एनएम और सी ++ फ़िल्टर के संस्करणों के लिए आवश्यक रनटाइम पर निर्धारित करती है। उपर्युक्त सभी संयोजनों को आजमाएं और देखें कि क्या काम करता है। फिर देखें कि पीप्रूफ स्क्रिप्ट क्या करती है, शायद इसमें कुछ प्रिंटफ जोड़कर।

शुभकामनाएं।

+0

यह मदद नहीं करता है। मैंने .o फ़ाइलों को सहेजने की कोशिश की लेकिन पीआरएफओफ़ अभी भी लाइन नंबरों के बजाय पते प्रिंट करता है। –

+0

समस्या पीआरएफओफ़ नहीं है, मैं इन प्रतीकों को लोड करने के लिए जीडीबी के भीतर काम करूंगा, जो आपको बता रहा है कि क्या हो रहा है। हो सकता है कि .o फ़ाइलें अपेक्षा से भिन्न निर्देशिका में हों। – Miguel

+0

मेरे पास इस पर कुछ प्रगति हुई थी: यदि मैं 'CPUPROFILE = cpu.profile gdb।/A.out' का उपयोग कर प्रोग्राम शुरू करता हूं, तो' gdb' के अंदर 'start' और' cont' ', मैं प्रतीकों को सही तरीके से प्राप्त कर सकता हूं। तो मुझे लगता है कि यह Google-perftools की समस्या हो सकती है जो सामान्य रूप से प्रोग्राम शुरू करने पर प्रतीकों को लोड नहीं करता है, ताकि 'cpu.profile' के अंदर दर्ज पता गलत हो। चूंकि 'gdb' बहुत धीमी है और हर बार चलाने के लिए व्यावहारिक नहीं है, इसलिए मुझे वास्तव में प्रोग्राम को सामान्य रूप से 'gdb' के बिना शुरू करने की आवश्यकता होती है। तो क्या आपको कोई विचार है कि मैं इसे कैसे काम कर सकता हूं? धन्यवाद। –

6

यह पता स्थान लेआउट randomization (ASLR) ओएस एक्स में पेश 10.5

मैं gperftools समस्या ट्रैकर पर issue #562 मामला दर्ज किया है करने के लिए संबंधित प्रतीत होती है। आप -Wl,-no_pie पास करके एएसएलआर को अक्षम कर सकते हैं।

इसके अलावा, यदि आप gperftools, Instruments (Xcode के साथ आता है) का उपयोग करने के लिए बाध्य नहीं हैं, तो कोशिश करने योग्य है।

+0

धन्यवाद, यह बिल्कुल था। -Wl, -no_pie मैक ओएस पर "बॉक्स से बाहर" pprof काम करता है। – Ogre