2013-06-21 4 views
5

मैं बहुत उलझन में हूं। मुझे नहीं पता कि क्या oprofile एक प्रोफाइलिंग रिपोर्ट से एक स्टैक ट्रेस भी प्रदान कर सकता है। मैं oprofile मैनुअल की समीक्षा किया गया है और यह केवल कि they can be logged कह कर stacktraces को संदर्भित करता है, लेकिन यह ऐसा करने के तरीके के लिए एक उदाहरण देना नहीं है।oprofile आउटपुट से कॉलस्टैक कैसे प्राप्त करें?

यहाँ मेरी test.cpp

#include <iostream>        
#include <unistd.h>        
using namespace std;        

void test(){          
    for (int x = 0; x < 100000; x++) cout << "."; 
    sleep(1);          
    cout << endl;         
};            

int main(int argv, char** argc){     
    for (int x = 0; x < 120; x++) test();   
    return 0;          
}             

है यहाँ आदेश मैं इसे संकलित करने के लिए प्रयोग किया जाता है:

g++ -g -Wall test.cpp -o test 

और, यहाँ मेरी perf.sh स्क्रिप्ट (एक वी एम में RHEL 6.2 पर चल रहा है) है:

#!/bin/bash -x 
sudo opcontrol --no-vmlinux             
sudo opcontrol --reset              
sudo opcontrol --start --separate=library,thread --image=$HOME/test 
sudo opcontrol --callgraph=10            
sudo opcontrol --status              
read -p "Press [Enter] key to stop profiling"                  
sudo opcontrol --dump || exit 1            
sudo opreport --demangle=smart \            
       --merge=all \             
       --symbols \             
       --callgraph \             
       --global-percent \            
       --output-file=perf.out           
sudo opcontrol --shutdown             
sudo opcontrol --reset              

यहाँ रिपोर्ट है कि मैं, हो रही है इस समय है:

CPU: CPU with timer interrupt, speed 0 MHz (estimated)        
Profiling through timer interrupt             
samples %  app name     symbol name        
------------------------------------------------------------------------------- 
14  43.7500 libstdc++.so.6.0.13  /usr/lib64/libstdc++.so.6.0.13   
    14  43.7500 libstdc++.so.6.0.13  /usr/lib64/libstdc++.so.6.0.13 [self] 
------------------------------------------------------------------------------- 
11  34.3750 libc-2.12.so    fwrite         
    11  34.3750 libc-2.12.so    fwrite [self]       
------------------------------------------------------------------------------- 
5  15.6250 libc-2.12.so    [email protected]@GLIBC_2.2.5   
    5  15.6250 libc-2.12.so    [email protected]@GLIBC_2.2.5 [self] 
------------------------------------------------------------------------------- 
2   6.2500 libc-2.12.so    __strlen_sse42       
    2   6.2500 libc-2.12.so    __strlen_sse42 [self]     
------------------------------------------------------------------------------- 

और, मेरा प्रश्न: मैं प्रोफाइलिंग रिपोर्ट में दिखाने के लिए स्टैक निशान कैसे प्राप्त कर सकता हूं?

+1

अच्छा सवाल। डॉक्टर का वह बिट बहुत स्पष्ट नहीं है। कॉल गणना नहीं दिखाने के लिए माफ़ी मांगना है, जो नमूनाकरण के तहत अप्रासंगिक हैं। आपको मूल रूप से दो भागों में 100% टूटा हुआ देखना चाहिए। एक 'मुख्य होगा: 12 -> टेस्ट: 7 -> नींद -><प्रणाली दिनचर्या>' 'और अन्य मुख्य होगा: 12 -> परीक्षण: 8 -> अदालत :: endl -><प्रणाली आईओ दिनचर्या>' । मुझे संदेह है कि इसमें से ज्यादातर नींद में होंगे। मुझे संदेह है कि 'cout << "में बहुत कम होगा।" जब तक कि आप' stderr' पर आउटपुट नहीं कर रहे थे। वैसे भी, जीडीबी में कई स्टैकशॉट आपको दिखाएंगे। –

+0

हाँ। जीडीबी oprofile की तुलना में थोड़ा अधिक सहायक है, सिवाय इसके कि मुझे एक बहुप्रचारित ऐप में oprofile का उपयोग करने की आवश्यकता है जो मैंने ऊपर लिखी गई टेस्ट स्क्रिप्ट से काफी बड़ी है। तो, जीडीबी का उपयोग वास्तव में मेरे लिए काम नहीं करेगा। दूसरों के साथ बात करने के बाद, मुझे लॉगिंग का उपयोग करने के लिए उपकरण की तरह लग रहा है + टाइमर अधिक समझ में आ सकता है। – bitcycle

+0

ठीक है, यहाँ मैं क्या कर सकता है: कई धागा मामले में, जब मैं इसमें बाधा डालते हैं, हर धागा रोक दिया जाता है, तो मैं प्रत्येक थ्रेड पर एक 'bt' मिलता है। जो कुछ भी नहीं कर रहे हैं, जैसे इनपुट की प्रतीक्षा करना, मैं अनदेखा करता हूं। अन्य मूल्यवान हैं। मुझे लगता है कि लक्ष्य को मापने के तरीकों के रूप में कोड को तेजी से बनाने के तरीकों को ढूंढना है। शायद यह आपका लक्ष्य नहीं है। आप दूसरों से बात कर सकते हैं, लेकिन यह तकनीक उतनी अच्छी तरह से ज्ञात नहीं है जितना होना चाहिए, इसलिए आप जानते हैं कि आप क्या सुन सकते हैं। –

उत्तर

1

(यह थोड़ी देर हो चुकी है, लेकिन इस किसी और मदद कर सकता है) क्योंकि आप टाइमर मोड में रूपरेखा रहे हैं (जो कुछ CPUs पर डिफ़ॉल्ट व्यवहार है)

, backtracing निष्क्रिय किया जा सकता है आपके कर्नेल में (कौन सा संस्करण 2.6.32 प्रतीत होता है, क्योंकि आप आरएचईएल 6.2 पर हैं)।

आप करने की कोशिश कर सकते हैं: अगर वहाँ वास्तव में अपने कर्नेल संस्करण में एक सीमाओं, इस हो सकता है, oprofile की गिरी भाग के the history पर एक नजर है

  1. उपयोग हार्डवेयर काउंटरों
  2. निश्चित
  3. अद्यतन आपकी गिरी

मैं एक ही कर्नेल रिलीज के साथ ही समस्या का सामना करना पड़ा, लेकिन जब से मैं एआरएम पर हूँ, मेरे qui सीके-फिक्स काम नहीं करेगा (this इस मामले में लागू करने के लिए पैच है)।

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