2014-07-07 3 views
1

정적 함수를 포함한 모든 함수를 나열하는 gprof "플랫 프로파일"출력이 있습니다. 그러나 "정적"으로 선언 된 함수의 경우 "호출", "자체 ms/호출"및 "전체 ms/호출"열은 모두 비어 있습니다. 이 기능들에 대한 데이터도보고 싶습니다. 실제로 모듈의 공용 함수보다 훨씬 흥미 롭습니다. 예를 들어 :gprof 출력에서 ​​정적 호출보기

% cumulative self    self  total   
time seconds seconds calls ms/call ms/call name  
55.32  3.38  3.38        Static_Func1 
16.61  4.39  1.01        Static_Func2 
12.44  5.16  0.76  2 380.00 380.00 Public_Func1 
9.90  5.76  0.60        Static_Func3 
2.78  5.93  0.17        Static_Func4 
0.98  5.99  0.06 12463589  0.00  0.00 main 
0.65  6.03  0.04 1200000  0.00  0.00 Public_Func2 
0.33  6.05  0.02  2 10.00 10.00 Public_Func3 
0.33  6.07  0.02        Static_Func5 
0.33  6.09  0.02        free 
0.33  6.11  0.02        malloc 
0.00  6.11  0.00  1  0.00  0.00 Public_Func4 

나는 나는 이러한 기능에 대한 출력이 표시되지 않는 설명하지만, 정적 선언을 제거에서 어쨌든 그것을 따로 볼 수있는 방법이 Why does gprof occasionally not print number of calls for particular functions? 발견? 나는 -a으로 정적 함수를 출력하는 것을 억제 할 수 있다는 것을 알고 있습니다. 그러나 나는 그 반대를 원하고 그것에 대한 옵션을 보지 않습니다.

위의 프로필에있는 정적 함수에서 "정적"키워드를 제거하도록 코드를 편집하면 main에 대한 "호출"이 비어있게됩니다. (나는 1을 기대하기 때문에 어느 쪽이든 틀린 것입니다). 보다 유용하게도 필드가 채워질뿐만 아니라 정적 함수에 의해 호출 된 함수도 나열됩니다. 코드를 변경하지 않고도 그렇게 할 수 있기를 바랍니다.

또한 동일한 문제가있는 것으로 보이는 이 발견되었지만 해결책은 컴파일러가 일부 기능을 인라인하지 못하도록 코드를 편집하는 것이 었습니다. 프로파일 링을 위해서 코드를 편집하고 싶지는 않습니다. 현재 존재하는 모든 기능을 볼 수 있기를 원합니다. 윈도우 7에서는 MinGW 쉘에서 64 비트 실행


버전 정보 :

$ which gprof 
/mingw/bin/gprof.exe 

$ gprof --version 
GNU gprof (GNU Binutils) 2.22 
Based on BSD gprof, copyright 1983 Regents of the University of California. 
This program is free software. This program has absolutely no warranty. 
+0

플랫 프로파일 출력 샘플을 추가 할 수 있습니까? – dragosht

+0

예제 프로파일을 추가하도록 편집되었습니다. 이 코드는 실제 코드이지만 실제 함수 이름은 대부분 제거했습니다. – Ben

+0

이것이'binutils' /'gprof' 패키지의 버그 일 것 같아요. 어떤 플랫폼을 실행하고 있습니까? 내'windows 7' /'cygwin' (32 비트)에서 매우 유사한 동작을 경험하고 있습니다 ... – dragosht

답변

0

내가 여기지만 대답을 시도하고 있지 않다을 오히려 같은 문제의 또 계속 나는 또한 경험있어 cygwin에, GNU gprof (GNU Binutils) 2.24.51.20140528는 (우분투 (모두 32/64 비트)에이 코드를 실행하고 난에는 전혀 문제 없어) 다음 USE_STATIC 매크로 disab와

#include<stdio.h> 
#include<stdlib.h> 

#define N1 100 
#define N2 100 
#define N3 100 
#define N4 100 

#define USE_STATIC 

#ifdef USE_STATIC 
static 
#endif 
void f5() { 
    int i; 
    for (i = 0; i < 10; i++) { 
    } 
} 

#ifdef USE_STATIC 
static 
#endif 
void f4() { 
    int i; 
    for (i = 0; i < N4; i++) { 
     f5(); 
    } 
} 

#ifdef USE_STATIC 
static 
#endif 
void f3() { 
    int i; 
    for (i = 0; i < N3; i++) { 
     f4(); 
    } 
} 

void f2() { 
    int i; 
    for (i = 0; i < N2; i++) { 
     f3(); 
    } 
} 

void f1() { 
    int i; 
    for (i = 0; i < N1; i++) { 
     f2(); 
    } 
} 

int main() { 
    f1(); 
    return 0; 
} 

을 나는 (합리적인 보인다) gprof은에 의해보고 된이 평면 데이터를 얻을 주도 : 이제

Each sample counts as 0.01 seconds. 
    % cumulative self    self  total 
time seconds seconds calls s/call s/call name 
85.90  1.98  1.98 100000000  0.00  0.00 f5 
    9.98  2.21  0.23        _mcount_private 
    3.47  2.29  0.08 1000000  0.00  0.00 f4 
    0.65  2.31  0.01        _fentry__ 
    0.00  2.31  0.00 10000  0.00  0.00 f3 
    0.00  2.31  0.00  100  0.00  0.02 f2 
    0.00  2.31  0.00  1  0.00  2.06 f1 

을 내가 그것을 사용하도록 설정하면이 모든 추락의 :

Each sample counts as 0.01 seconds. 
    % cumulative self    self  total 
time seconds seconds calls Ts/call Ts/call name 
79.48  1.82  1.82        f5 
17.47  2.22  0.40        _mcount_private 
    2.18  2.27  0.05        f4 
    0.44  2.28  0.01        _fentry__ 
    0.44  2.29  0.01        f3 
    0.00  2.29  0.00 101010000  0.00  0.00 __gcc_deregister_frame 
    0.00  2.29  0.00  100  0.00  0.00 f2 
    0.00  2.29  0.00  1  0.00  0.00 f1 

를 지금까지 내가 mcount() 가져 결정할 수있어로 이 함수들 각각을 적절히 호출하여 gprof가 혼란을 일으키는 이유를 모르겠습니다. 결국 이것이 출력 할 수있는 유일한 정확한 데이터 여야합니다. 타이밍 정보는 어쨌든 완전히 신뢰할 수 없습니다 (특히 빠르게 완료되는 프로그램의 경우). http://archive.today/9r927

당신은 아마 거기에 살펴 봐야 할 수 있습니다 :

여기 gprof에 더 좋은 대안을 나열하는 역사적 유래 항목이있다. 나는 ...

관련 문제