[Linux] ftrace 사용법

Hyojae Yun
5 min readSep 18, 2020

--

medium 플랫폼에서 앞으로 공부하는 것들을 하나씩 정리해 나갈 예정이다. 예쁜 디자인을 적용하는 것에 어려움을 느끼는 나로써는 글 자체에 집중할 수 있는 플랫폼인것 같아서 상당히 마음에 든다. 첫 글은 ftrace를 사용하는 방법에 대해서 간단히 정리해 보려고 한다.

ftrace

커널에서 호출되는 특정한 이벤트나 함수의 흐름을 쫓아가고자 할 때, 이는 커널이 너무 방대하고 복잡하기 때문에 처음 시도하는 사람들에게는 막막한 일이다. 나 또한 그러한 난관을 겪고 있어 찾아본 도구가 ftrace이다. 이는 리눅스 커널을 사용하는 모든 배포판에서 사용할 수 있으며, 커널을 빌드할 때 tracing 기능을 enable 상태로 했다면 어떤 커널에서도 지원을 한다. (아무설정 안했다면 enable 상태일 것이다.) 아래에서는 간단한 예시와 함께 사용법을 적어보도록 하겠다.

1. ftrace 마운트

먼저 ftrace를 마운트해야한다. 기본적으로 ftrace가 마운트 되어있는 경우가 많으므로 명령어를 통해 확인해본다. ls 명령 수행 후 출력값이 확인된다면 이미 마운트가 된 상태이고 아니라면 직접 마운트해준다.

2. tracer 설정

설정되었다면 ftrace 디렉토리로 이동하여 tracer를 설정한다. 현재는 어떤 tracer가 설정되었고, 어떤 tracer가 사용가능한지 확인하고 하나의 tracer를 설정한다. 기본적으로 설정된 nop tracer는 tracing을 하지 않는 설정이므로, 아래의 예시 처럼 function_graph tracer와 같은 다른 tracer로 설정해준다.

3. tracing 대상 설정

기본적으로 아무런 설정을 하지 않았다면 커널에서 실행되는 모든 함수를 tracing 할 것이다. 그러나 이는 원하지 않는 함수도 tracing 하여 보기에 상당히 힘들것이다. 따라서 내가 원하는 tracing 대상을 설정해줘야 한다. 이 글에서는 함수 tracing과 이벤트 tracing에 대한 설정방법을 알아보도록 하겠다.

3–1. function tracing

이는 특정한 함수를 기준으로 tracing 대상을 설정하는 방법이다. available_functions 파일은 tracing이 가능한 파일의 목록을 가지고 있다. 이 파일의 값을 참조하여 내가 원하는 함수를 설정한다. 아래 코드를 참조하도록 하자.

set_ftrace_filter

반대로 특정한 함수를 tracing 하고싶지 않을 수도 있는데, 그때는 set_ftrace_notrace에 함수명을 추가하여 해당하는 함수를 tracing에서 제외시킬 수 있다. 아래의 예시를 적용하면 tty라는 문자열이 포함된 함수를 tracing하지 않도록 한다.

3–2. event tracing

이 방법은 특정한 event를 기준으로 tracing 대상을 설정하는 방법이다. 예를 들어 쓰기 명령과 같은 이벤트가 발생했을 때 발생하는 함수들만 tracing 한다. available_events 파일은 어떠한 이벤트를 기준으로 tracing 가능한지에 대한 목록을 가지고 있다. 이를 참조하여 설정하고 실행해보도록 하자.

3–3. pid filtering

ftrace를 사용하다보면 trace에 너무 많은 함수들이 tracing되어 추적하기에 어려울 수 있다. 이럴 때 특정한 프로세스 (테스크)에서 호출되는 함수만을 tracing 하는 기능을 사용할 수 있다. 먼저 내가 tracing 하고 싶은 프로세스의 pid를 알아내야 한다. 현재 실행중인 프로세스의 목록을 간단하게 ps 명령어로 확인할 수 있으며, top 또는 htop 명령어로도 확인할 수 있다.

4. ftrace 보는 법

how to see ftrace

function_graph tracer를 적용한 후에 trace 파일을 열어보면 다음과 같은 화면을 볼 수 있을 것이다.

CPU 코어 번호) 실행시간 | 함수 이름

위 형식으로 출력되며, 특정 함수가 들여쓰기가 되어있다면 해당 함수 위에있는 함수안에서 호출된 함수이다. 이렇게 tracing된 정보를 통해서 ctags, cscope와 같은 도구를 함께 사용하여 커널 소스를 분석하는데 유용하게 사용할 수 있다.

5. tracing 기능 켜고 끄기

tracing을 사용하지 않을 때는 꺼놓는 것이 좋다. 크진 않을지라도 어느정도의 부담이 있을 수 있다. 따라서 아래의 명령어를 통해 켜고 끄는 것이 가능하다.

간단하게 메모장 쓰듯이 정리할 수 있어서 참 좋은 플랫폼인 것 같다. 앞으로도 꾸준히 정리해 봐야겠다.

--

--