꼼수로 그린 트레이스 그래프 - gnuplot

Posted at 2009/04/24 15:20 // in Tips/Utility programs // by Daniel

image

4개 쓰레드가 돌고 있는데 언제 다른 쓰레드를 기다리고 언제 일했는지 보고자 했습니다.

다른 방법이 없나 모르겠는데 엄청 삽질했습니다.

gnuplot으로 그리긴 했는데 완전 꼼수

방법은 object rect로 상자 그리고

화면 밖에다가 그래프 그어서 그리기 입니다.

set object 197 rect from 10572.5589,1.6 to  10590.3039,2.4 fc lt 1 lw 0
set object 198 rect from 10600.7679,1.6 to  10603.6261,2.4 fc lt 1 lw 0

이런식으로 object에 일련번호 붙여서 상자 만들어놓고

plot [0:10819.649917] [-1:4] -2

이렇게 plot 영역을 0~10819 세로로 -1~4 로 잡고 그래프는 y=-2로 잡았습니다. 화면 밖이라 그래프는 안나오구요.

추가로

set key off

로 legend 없앴습니다.

눈금 없애기나 마지막 포인트 값 프린트 그런 것도 필요하지만 일단 여기까지만 해도 감지덕지

참고로 pthread_cond_wait을 잡은거라 쓰레드가 스케줄 아웃되었는지 어쩐지는 안나옵니다. 저렇게 빨갛게 다 칠해놨어도 중간에 다른 프로그램이 돌거나 idle로 나간 경우가 있단 얘기. lock이나 세마포어도 안나오는 거구요

상자 색깔은 fc lt 다음에 숫자로 나타냅니다. 아마 논문서 나오는 게 이런걸로 한 거 같네요. 라인 타입이 대시면 흑백으로 대시로 나오나봅니다.

image
lw는 line width입니다. 테두리 없는 게 예쁘길래 0 으로 했죠

gnuplot 실행뒤에

load "plot_cont.txt"

로 불러와도 되고

$ gnuplot -persist "plot_cont.txt"

로 셸에서 입력해도 됩니다.

저 그림을 나오게 하는 plot 파일입니다.

참고 페이지
http://gnuplot.sourceforge.net/demo/rectangle.html
http://nucl.sci.hokudai.ac.jp/~ohnishi/Lib/gnuplot.html
http://coffeenix.net/doc/gnuplot/gnuplot.html

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

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