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를 사용하려면 다음 설정이 필요합니다:
커널을 디버깅 모드로 빌드합니다.
CONFIG_DEBUG_INFO
와CONFIG_GDB_SCRIPTS
를 활성화합니다.
$ make menuconfig # Kernel hacking > Compile-time checks and compiler options > [*] Compile the kernel with debug info
디버그 심볼 포함 빌드:
$ make -j$(nproc)
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
는 커널 모드 디버깅 도구로, 일반적으로 시리얼 포트를 통해 디버깅을 수행합니다. 설정 방법은 다음과 같습니다:
CONFIG_KGDB
와CONFIG_KGDB_SERIAL_CONSOLE
활성화:$ make menuconfig # Kernel hacking > Kernel debugging > [*] KGDB: kernel debugger
커널 커맨드 라인에
kgdboc
추가:kgdboc=ttyS0,115200
디버깅 시작:
$ 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
를 설정하려면 다음 단계를 수행합니다:
CONFIG_FUNCTION_TRACER
활성화:$ make menuconfig # Kernel hacking > Tracers > [*] Kernel Function Tracer
ftrace
인터페이스 사용:# 사용 가능한 트레이서 확인 $ cat /sys/kernel/debug/tracing/available_tracers # 현재 활성화된 트레이서 확인 $ cat /sys/kernel/debug/tracing/current_tracer
트레이서 활성화:
$ 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를 활용한 디버깅을 실습했습니다. 이 글이 커널 개발과 디버깅에 도움되기를 바랍니다.
'Linux > Kernel Driver' 카테고리의 다른 글
Embedded Linux Kernel: Custom Kernel 패치 및 빌드 (0) | 2025.03.28 |
---|---|
Embedded Linux에서 전력 관리 기술과 Device Driver의 전력 관리 구현 (0) | 2025.03.27 |
DMA(Direct Memory Access) 처리: 개념과 사용법, 그리고 RK3399 예제 (0) | 2025.03.25 |
Interrupt Handling in Embedded Linux (0) | 2025.03.24 |
USB Device Driver 작성 및 Linux Kernel에서 USB 인터페이스 사용 방법 (0) | 2025.03.23 |