커널 포팅 (5. 고급 커널 포팅 및 최적화 / 5.3 커널 디버깅 및 프로파일링)

2025. 3. 6. 19:45프로그래밍/시스템

5.3 커널 디버깅 및 프로파일링

임베디드 리눅스 시스템에서 커널 디버깅과 성능 분석은 안정적인 운영을 위해 필수적인 과정입니다.
이 장에서는 원격 디버깅(kgdb, gdbserver), 성능 분석(ftrace, perf), 실시간 디버깅(dmesg, printk, sysrq) 방법과
보안 고려사항, 임베디드 환경에서의 제약 및 주의사항을 함께 다룹니다.


🔹 1️⃣ kgdb, gdbserver를 이용한 원격 디버깅

커널 디버깅은 일반적인 애플리케이션 디버깅과 다르게 커널 공간에서 실행되는 코드를 분석해야 합니다.
이를 위해 kgdbgdbserver를 사용하여 원격 디버깅을 수행할 수 있습니다.


📌 1️⃣ kgdb를 사용한 원격 디버깅

kgdb는 GDB를 이용하여 커널을 디버깅할 수 있도록 해주는 커널 기능입니다.

1️⃣ 커널에서 kgdb 활성화 커널을 빌드할 때 다음 옵션을 활성화해야 합니다.

make menuconfig
Kernel hacking  ---> 
    [*] KGDB: kernel debugger 
    [*]   Include kgdb over serial console
    [*]   KGDB: Allow debugging with traps

2️⃣ kgdb를 위한 커널 커맨드라인 설정 U-Boot 또는 커널 커맨드라인에서 kgdboc 옵션을 추가해야 합니다.

setenv bootargs "console=ttyS0,115200 kgdboc=ttyS0,115200 kgdbwait"
  • kgdboc=ttyS0,115200 → UART(ttyS0)에서 kgdb 실행
  • kgdbwait → 부팅 중 kgdb 대기 (GDB 연결을 기다림)

3️⃣ gdb를 실행하여 원격 디버깅 호스트 PC에서 cross-gdb를 실행하여 kgdb에 연결합니다.

arm-linux-gnueabi-gdb vmlinux

GDB 명령어를 실행하여 원격 kgdb에 연결:

target remote /dev/ttyUSB0

4️⃣ 중단점 설정 및 디버깅

b start_kernel
c
  • b start_kernel → start_kernel 함수에서 중단점 설정
  • c → 실행 진행

📌 🔴 kgdb 사용 시 보안 고려사항

kgdb는 커널 디버깅에 강력한 기능을 제공하지만, 운영 환경에서 보안적으로 위험할 수 있습니다.

  • 비인가 접근 가능성: UART 또는 네트워크 인터페이스를 통해 원격 디버깅이 가능하기 때문에, 디버깅 포트가 개방된 상태로 유지되면 보안 위험이 발생할 수 있습니다.
  • 디버깅 도중 시스템 중단: kgdbwait가 설정된 경우 디버깅 요청을 기다리며 부팅이 멈출 수 있습니다.
  • 운영 환경에서는 kgdb 비활성화 권장: 배포된 제품에서는 kgdboc 및 kgdbwait를 제거하는 것이 바람직합니다.

배포 환경에서 kgdb 비활성화 방법

setenv bootargs "console=ttyS0,115200"

또는 커널 옵션에서 다음을 제거합니다.

[*] KGDB: kernel debugger  --->  [ ] Disable

📌 2️⃣ gdbserver를 이용한 원격 디버깅

gdbserver는 유저 공간에서 실행되는 프로그램을 원격 디버깅할 때 사용됩니다.

1️⃣ gdbserver 설치

sudo apt install gdbserver

2️⃣ 타겟 보드에서 gdbserver 실행

gdbserver :1234 ./my_program

3️⃣ 호스트 PC에서 원격 디버깅 연결

arm-linux-gnueabi-gdb my_program
target remote <보드 IP>:1234
b main
c

🔹 2️⃣ ftrace, perf를 활용한 커널 성능 분석

커널의 함수 호출, CPU 사용률, 시스템 성능 등을 분석하기 위해 ftrace 및 perf를 사용합니다.


📌 1️⃣ ftrace를 이용한 커널 트레이싱

1️⃣ 커널에서 ftrace 활성화

make menuconfig
Kernel hacking  --->
    Tracers  --->
        [*] Kernel Function Tracer
        [*] Enable function graph tracer

2️⃣ ftrace 활성화 및 사용

echo function > /sys/kernel/debug/tracing/current_tracer
cat /sys/kernel/debug/tracing/trace
  • function → 함수 호출 트레이싱
  • /sys/kernel/debug/tracing/trace → 트레이싱 결과 확인

3️⃣ 특정 커널 함수 트레이싱

echo schedule > /sys/kernel/debug/tracing/set_ftrace_filter
cat /sys/kernel/debug/tracing/trace

📌 2️⃣ perf를 이용한 성능 분석

perf는 CPU 사용률, 캐시 미스, 실행 시간 등을 측정하는 도구입니다.

1️⃣ perf 설치

sudo apt install linux-tools-common linux-tools-$(uname -r)

2️⃣ 커널에서 perf 이벤트 활성화

make menuconfig
Kernel Performance Events and Counters --->
    [*] Enable perf events

3️⃣ 커널 함수 실행 시간 측정

sudo perf record -g -a
sudo perf report

📌 🔴 임베디드 환경에서의 perf 제한사항

  • 하드웨어 성능 제한: 일부 저사양 임베디드 보드는 perf 실행이 어려울 수 있습니다.
  • 커널 빌드 필요: CONFIG_PERF_EVENTS가 활성화되어 있어야 합니다.
  • 오버헤드 발생: 실시간 시스템에서는 perf 사용이 성능 저하를 초래할 수 있습니다.

해결 방법

  • 가능한 한 ftrace를 대안으로 사용 (ftrace는 경량 분석 가능)
  • perf stat 대신 perf top을 사용하여 실시간 분석 최소화

🔹 3️⃣ dmesg, printk, sysrq 등을 이용한 실시간 디버깅

실시간 커널 디버깅을 위해 dmesg, printk, sysrq를 활용할 수 있습니다.


📌 🔴 sysrq 사용 시 주의사항

sysrq는 시스템을 직접 제어할 수 있는 강력한 기능이지만, 잘못 사용하면 시스템 장애를 유발할 수 있습니다.

  • echo b > /proc/sysrq-trigger → 시스템을 즉시 재부팅
  • echo c > /proc/sysrq-trigger → 강제 커널 패닉 (디버깅 용도)
  • echo t > /proc/sysrq-trigger → 모든 프로세스 상태 출력

운영 환경에서는 sysrq 비활성화 권장

echo 0 > /proc/sys/kernel/sysrq
  • 테스트 환경에서만 활성화
  • 운영 환경에서는 sysrq 기능을 제한하는 것이 좋음

✅ 정리

  1. kgdb, gdbserver 원격 디버깅
    • kgdboc를 통해 커널 원격 디버깅 가능
    • 운영 환경에서는 kgdb 사용을 피해야 보안 위험 최소화
  2. ftrace, perf를 이용한 커널 성능 분석
    • ftrace → 경량 커널 트레이싱 (함수 호출 분석)
    • perf → CPU 사용률 및 성능 분석
    • 임베디드 환경에서는 perf 사용이 제한될 수 있음
  3. dmesg, printk, sysrq 실시간 디버깅
    • dmesg → 커널 로그 확인
    • printk → 커널 모듈 디버깅
    • sysrq → 운영 환경에서는 사용 제한 필요