고급 개발자로 가는 길

Embedded/Linux Kernel

[Linux Kernel] ftrace 디버깅 사용하기

다크엔지니어 2022. 2. 1. 15:59
반응형

필자가 사용하는 라즈비안(리눅스) 에서는 ftrace 가 자동으로 설정 되어있다.

기존의 linux 의 경우 arch/arm/configs/bcm2711_defconfig 에 trace 관련 CONFIG_###=y

를 해주면 된다. bcm2711_defconfig 는 커널 빌드 시 사용되는 config 파일이다.

 

결론은, 라즈비안의 경우 아래 경로를 통해 ftrace 설정파일을 확인 할 수 있다.

/sys/kernel/debug/tracing

실제로 수많은 파일이 있지만 정작 자주 사용하는 파일은 많지 않다.

 

먼저 ftrace 설정하는 방법을 통해 위 디렉터리에 있는 파일이 어떤 기능을 수행하는지 확인 해 볼 것이다.

 

ftrace 설정

자세한 내용은 주석을 달아놨으니 참고 바란다.

#!/bin/bash

// Off 설정
echo 0 > /sys/kernel/debug/tracing/tracing_on
sleep 1
echo "tracing_off" 

// 이벤트 비활성화 설정
echo 0 > /sys/kernel/debug/tracing/events/enable
sleep 1
echo "events disabled"

// 필터 설정 초기화
echo  secondary_start_kernel  > /sys/kernel/debug/tracing/set_ftrace_filter	
sleep 1
echo "set_ftrace_filter init"

// 함수 설정
echo function > /sys/kernel/debug/tracing/current_tracer
sleep 1
echo "function tracer enabled"

// 이벤트 활성화 설정
// 스케줄링 동작을 기록하는 이벤트 활성 : 컨텍스트 스위칭 동작
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable
// 스케줄링 동작을 기록하는 이벤트 활성 : 프로세스를 깨우는 동작
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable
// 인터럽트 핸들링의 시작과 종료 시점을 기록하기 위한 이벤트 활성
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_entry/enable
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_exit/enable
sleep 1
echo "event enabled"

// 필터 설정
echo rpi_get_interrupt_info bcm2835_mmc_irq > /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo "set_ftrace_filter enabled"

// 콜 스택을 보기 위한 설정
echo 1 > /sys/kernel/debug/tracing/options/func_stack_trace
// 콜 스택을 출력할 때 포맷을 지정 한다. offset 등
echo 1 > /sys/kernel/debug/tracing/options/sym-offset
echo "function stack trace enabled"

// On 설정
echo 1 > /sys/kernel/debug/tracing/tracing_on
echo "tracing_on"

위에서 필터 설정인 set_ftrace_filter 의 경우

디버깅하고 싶은 함수의 이름을 지정하면 된다. 

여기서 주의 할 점은, 리눅스 커널에 존재하는 모든 함수를 필터로 지정 할 수는 없다는 것이다.

바로 available_filter_functions 파일에 포함된 함수만 지정 할 수 있다.

리눅스 드라이버나 커널에 새로운 함수를 새로 구현하면, 이 파일에 추가 된다.

 

이를 어길 시, 시스템 락업이 될 것이다.

또한, 아무것도 설정 하지 않을 시 무조건 락업이 된다. 즉, 시스템이 수많은 커널 함수를

트레이싱하다가 락업이 되어버린다. 그러니 설정 시 필요 함수를 무조건 

필터 설정 해주어야 한다.

참고로 /sys/kernel/debug/tracing/available_filter_functions 에 위치한다.

 

이 외에도 .config 안에 빌드된 config 설정을 볼 수 있다.

반응형