# Xenomai 고급 디버깅 및 프로파일링 기법

이 장에서는 Xenomai의 디버깅 기법에 대하여 전반적인 개요와 함께 심도있는 설명을 제공할 것이다. 특히 RTOS(실시간 운영체제) 환경에서의 디버깅의 어려움과 그 해결 방안을 중점적으로 다룬다.

#### Xenomai 디버깅 개요

Xenomai 프로젝트의 디버깅은 그 고유의 실시간 특성으로 인해 일반적인 리눅스 디버깅과는 다른 접근 방식을 요구한다. 실시간 시스템에서는 정확한 타이밍과 낮은 레이턴시가 중요하므로, 디버깅 과정에서 시스템의 실시간 성능을 방해하지 않도록 주의가 필요하다. 이 섹션에서는 Xenomai에서의 디버깅 방법론과 필수적인 도구들에 대하여 설명한다.

**실시간 시스템의 특수성**

* **정확한 타이밍 요구:** 실시간 시스템에서는 작업이 일정 시간 내에 완료되는 것이 필수이다. 따라서 디버깅 과정에서 타이밍이 변조되지 않도록 주의해야 한다.
* **낮은 레이턴시 유지:** 실시간 시스템의 또 다른 중요한 특성은 입력부터 출력까지의 지연시간, 즉 레이턴시가 매우 짧아야 한다는 것이다. 디버깅 툴이 이러한 특성을 해치지 않아야 한다.

**진단 도구들**

**GDB (GNU Debugger)**

GDB는 가장 일반적으로 사용되는 디버깅 도구이지만, 실시간 특성이 중요한 Xenomai에서 사용하기 위해서는 특정한 설정과 주의가 필요하다. 특히, 실시간 성능에 영향을 주지 않도록 GDB의 중단점 설정에 주의해야 한다.

* **원격 디버깅 지원:** 원격 디버깅을 통해 실시간 시스템을 최소한의 영향으로 디버깅할 수 있다.
* **중단점 제어 이슈:** 실제 시스템에서 중단점을 설정할 때 실시간 성능을 해치지 않도록 신중하게 선택해야 한다.

**Xenomai 특정 로깅 도구**

Xenomai는 자체적인 로깅 도구를 제공하여 실시간 시스템의 성능과 상태를 모니터링할 수 있게 한다.

* **rtdm\_printk:** 커널 모드에서 메시지를 출력하는 기능으로, 실시간 태스크 내에서 안전하게 사용될 수 있다.
* **/proc/xenomai:** 시스템 상태와 실시간 태스크의 정보를 제공하는 가상 파일 시스템으로, 디버깅 시 유용한 정보를 쉽게 얻을 수 있다.

**커널 트레이싱 도구**

* **Ftrace:** 리눅스 커널에 내장된 트레이싱 도구로, 함수 호출 트레이스를 통해 시스템 전체의 성능을 모니터링할 수 있다.
* **LTTng (Linux Trace Toolkit next generation):** 고급 트레이싱 도구로, 사용자 공간과 커널 공간 모두의 이벤트를 세부적으로 분석할 수 있다.

**사용자 공간 디버깅 도구**

* **fprintf and file I/O:** 사용자 공간에서의 간단한 디버깅을 위해 printf와 같은 표준 입출력 함수를 사용할 수 있다. 다만, 이는 실시간 성능에 영향을 줄 수 있다.
* **분산 로깅:** 특정 로그 메시지를 네트워크를 통해 외부로 전송하여 로컬 시스템의 성능에 영향을 최소화할 수 있다.

#### 실습: Xenomai 디버깅 도구 사용 방법

**예제 1: GDB를 이용한 원격 디버깅**

1. **GDB 서버 설정:** 디버깅할 프로그램이 실행되는 플랫폼에 GDB 서버를 실행한다.

   ```bash
   gdbserver :1234 ./your_xenomai_program
   ```
2. **호스트 시스템에서 GDB 클라이언트 연결:**

   ```bash
   gdb ./your_xenomai_program
   (gdb) target remote target_ip:1234
   ```
3. **중단점 설정 및 디버깅 진행:**

   ```bash
   (gdb) break main
   (gdb) continue
   ```

원격 디버깅을 통해 디버깅 작업이 실시간 성능에 영향을 최소화할 수 있도록 해야 한다.

**예제 2: rtdm\_printk를 이용한 커널 로깅**

1. 실시간 태스크 내에서 로그 메시지 출력:

   ```c
   rtdm_printk(KERN_INFO "This is a Xenomai RTDM log message\n");
   ```
2. 로그 메시지는 /var/log/syslog 파일에서 확인할 수 있다:

   ```bash
   tail -f /var/log/syslog
   ```

**예제 3: Ftrace를 이용한 커널 트레이싱**

1. Ftrace 활성화:

   ```bash
   echo function > /sys/kernel/debug/tracing/current_tracer
   ```
2. 트레이싱할 함수 설정:

   ```bash
   echo do_foo > /sys/kernel/debug/tracing/set_ftrace_filter
   ```
3. 트레이스 시작 및 중지:

   ```bash
   echo 1 > /sys/kernel/debug/tracing/tracing_on
   sleep 5
   echo 0 > /sys/kernel/debug/tracing/tracing_on
   ```
4. 결과 확인:

   ```bash
   cat /sys/kernel/debug/tracing/trace
   ```

**예제 4: LTTng 이용한 고급 트레이싱**

1. LTTng 세션 생성 및 시작:

   ```bash
   lttng create mysession
   lttng enable-event -k -a
   lttng start
   ```
2. 트레이스 종료 및 결과 분석:

   ```bash
   lttng stop
   lttng view
   ```

#### Xenomai 성능 프로파일링

실시간 시스템에서 디버깅 못지않게 중요한 것이 성능 프로파일링이다. Xenomai에서도 성능 최적화를 위한 다양한 프로파일링 툴을 활용할 수 있다.

**Xenomai 자체 프로파일링 도구**

* **/proc/xenomai/stat:** 시스템의 기본적인 성능 통계를 제공, CPU 사용률 및 태스크 전환 횟수 등을 확인할 수 있음.

**외부 프로파일링 도구**

**Perf**

* 성능 카운터를 활용한 상세 프로파일링

**Valgrind (기본 사용 가능)**

* 메모리 검증 및 분석 도구

**Rtai**

* 실시간 확장에서 유사한 기능을 제공

***

이번 장에서는 Xenomai에서의 고급 디버깅 및 프로파일링 기술을 다루었다. 실시간 운영체제의 특성상 일반적인 디버깅 기술보다 더 신중한 접근이 필요하다. 제공된 예제와 툴을 활용하여 효과적으로 문제를 진단하고, 시스템 성능을 최적화하는 방법을 익힐 수 있다.
