2013-06-21 16 views
5

Çok kafam karıştı. Oprofile, bir profil raporundan bir yığın izi bile sağlayabilir mi bilmiyorum. Oprofile el kitabını inceledim ve yalnızca they can be logged olduğunu söyleyerek stacktraces'i ifade eder, ancak bunun nasıl yapılacağına dair bir örnek vermez. Burada (bir VM RHEL 6.2 üzerinde çalışan) benim perf.sh senaryo,Oprofile çıkışından nasıl bir çağrı alırım?

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

Ve:

İşte İşte benim 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;          
}             

var bunu derlemek için kullanılan komut var: İşte

#!/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              

Ben şu anda, alıyorum raporu:

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]     
------------------------------------------------------------------------------- 

Ve, sorum: Profil oluşturma raporunda görünecek yığın izlerini nasıl alabilirim?

+1

İyi soru. Bu doktor biraz açık değil. Örnekleme altında ilgisiz olan çağrı sayılarını göstermediğinden özür diliyor. Temel olarak iki parçaya bölünmüş% 100 görmelisiniz. Biri ana: 12 -> test: 7 -> uyku -> ve diğeri "ana: 12 -> test: 8 -> cout :: endl -> . Bunun çoğunun uykuda olacağından şüpheleniyorum. Ben çok az "cout <<" olurdu şüpheleniyorum. "' Stderr 'çıktısını almadıkça. Her neyse, GDB'deki birkaç yığının size gösterdiği şey bu. –

+0

Evet. GDB, yukarıda yazdığım test komut dosyasından çok daha büyük olan çok iş parçacıklı bir uygulamada oprofile kullanmam gerektiğinden, oprofile göre biraz daha yararlı oldu. Yani, GDB kullanmak benim için gerçekten işe yaramıyor. Başkalarıyla konuştuktan sonra, günlüğe kaydetme + zamanlayıcılar kullanarak enstrüman yapmayı daha çok mantıklı bulabilirim. – bitcycle

+0

Eh, burada yapacağım şey: birçok iş parçacığı durumunda, onu keserken, her iş parçacığı durdurulur, böylece her iş parçacığında bir 'bt' aldım. Hiçbir şey yapmayanlar, girdi beklemek gibi, görmezden gelirim. Diğerleri değerlidir. Hedefin, sadece ölçümler almak yerine, kodu daha hızlı hale getirmenin yollarını bulmak olduğunu varsayıyorum. Belki bu senin amacın değil. Başkalarıyla konuşabilirsin, ama teknik olması gerektiği kadar iyi bilinmese de, ne duymayı bekleyeceğini biliyorsun. –

cevap

1

(bunu biraz geç, ama bu başkası yardımcı olabilir) (bazı CPU varsayılan davranış budur) zamanlayıcı modunda profilleme Çünkü

, backtracing devre dışı bırakılmış olabilir çekirdeğinizde (hangi sürüm 2.6.32, RHEL 6.2'de olduğunuza göre).

Sen deneyebilirsiniz: aslında senin çekirdek sürümünde bir sınırlama, bu olmuş olabilir varsa, oprofile çekirdek kısmının the history de bakabilirsiniz

  1. kullanım donanım sayaçları
  2. sabit
  3. güncellemesi kernel

aynı çekirdek sürümü ile aynı sorunla karşı karşıya ama ARM üzerinde olduğumdan beri benim qui ck-fix çalışmaz (this bu durumda uygulanacak yamadır).

İlgili konular