2011-02-28 3 views
1

라이브러리에서 함수가 호출 된 횟수를 계산할 수 있기를 원합니다. 라이브러리의 C++ 소스를 사용할 수 있지만이를 사용하는 실행 파일의 소스가 없습니다. Gprof seams는 인기있는 도구이지만 실행 파일에서만 작동합니다. 라이브러리가 컴파일되고 "-g"옵션과 연결될 때 실행 중에 수집 된 프로필 데이터를 구문 분석하기로되어있는 sprof에 대한 매우 제한된 정보를 발견했습니다. 죄송합니다. sprof이 (가) 결과 프로필 파일을 열 수 없습니다. 나는 상당히 오래 전에 쓰여졌 고 가장 오래된 것이 아니기 때문에 이음새가 있기 때문에 sprof으로 시도해 보았다.GCC로 프로파일 링 : 공유 라이브러리의 함수 호출 수 얻기

GCC와 관련하여 호출 횟수를 계산할 수있는 도구를 아는 것이 가장 좋습니다.

답변

3

GCC는 최신 버전의 컴파일러 스위치 -finstrument-functions을 사용하여 컴파일 된 코드 내에서 추적 점 후크를 자동 생성합니다. 설명서의 GCC Code Generation Options을 참조하십시오. 그것으로, 당신도, 함수의 작은 쌍의 본격적인 인터셉터를 필요가 없습니다 자동으로 모든 부분에 입/출력에라고

  • __cyg_profile_func_enter()
  • __cyg_profile_func_exit()

코드는 -finstrument-functions 옵션으로 컴파일됩니다.
실제로 사용하기를 원한다면 나중에 사용하지 않는 (그냥 반환하는) 스텁 라이브러리를 보통 사용시와 LD_PRELOAD을 통해 다른 트레이서 라이브러리에 연결하면됩니다.

이러한 추적 사이트 후크에 전달 된 인수는 호출되는 함수의 주소와 호출자입니다. 이름을 알려면 기호 표 조회를 통해 피드를 보내야합니다. 바깥 쪽 외부에서 수행하는 것이 가장 좋습니다.

예제 코드 (매우 빠른 Google, 실제로) : here, here 또는 here.

0

LD_PRELOAD 라이브러리를 통해 매우 쉽게이 작업을 수행 할 수 있습니다. 여러분은 계측하고있는 함수에 대한 호출을 캐치하고, 카운터를 증분 한 다음, 원래 구현을 호출하는 라이브러리를 작성합니다 (공유 오브젝트를 dlopen하여 호출 함으로서). 그런 다음 실행 파일을 시작할 때 인터셉터 라이브러리를 LD_PRELOAD하고 _exit (또는 SIGUSR1 또는 언제든지)에서 해당 카운트를 내 보냅니다.

이 기능은 동적 라이브러리 로더 이외의 소프트웨어를 지원하지 않아도 작동하며 소스를 사용할 수없는 경우에도 라이브러리 호출을 간접적으로 처리하는 공통 기술입니다.

1

ltrace을 사용하여 프로그램을 실행하거나 ltrace -c -l yourlibrary과 함께 프로그램을 실행하거나 -l을 삭제하여 모든 동적 라이브러리 호출 수를 얻을 수 있어야합니다.

0

당신은에 systemtap를 사용할 수있는 네트워크를 좋아하는 호출 될 때마다 증가 숫자를 출력하도록 당신은 그것을 다시 컴파일 할 수는 동적 라이브러리 (DLL) 경우 함수 호출 수를 얻는다. 이 도구는 재 컴파일하지 않고도 모든 응용 프로그램을 런타임에 측량 할 수있게 해주는 강력한 도구입니다. 필요한 기호 만 디버그 할 수 있습니다.

# call-counts.stp 

global calls, times 

probe process(@1).function(@2) { 
    times[probefunc()] = gettimeofday_ns() 
} 

probe process(@1).function(@2).return { 
    now = gettimeofday_ns() 
    delta = now - times[probefunc()] 
    calls[probefunc()] <<< delta 
} 
다음

/lib64/libc-2.12에 getenv()에 전화를 계산하는 데 사용하는 방법입니다 : 여기

은 나노초 단위의 실행 시간과 함께 함수를 호출의 수를 계산하는 스크립트입니다 .2.so ls -1를 실행하는 경우 :

$ sudo stap -c "ls -1" ~/tmp/count-calls.stp /lib64/libc-2.12.2.so "str*" 
binned_market_data 
count-calls.stp 
count-calls.stp~ 
Makefile 
md 
nohup.out 
calls["__strdup"] @count=14 @min=5035 @max=10664 @sum=80479 @avg=5748 
calls["strcoll"] @count=11 @min=11626 @max=20018 @sum=140851 @avg=12804 
calls["__strcoll_l"] @count=11 @min=4992 @max=9393 @sum=63179 @avg=5743 
calls["strstr_ifunc"] @count=2 @min=4902 @max=7429 @sum=12331 @avg=6165 
,369 :

$ sudo stap -c "ls -1" ~/tmp/count-calls.stp /lib64/libc-2.12.2.so getenv 
binned_market_data 
count-calls.stp 
count-calls.stp~ 
Makefile 
md 
nohup.out 
calls["getenv"] @count=23 @min=4841 @max=19257 @sum=142529 @avg=6196 

또 다른 예는 것은 호출에 "STR의 *"기능을 볼 수