실행 트레이스 뽑기
- 이 링크 (원문 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를 얻어,
콜 그래프 생성했습니다.