본문 바로가기
Linux

[Kernel] 커널 디버깅

by 코딩은 잼있어 2024. 3. 3.
728x90

1. 커널 디버깅이란 ?

리눅스 커널 디버깅은 커널 부분에 있는 버그를 찾고 해결하는 과정을 의미한다.

또한, 디바이스 드라이버의 경우 커널함수로 작성돼있고, 커널 함수는 각 서브시스템 개발자 작성한 코드이기 때문에 디버깅을 통해 버그 해결 및 코드 구조를 파악할 수 있다.

2. 목표

  • 커널에 함수를 추가하여 디버깅을 통해 출력 해보자

(1) cat /proc/interrupts 명령어를 입력하면 인터럽트의 세부 속성을 알 수 있다.

 

위 로그들은 커널 소스인 linux/kernel/irq/proc.c 의 show_interupts()함수 에서 출력 된다.

 

(2) show_interupts() 함수에 rpi_get_interrupt_info 함수를 추가한다.

해당 함수는 책에서 나온 코드를 그대로 가져왔다.

 

rpi_get_interrupt_info 함수는 ftrace로 다음 정보를 출력한다.

  • 프로세스 이름
  • 인터럽트 번호
  • 인터럽트 이름
  • 인터럽트 핸들러 함수 이름

(3) 커널 빌드 및 라즈베리파이에 설치 한다.

 

(4) ftrace enable 하는 방법

아래 스크립트를 실행시키면 ftrace 설정을 완료함

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"

# current_tracer : 추적기를 function 으로 사용
# function, function_graph, sched, irqsoff, wake_up, preemptoff
echo function > /sys/kernel/debug/tracing/current_tracer
sleep 1
echo "function tracer enabled"

# set_ftrace_filter : 추적하기 위한 함수를 지정
echo rpi_get_interrupt_info > /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo "set_ftrace_filter enabled"

echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_entry/enable
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_exit/enable
echo "event enabled"

echo 1 > /sys/kernel/debug/tracing/options/func_stack_trace
echo "function stack trace enabled"

echo 1 > /sys/kernel/debug/tracing/options/sym-offset
echo "function stack trace enabled"

echo 1 > /sys/kernel/debug/tracing/tracing_on
echo "tracing_on"

위 스크립트를 실행하면 ftrace를 통해 rpi_get_interrupt_info 함수를 디버깅 할 수 있는데, available_filter_functions 설정 파일을 통해 확인할수있다.

 

available_filter_functions : linux 커널의 트레이싱(trace) 시스템에서 사용 가능한 함수 목록을 제공한다.

 

(6) ftrace 로그 분석

 

(6-1) trace 함수를 종료시키고 로그를 추출한다.

#!/bin/bash
# trace 종료
echo 0 > /sys/kernel/debug/tracing/tracing_on
echo "ftrace off"
sleep 3
cp /sys/kernel/debug/tracing/trace .
mv trace ftrace_log.c

 

(6-2) ftrace 로그 파일인 ftarce_log.c에서 해당 함수를 찾아 분석할 수 있다

 

3. 정리

커널을 디버깅할 수 있는 방법은 printk, ftrace 등 여러 가지가 존재하는데, 이번 장에서는 인터럽트 세부 속성을 출력하는 함수를 직접 추가하여 ftrace를 통해 커널 로그를 추출해 봤다.

 

728x90