2013-06-21 4 views
5

나는 너무 혼란 스럽다. oprofile이 프로파일 링 보고서에서 스택 추적을 제공하는지조차 모르겠습니다. 나는 oprofile 설명서를 검토 중이며, 스택 트레이스는 they can be logged이라고 말하면서 만 언급하고 있지만 그렇게하는 방법에 대한 예제는 제시하지 않았습니다. 여기의 (a VM에 RHEL 6.2에서 실행) 내 perf.sh 스크립트입니다,oprofile 출력에서 ​​호출 스택을 얻는 방법은 무엇입니까?

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

을 그리고 :

여기 여기 내 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;          
}             

의 내가 컴파일하는 데 사용되는 명령입니다 : 여기

#!/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 %가 기본적으로 두 부분으로 나뉘는 것을 볼 수 있습니다. 하나는'main : 12 -> test : 7 -> sleep ->'이고 다른 하나는'main : 12 -> test : 8 -> cout :: endl -> . 나는 그것의 대부분이 잠에 든다고 생각한다. 나는 당신이'stderr'에 출력하지 않는 한''cout << "에 거의 없을 것이라고 생각합니다." 어쨌든, 그것은 GDB의 여러 스택 샷들이 보여줄 것입니다. –

+0

예. GDB는 oprofile보다 약간 더 유용합니다. 단, 위에서 쓴 스크립트보다 훨씬 큰 다중 스레드 응용 프로그램에서 oprofile을 사용해야합니다. 그래서, GDB를 사용하는 것은 실제로 나를 위해 일하지 않을 것입니다. 다른 사람들과 대화를 나누고 나면, 로깅 + 타이머를 사용한 도구가 더 이해할 수 있다고 생각합니다. – bitcycle

+0

글쎄, 내가 할 일은 다음과 같다. 쓰레드가 많은 경우, 인터럽트 할 때마다 모든 쓰레드가 멈춰서 각 쓰레드에'bt '가 생기게된다. 입력을 기다리는 것과 같이 아무것도하지 않는 것들은 무시합니다. 다른 것들은 가치가 있습니다. 필자는 측정을하는 대신 코드를 더 빠르게 만드는 방법을 찾는 것이 목표라고 가정합니다. 어쩌면 그것은 당신의 목표가 아닙니다. 당신은 다른 사람들과 이야기 할 수 있지만 그 기술은 잘 알려지지 않았기 때문에 듣기를 기대할 수 있습니다. –

답변

1

(이 조금 늦게, 그러나 이것은 다른 사람이 도움이 될 수 있습니다) 당신은 (일부 CPU에서 기본 동작 인) 타이머 모드에서 프로파일 링하고 있기 때문에

을의 역 추적 비활성화 될 수 있습니다 (RHEL 6.2 버전이기 때문에 2.6.32로 보입니다).

당신은 시도 할 수 있습니다 : 실제로 커널 버전에 제한이,이되었을 수도있는 경우, OProfile은의 커널 부분의 the history에서 봐

  1. 사용 하드웨어 카운터
  2. 고정
  3. 업데이 트 커널

나는 동일한 커널 릴리스와 같은 문제에 직면,하지만 난 ARM에있어 이후, 내 간략히 ck-fix는 작동하지 않습니다. (this은이 경우 적용 할 패치입니다).

관련 문제