gcc 컴파일 옵션으로 커스텀 프로파일 해서 실행 트레이스 뽑기

Posted at 2008/09/04 10:36 // in Programming // by Daniel

실행 트레이스 뽑기

  • 이 링크 (원문 IBM) 에 보면 소스에 작은 글루 코드를 컴파일 시 붙여 콜 그래프를 뽑을 수 있다고 나옵니다.(gcc에서 지원하는 트레이스 뽑는 방법). –g 옵션과 -finstrument-functions 로 됨.

사용방법 :
1. Instrument.c
Instrument.c를 만들고 내용에
void main_constructor( void )
void main_deconstructor( void )
void __cyg_profile_func_enter( void *this, void *callsite )
void __cyg_profile_func_exit( void *this, void *callsite )

를 만들어 넣음. (trace.txt를 열고 닫고, 포인터 프린트하는 걸로 충분. 예제 코드 있음.)
#include <stdio.h>
#include <stdlib.h>
필요.
2. 컴파일
gcc –g -finstrument-functions test.c instrument.c –o test
로 컴파일

3. 실행
이러면 trace.txt가 나옴. 여기엔 들어가고 나온 함수의 주소가 나옴.

4. 심볼 이름 뽑고 정리하기
여기까지만 하고 addr2line으로 함수이름 뽑을 수 있고,
나머지 복잡한 것은 링크 참조. pvtrace라는 프로그램을 컴파일해서 콜 그래프 생성 예제가 있습니다.
Thread 정보 보고싶으면, self = pthread_self();으로 쓰레드 아이디 읽어와서 뿌리면 됨.

런타임에 함수 이름 뽑고 싶으면 몇가지 방법이 있을 듯 합니다.
libtrace_resolve (func, buf_func, CTRACE_BUF_LEN, NULL, 0); 등을 써서..

심볼 이름 찾는 또다른 방법은 여기 더 설명 나옴. backtrace, backtrace_symbols libbfd 등.
 이곳에서는 트레이스 함수를 좀더 많이 정보를 뿌리게 만들었음.


제가 실행해본 예입니다.

해당 방법으로 midori 브라우저(웹킷 기반의 가벼운 브라우저입니다) instrumentation

Makefile.in에서
 midori_OBJECTS = $(am_midori_OBJECTS) instrument.$(OBJEXT)
 이렇게 고치고
CFLAGS = @CFLAGS@ -finstrument-functions
이렇게 추가.
Makefile.am에서
midori_SOURCES = 에 instrument.c 추가 (이건 별 효과 없는 듯)
$ make clean
$ make
$ ./midori 
$ ~/misc/pvtrace/pvtrace midori 
$ dot -Tjpg graph.dot -o graph.jpg
그림 확인
$ eog graph.jpg

trace.txt를 얻어,

image

콜 그래프 생성했습니다.

크리에이티브 커먼즈 라이센스
Creative Commons License