2025. 3. 6. 19:45ㆍ프로그래밍/시스템
5.3 커널 디버깅 및 프로파일링
임베디드 리눅스 시스템에서 커널 디버깅과 성능 분석은 안정적인 운영을 위해 필수적인 과정입니다.
이 장에서는 원격 디버깅(kgdb, gdbserver), 성능 분석(ftrace, perf), 실시간 디버깅(dmesg, printk, sysrq) 방법과
보안 고려사항, 임베디드 환경에서의 제약 및 주의사항을 함께 다룹니다.
🔹 1️⃣ kgdb, gdbserver를 이용한 원격 디버깅
커널 디버깅은 일반적인 애플리케이션 디버깅과 다르게 커널 공간에서 실행되는 코드를 분석해야 합니다.
이를 위해 kgdb와 gdbserver를 사용하여 원격 디버깅을 수행할 수 있습니다.
📌 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 기능을 제한하는 것이 좋음
✅ 정리
- kgdb, gdbserver 원격 디버깅
- kgdboc를 통해 커널 원격 디버깅 가능
- 운영 환경에서는 kgdb 사용을 피해야 보안 위험 최소화
- ftrace, perf를 이용한 커널 성능 분석
- ftrace → 경량 커널 트레이싱 (함수 호출 분석)
- perf → CPU 사용률 및 성능 분석
- 임베디드 환경에서는 perf 사용이 제한될 수 있음
- dmesg, printk, sysrq 실시간 디버깅
- dmesg → 커널 로그 확인
- printk → 커널 모듈 디버깅
- sysrq → 운영 환경에서는 사용 제한 필요
'프로그래밍 > 시스템' 카테고리의 다른 글
커널 포팅 (6. 실전 커널 포팅 프로젝트 / 6.2 새로운 보드용 커널 포팅 프로젝트 진행) (0) | 2025.03.06 |
---|---|
커널 포팅 (6. 실전 커널 포팅 프로젝트 / 6.1 라즈베리파이(Raspberry Pi) 커널 포팅 실습) (0) | 2025.03.06 |
커널 포팅 (5. 고급 커널 포팅 및 최적화 / 5.2 루트 파일 시스템 설정) (0) | 2025.03.06 |
커널 포팅 (5. 고급 커널 포팅 및 최적화 / 5.1 부트로더 커스터마이징) (0) | 2025.03.06 |
커널 포팅 (4. 드라이버 포팅 / 4.3 새로운 드라이버 추가하기) (0) | 2025.03.06 |