필자가 사용하는 라즈비안(리눅스) 에서는 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 설정을 볼 수 있다.
'Embedded > Linux Kernel' 카테고리의 다른 글
[Linux Kernel] 커널 디버깅용 Debugfs 드라이버 코드 (0) | 2022.02.06 |
---|---|
[Linux Kernel] ftrace Log 포맷 해석 및 발생 경로 확인 (0) | 2022.02.01 |
[Linux Kernel] objdump 바이너리 유틸리티 (0) | 2022.01.30 |
[Linux Kernel] 전처리 코드 생성 : 특정 전처리 파일 추출 (0) | 2022.01.27 |
[Linux Kernel] 전처리 코드 생성 : 전체 전처리 파일 추출 (0) | 2022.01.27 |