Linux/Kernel Driver

Embedded Linux Kernel 디버깅 가이드

임베디드 친구 2025. 3. 26. 08:54
728x90
반응형

Embedded Linux Kernel 디버깅 가이드

Embedded Linux Kernel 개발을 하다 보면 다양한 문제에 직면하게 됩니다. 이를 해결하기 위해서는 커널 디버깅 기술이 필수적입니다. 이번 포스팅에서는 Linux Kernel 디버깅 방법을 소개하고, Rockchip RK3399 시스템을 기준으로 예제를 통해 gdb, kgdb, ftrace 등을 활용한 디버깅 방법을 설명합니다.


1. Kernel 로그 확인 및 디버깅 도구

1.1 dmesg 명령어

Linux Kernel은 시스템 부팅 과정과 실행 중 발생하는 로그를 기록합니다. 이 로그는 dmesg 명령어를 통해 확인할 수 있습니다.

# dmesg 로그 확인
$ dmesg | less

# 특정 키워드 필터링
$ dmesg | grep "error"

1.2 printk 디버깅

printk 함수는 커널 내부에서 디버깅 메시지를 출력하는 데 사용됩니다. 이 함수는 dmesg를 통해 로그로 확인할 수 있습니다.

#include <linux/kernel.h>

void my_debug_function(void) {
    printk(KERN_INFO "[DEBUG]: 함수가 호출되었습니다!\n");
}

주의: 지나친 printk 사용은 성능 저하를 유발할 수 있습니다.


2. gdb를 이용한 디버깅

2.1 gdb 환경 설정

gdb는 유저모드 디버깅뿐만 아니라 커널 디버깅에도 사용할 수 있습니다. RK3399 개발 보드에서 gdb를 사용하려면 다음 설정이 필요합니다:

  1. 커널을 디버깅 모드로 빌드합니다.

    • CONFIG_DEBUG_INFOCONFIG_GDB_SCRIPTS를 활성화합니다.
    $ make menuconfig
    # Kernel hacking > Compile-time checks and compiler options > [*] Compile the kernel with debug info
  2. 디버그 심볼 포함 빌드:

    $ make -j$(nproc)
  3. gdbserver를 사용해 원격 디버깅을 설정합니다.

    $ gdbserver :1234 ./vmlinux

2.2 gdb 디버깅 예제

다음은 gdb를 이용해 커널 함수 my_debug_function을 디버깅하는 예제입니다.

# 로컬에서 gdb 실행
$ gdb ./vmlinux

# 원격 디버거에 연결
(gdb) target remote <IP>:1234

# 브레이크포인트 설정
(gdb) b my_debug_function

# 디버깅 시작
(gdb) c

3. kgdb를 이용한 커널 디버깅

3.1 kgdb 설정

kgdb는 커널 모드 디버깅 도구로, 일반적으로 시리얼 포트를 통해 디버깅을 수행합니다. 설정 방법은 다음과 같습니다:

  1. CONFIG_KGDBCONFIG_KGDB_SERIAL_CONSOLE 활성화:

    $ make menuconfig
    # Kernel hacking > Kernel debugging > [*] KGDB: kernel debugger
  2. 커널 커맨드 라인에 kgdboc 추가:

    kgdboc=ttyS0,115200
  3. 디버깅 시작:

    $ echo g > /proc/sysrq-trigger

3.2 kgdb 디버깅 예제

# gdb 실행 및 연결
$ gdb ./vmlinux
(gdb) target remote /dev/ttyS0

# 브레이크포인트 설정
(gdb) b sys_open

# 디버깅 시작
(gdb) c

4. ftrace를 이용한 성능 디버깅

4.1 ftrace 개요

ftrace는 함수 트레이싱 및 성능 분석 도구입니다. RK3399 시스템에서 ftrace를 설정하려면 다음 단계를 수행합니다:

  1. CONFIG_FUNCTION_TRACER 활성화:

    $ make menuconfig
    # Kernel hacking > Tracers > [*] Kernel Function Tracer
  2. ftrace 인터페이스 사용:

    # 사용 가능한 트레이서 확인
    $ cat /sys/kernel/debug/tracing/available_tracers
    
    # 현재 활성화된 트레이서 확인
    $ cat /sys/kernel/debug/tracing/current_tracer
  3. 트레이서 활성화:

    $ echo function > /sys/kernel/debug/tracing/current_tracer
    $ echo my_debug_function > /sys/kernel/debug/tracing/set_ftrace_filter

4.2 트레이스 결과 확인

$ cat /sys/kernel/debug/tracing/trace

결론

이번 포스팅에서는 Embedded Linux Kernel 디버깅을 위한 주요 도구와 방법을 살펴보았습니다. 특히 Rockchip RK3399 시스템을 기준으로 gdb, kgdb, ftrace를 활용한 디버깅을 실습했습니다. 이 글이 커널 개발과 디버깅에 도움되기를 바랍니다.

반응형