이전 포스팅에서 (http://kkangeva.tistory.com/67) 기본적인 사용법을 다뤘다.

아래 내용은 이전 포스팅의 내용 기본으로 작성된 것이다.


[gmon.out 파일을 지정하기]

기본적으로 gmon.out 파일은 실행파일과 같은 위치에 만들어진다.

하지만 실제로 프로파일링이 필요한 환경에서는 다른 디렉토리를 지정하고 싶을 수 있다.


  1.  가령 rootfs가 읽기전용이거나 실행파일의 위치가 읽기전용일 경우
  2.  재현이 잘되지 않아서 여러 번 프로파일링을 반복하고 결과를 저장하고 싶은 경우


사실 이전 포스팅에서 이미 방법을 소개했다.

GMON_OUT_PREFIX 환경변수를 사용하면 된다.


아래는 기본적인 gprof 시퀀스다.



   $ g++ -g -pg -o test  test.cpp

   $ ./test

   $ gprof ./test


변경된 시퀀스는 아래와 같다.


   $ g++ -g -pg -o test  test.cpp

   $ GMON_OUT_PREFIX=profile/gmon.out ./test

   $ gprof ./test ./profile/gmon.out.14363


두 번째 명령에서 GMON_OUT_PREFIX를 지정하게 되면 profile디렉토리 밑에 gmon.out.[PID] 파일이 생성된다.

세 번째 명령어를 통해서 생성된 파일을 사용해서 실제로 결과를 뽑아볼 수 있다.


리포트 분석 방법은 이전 포스팅과 아래 내용을 참조하자.



[서비스 혹은 데몬 프로파일링하기]

gprof 메뉴얼에 보면 아래 표현이 있다.


In order to write the gmon.out file properly, your program must exit normally: by returning from main or by calling exit. Calling the low-level function _exit does not write the profile data, and neither does abnormal termination due to an unhandled signal.


요약하자면, gmon.out 파일을 얻고 싶으면 프로그램이 정상적으로 종료되어야 한다는 뜻이다.

이런 제약사항이라면 서비스 혹은 데몬은 프로파일링 힘들다.


즉, 아래와 같은 예제 프로그램은 gmon.out 파일을 얻을 수 없다.


#include "iostream"
#include "unistd.h"

using namespace std;

int main()
{

	while(true) {
		sleep(1);
	}
	return 0;
}

정상적인 종료는 main 함수에서 리턴을 하거나 exit(1) 함수를 호출하는 것을 의미한다.

위의 예제를 조금 수정해서 시그널 발생시 exit(1)을 호출하도록 바꿔보자.


#include "iostream"
#include "unistd.h"
#include "stdlib.h"
#include "signal.h"

using namespace std;

void my_handler(int signum)
{
    if (signum == SIGUSR1)
    {
        exit(1);
    }
}

int main()
{
	signal(SIGUSR1, my_handler);

	while(true) {
		sleep(1);
	}
	return 0;
}


위 예제를 빌드하고 실행시킨 다음 프로세스 ID를 얻자.

그런 이후 아래 명령어로 프로세스를 종료시키면 (28101은 프로세스 ID) gmon.out 파일을 정상적으로 얻을 수 있다.


   $ kill -SIGUSR1 28101




[call 그래프 결과 png 파일로 변환하기]

gprof에서 제공하는 리포트의 경우 text 기반이기 때문에 call 그래프를 해석하기 쉽지 않다.

해석을 쉽게 하기 위해서 text 결과를 이미지로 변환해볼 수 있다.

gprof2dot이 바로 그 툴이다. 우선 인스톨하자.


   $ pip install gprof2dot


인스톨이 되면 아래와 같이 결과값을 변환해볼 수 있다.


   $ gprof ./test | gprof2dot | dot -Tpng -o output.png


이전 포스팅에서 다뤘던 결과를 png 파일로 변환한 결과 값은 아래와 같다.



Posted by kkangeva

댓글을 달아 주세요