본문 바로가기

공부/리눅스

uftrace 를 이용한 함수 추적 - 2

728x90

지난 글

uftrace 를 이용한 함수 추적 - 1

 

uftrace 를 이용한 함수 추적

uftrace란 uftrace는 C/C++로 작성된 컴파일된 유저 프로그램의 함수 호출 관계를 추적하는 도구입니다(옵션에따라 커널의 함수도 추적이 가능합니다). 리눅스 커널의 ftrace에서 영감을 받아 만들어진

willow72.tistory.com


지난번에 이어 uftrace에 대해 알아보겠습니다.

record/replay

uftrace 는 실행 결과를 기록(저장)하고 반복해서 출력 가능하도록 기능을 지원합니다.

$ uftrace recorde ./test

기본적인 uftrace 명령어를 실행할 경우 함수 추적 결과가 나오지만 recorde 명령어를 함께 사용할 경우 프로그램 자체의 실행 결과만을 보여줍니다. 대신 uftrace.data 디렉토리가 생기는것을 볼 수 있습니다. 이 디렉토리는 앞서 실행한 recorde 의 결과를 저장한 디렉토리입니다. 하지만 디렉토리내의 파일을 직접 열어볼 경우는 가공되지않은 데이터로 보여지게 됩니다. 기록된 데이터를 보기위해선 replay 명령어를 실행합니다.

 

$ uftrace replay

* replay 명령어는 uftrace.data 디렉토리를 필요로하며 만약 디렉토리가 존재하지 않는다면 에러를 출력합니다.

 

커널 함수 추적: -k 옵션

옵션 없이 사용할 경우 유저 레벨의 함수만 출력을 해주는 반면, -k 옵션을 사용할 경우 커널 레벨의 함수를 출력할 수 있습니다. 이때 반드시 슈퍼유저 권한으로 실행해야합니다.

* 이전 실행 결과까지는 별도의 예제 파일을 작성해서 테스트했지만 이후 예제부터는 uftrace내에 포함된 소스파일을 이용했습니다.

~/uftrace/tests

$ sudo uftrace -k fork

역시 리눅스 커널은 fork죠

필터

너무 많은 함수 결과가 출력되서 오히려 보기 불편하다고 느껴질 수 있는데 이 때 필터 옵션들을 사용해  출력 결과를 좀 더 간단히 만들 수 있습니다.

 

-D 옵션 

함수 호출의 깊이(Depth)를 출력해주는 함수입니다.

$ sudo uftrace -k -D 2 fork

-k 옵션에서 -D 2를 추가한 결과입니다. 편의상 확연하게 차이점이 보이는 부분을 캡쳐했습니다. 이전 결과에서는 a(), b(), c(), get_pid() 함수가 차례로 불렸는데 -D함수에서는 a까지만 출력되는 모습을 보이고있습니다.

 

-F 옵션

특정 함수의 결과만 출력하는 옵션입니다.  b()함수를 출력하기위해선 다음과 같이 입력해줍니다.

$ sudo uftrace -k -F b fork

 

-N 옵션

특정 함수를 제외한 결과를 출력하는 옵션입니다.  b() 함수를 출력에서 제외하기위해선 다음과 같이 입력해줍니다.

$ sudo uftrace -k -N b fork

 

-t 옵션

특정 실행시간 이상 소요되는 함수를 출력하는 옵션입니다. 10us 이상 소요되는 함수들만 출력하기위해선 다음과 같이 입력해줍니다.

$ sudo uftrace -k -t 10us fork