여기서 arch/arm/configs/your_device_defconfig는 예시 파일입니다. 현재 리눅스 시스템을 빌드할 때 적용하는 컨피그 파일에 04~12번째 줄 코드를 입력하면 됩니다. 앞에서 소개한 ftrace 기능을 켜기 위한 컨피그를 활성화한 후 커널을 빌드하면 ftrace 관련 코드가 커널 이미지에 포함됩니다. 이 같은 방식으로 커널 이미지를 시스템에 설치하고 난 후 재부팅합니다.
다시 한 번 반복하지만 라즈비안에서는 ftrace의 기본 기능이 모두 활성화돼 있습니다. 따라서 ftrace 컨피그를 새롭게 설정해 커널을 빌드할 필요가 없습니다.
그럼 ftrace 설정 파일을 어디서 확인할 수 있을까요? 다음 경로에서 ftrace 드라이버 설정 폴더와 파일을 볼 수 있습니다.
/sys/kernel/debug/tracing
'ls /sys/kernel/debug/tracing' 명령어를 입력하면 다음과 같이 /sys/kernel/debug/tracing 디렉터리에 있는 파일을 확인할 수 있습니다.
root@raspberrypi:/home/pi# ls /sys/kernel/debug/tracing
먼저 각 명령어 다음에 보이는 “sleep 1”은 무엇일까요? 바로 1초 동안 딜레이를 주는 동작입니다. ftrace 설정 명령어를 입력하면 커널 내부에서 ftrace를 설정하는 함수가 실행됩니다. 이때 ftrace 설정 명령어를 커널 내에서 충분히 수행할 만한 시간을 확보하기 위해 딜레이를 주는 것입니다.
앞의 ftrace 설정 스크립트는 필자가 라즈베리 파이에서 실행해 정상적으로 동작하는 것을 확인했습니다. 만약 코드 순서가 바뀌면 시스템이 멈추거나 크래시가 발생할 수 있으니 주의합시다.
tracing_on: 트레이서 활성화/비활성화하기
ftrace를 활성화/비활성화하려면 tracing_on 파일을 설정해야 합니다. tracing_on은 부팅 후 기본적으로 0으로 설정돼 있습니다.
3~38 번째 줄 코드를 보겠습니다.
3 echo 0 > /sys/kernel/debug/tracing/tracing_on
...
38 echo 1 > /sys/kernel/debug/tracing/tracing_on
먼저 3번째 줄 코드를 보면 /sys/kernel/debug/tracing/tracing_on 파일에 0을 저장합니다. 이는 ftrace를 비활성화하는 동작입니다. 반대로 38번째 줄 코드와 같이 /sys/kernel/debug/tracing/tracing_on 파일에 1을 저장하면 ftrace를 활성화할 수 있습니다. 정리하면 tracing_on은 ftrace를 활성화하거나 비활성화하기 위해 설정해야 하는 파일입니다.
tracer 설정
ftrace는 nop, function, graph_function 트레이서를 제공합니다. ftrace에서 다양한 트레이서를 제공하는데, 중요한 부분만 추려 소개하면 다음과 같습니다.
nop: 기본 트레이서입니다. ftrace 이벤트만 출력합니다.
function: 함수 트레이서입니다. set_ftrace_filter로 지정한 함수를 누가 호출하는지 출력합니다.
graph_function: 함수 실행 시간과 세부 호출 정보를 그래프 포맷으로 출력합니다.
트레이서를 설정하려면 다음과 같이 current_tracer 파일에 트레이서의 이름을 저장해야 합니다.
15 echo function > /sys/kernel/debug/tracing/current_tracer
참고로 라즈베리 파이가 부팅되면 current_tracer 파일에 기본적으로 nop 트레이서가 설정돼 있습니다.
ftrace 이벤트 설정
ftrace에서는 커널 서브시스템과 기능별로 세부 동작을 출력하는 기능을 지원합니다. 이를 이벤트라고 합니다.
셸 스크립트 코드를 보면서 이벤트를 설정하는 방법을 알아봅시다. 먼저 다음은 ftrace 이벤트를 모두 비활성화하는 코드입니다.
19~20번째 줄 코드를 실행하면 스케줄링 동작을 기록하는 sched_wakeup, sched_switch 이벤트를 활성화합니다. 이어서 22~23번째 줄은 인터럽트 핸들링의 시작과 종료 시점을 기록하는 irq_handler_entry, irq_handler_exit 이벤트를 활성화하는 설정입니다.
ftrace 이벤트의 종류에 대해서는 다음 절에서 살펴보겠습니다.
필터 설정: set_ftrace_filter
set_ftrace_filter 파일에 트레이싱하고 싶은 함수를 지정합니다. set_ftrace_filter는 현재 트레이서를 function_graph과 function로 설정할 경우 작동하는 파일입니다. 이 파일에 디버깅하고 싶은 함수의 이름을 지정하면 됩니다. 이를 가리켜 함수 필터를 지정한다고 표현합니다. 그런데 여기서 주의해야 할 점이 있습니다.
리눅스 커널에 존재하는 모든 함수를 필터로 지정할 수는 없고 available_filter_functions 파일에 포함된 함수만 지정할 수 있다는 것입니다. 라즈베리 파이에서 available_filter_functions 파일에 없는 함수를 set_ftrace_filter 파일에 지정하면 시스템은 락업됩니다. 이 점에 주의합니다.
락업은 실전 개발에서 사용하는 용어로 시스템이 아무런 반응을 하지 않는 상황을 의미합니다. 예를 들어, 라즈베리 파이가 락업되면 화면은 가만히 멈춰 있고 마우스나 키보드를 움직여도 아무런 반응을 하지 않습니다.
11번째 줄에서는 secondary_start_kernel() 함수를 필터로 설정합니다. 사실 secondary_start_kernel() 함수는 부팅 도중 한 번 호출됩니다. 더미로 secondary_start_kernel() 함수를 필터로 설정하는 것입니다.
반복해서 설명하지만 현재 트레이서를 function_graph와 function으로 설정할 경우 set_ftrace_filter에 지정한 함수를 트레이싱합니다. 그런데 11번째 줄 코드를 실행하지 않고 set_ftrace_filter 필터를 설정하지 않으면 어떻게 동작할까요? set_ftrace_filter 파일에 필터로 함수를 지정하지 않으면 모든 커널 함수를 트레이싱합니다. 즉, 시스템이 수많은 커널 함수를 트레이싱하다가 결국 락업 상태에 빠지게 됩니다. 이런 상황을 방지하려는 코드입니다.
라즈베리 파이에서 set_ftrace_filter 파일에 필터로 함수를 지정하지 않으면 시스템이 100% 락업된다는 데 주의합니다.
실제 함수 필터를 거는 부분은 29번째 줄 코드입니다. 29번째 줄에서는 schedule() 함수와 ttwu_do_wakeup() 함수를 필터로 지정합니다.
options/func_stack_trace 파일을 1로 설정하면 ftrace를 통해 콜스택을 볼 수 있습니다. 즉, set_ftrace_filter 파일에 필터로 지정된 함수의 콜스택을 기록합니다. options/func_stack_trace를 설정하기 전에 current_tracer는 function으로 지정돼 있어야 합니다.
... uconfig은 사용자 패키지와 lkm kmod만 설정 가능하고 몇몇 커널 컨픽도 가능하나 제한적이다. [1]: http://rousalome.egloos.com/10011671 이 글 공유하기:TwitterFacebookLike this:Like Loading...ftraceope ... more
... uconfig은 사용자 패키지와 lkm kmod만 설정 가능하고 몇몇 커널 컨픽도 가능하나 제한적이다. [1]: http://rousalome.egloos.com/10011671 이 글 공유하기:TwitterFacebookLike this:Like Loading...ftraceope ... more
안녕하세요. 저자님 책을 보면서 열심히 공부하고 있습니다. ftrace를 설정하는 와중에 궁금한 점이 있어 질문 남깁니다. /sys/kernel/debug/tracing 하위에 available_filter_functions 파일을 보면 사전에 build 했던 /kernel/irq/proc.c 에 추가한 rpi_get_interrupt_info() 함수가 보이는데요. available_filter_functions에 등록하기 위한 별도 절차가 필요한 것이 아니라, 자동으로 등록된다고 이해하면 될까요?
최근 덧글