본문 바로가기

공부/리눅스

uftrace 를 이용한 함수 추적

728x90

uftrace란

uftrace는 C/C++로 작성된 컴파일된 유저 프로그램의 함수 호출 관계를 추적하는 도구입니다(옵션에따라 커널의 함수도 추적이 가능합니다). 리눅스 커널의 ftrace에서 영감을 받아 만들어진 툴이라고하는데 ftrace와는 다르게 사용자 레벨의 프로그램을 지원한다고합니다. 함수 호출 관계를 추적하며 실행 루틴 분석은 물론 함수의 실행 시간까지 확인 가능해 프로그램을 분석 유용한 명령어를 지원해줍니다.

 

환경

ubuntu 20.04

 

uftrace 설치

git 저장소로부터 소스코드를 받아옵니다.

git clone https://github.com/namhyung/uftrace.git

의존성 패키지를 설치합니다. misc디렉토리 내에 의존성 패키지를 받을 수 있는 쉘스크립트가 있습니다.

$ cd uftrace/misc
$ sudo ./install-deps.sh

다시 소스코드가 있는 디렉토리에서 설치를 진행합니다.

$ cd ..
$ ./configure
$ make
$ sudo make install

 

사용법

예제 코드(test.c)

#include <stdio.h>

int sum(int n)
{
        int i;
        int ret = 0;

        for(i = 0; i < n; i++) {
                ret += i;
        }
        return ret;
}
int main(void)
{
        int n = 1000;

        printf("result : %d\n", sum(n));
        return 0;
}

컴파일

uftrace를 사용하기위해선 먼저 gcc -pg 옵션을 사용해 컴파일된 실행파일이 필요합니다.

$ gcc -pg -o test test.c

실행

$ uftrace test

 

실행 결과에서는 작성한 프로그램의 실행결과와 각 함수에대한 정보가 출력됩니다.

DURATION: 함수의 실행시간을 의미합니다. 함수가 끝나는 위치에서 출력됩니다. 예를들어 그림에서 main함수의 실행시간은 함수가 닫히는 '}' 의 앞에 출력이 되고있습니다.

TID: 쓰레드 아이디입니다.

FUNCTION: 함수의 이름입니다.

 

uftrace 의 설치방법과 아주 기본적인 사용방법을 알아봤습니다. 다음엔 옵션을 비롯해 추가적인 사용방법을 정리해보도록 하겠습니다.