# Xenomai 애플리케이션 디버깅

Xenomai 애플리케이션을 디버깅하는 과정은 전통적인 리눅스 애플리케이션과 약간 다르며, 실시간 특성을 유지하면서 디버깅을 수행해야 하므로 몇 가지 특별한 고려 사항이 있다. 다음은 Xenomai 애플리케이션을 디버깅하는 데 도움을 줄 수 있는 몇 가지 기술과 도구에 대해 설명한다.

#### 1. Xenomai를 위한 gdb 사용법

GDB(GNU Debugger)를 사용하여 Xenomai 애플리케이션을 디버깅할 수 있다. 하지만 Xenomai 실시간 커널과 협동하는 사용자 공간 애플리케이션의 경우, 실시간 성능에 영향을 미치지 않도록 디자인된 디버깅 방법이 필요하다.

* **기본적인 gdb 명령어**:

  ```sh
  gdb ./your_xenomai_application
  ```
* **리모트 디버깅**: 만약 타겟 디바이스에서 직접 디버깅을 실행할 수 없는 경우, `gdbserver`를 사용하여 원격 디버깅을 할 수 있다.

  ```sh
  gdbserver :1234 ./your_xenomai_application
  ```
* **gdb 연결**:

  ```sh
  gdb ./your_xenomai_application
  target remote <target-ip>:1234
  ```

#### 2. Xenomai 스코프(sched\_trace) 이용

Xenomai의 `sched_trace` 기능을 사용하면 애플리케이션의 스케줄링을 추적할 수 있다. 이를 통해 각 스레드의 실행 순서와 주기를 분석할 수 있다.

* **sched\_trace 명령어**:

  ```sh
  cat /proc/xenomai/sched/trace
  ```

#### 3. Xenomai API Trace 기능

Xenomai는 API 호출을 추적할 수 있는 기능을 제공한다. 이를 통해 특정 API 호출의 흐름과 타이밍을 분석할 수 있다.

* **tracing 기능 활성화**:

  ```sh
  echo 1 > /proc/xenomai/trace
  ```
* **trace 데이터 조회**:

  ```sh
  cat /proc/xenomai/trace
  ```

#### 4. Real-Time vs. Non-Real-Time 디버깅

실시간 애플리케이션을 디버깅할 때 주의해야 할 점 중 하나는, 디버깅 도구가 실시간 성능에 영향을 미칠 수 있다는 점이다. 일반적으로 비실시간 모드에서 디버깅을 수행하고, 이를 기반으로 실시간 모드에서 문제를 재현하여 해결하는 방법을 사용한다.

* **비실시간 모드 전환**:

  ```sh
  xeno_latency --non-realtime
  ```

#### 5. Adeos와 Kernel Tracing

Xenomai는 Adeos(I-pipe)를 기반으로 하는 실시간 커널 패치를 사용한다. 따라서 가끔 커널 수준의 디버깅이 필요할 수 있다.

* **Kernel Tracing 활성화**:

  ```sh
  echo 1 > /sys/kernel/debug/tracing/events/xenomai/enable
  ```
* **Kernel Trace 로그 조회**:

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

#### 6. 메시지 큐와 세마포어 디버깅

Xenomai는 다양한 동기화 메커니즘을 제공한다. 특히 메시지 큐와 세마포어를 사용할 때, 이를 디버깅하는 방법이 필요하다.

* **세마포어 상태 확인**:

  ```sh
  cat /proc/xenomai/sem
  ```
* **메시지 큐 상태 확인**:

  ```sh
  cat /proc/xenomai/msgq
  ```

#### 7. 실시간 성능 모니터링 도구

특정 Xenomai 기능을 모니터링하기 위해 제공되는 도구들을 사용할 수도 있다. 예를 들어, 기억상자가 가득 차거나 실시간 응답 시간이 목표 범위를 벗어나는 경우를 모니터링할 수 있다.

* **latency 테스트**: 시스템의 실시간 응답 성능을 측정한다.

  ```sh
  xeno_latency
  ```
* **up-time 모니터링**:

  ```sh
  xeno_timerbench
  ```

#### 8. Xenomai 통합 로그 시스템

Xenomai는 다양한 이벤트를 로그로 기록할 수 있는 메커니즘을 제공한다. 이를 통해 애플리케이션 안에서 발생하는 이벤트를 추적할 수 있다.

* **로그 활성화**:

  ```sh
  echo 1 > /proc/xenomai/log
  ```
* **로그 보기**:

  ```sh
  cat /proc/xenomai/log
  ```

#### 9. 기본적인 디버깅 기법

마지막으로, 일반적인 소프트웨어 디버깅 기법도 유효한다. 코드를 이해하기 쉽게 설계하고, 로그를 남기고, 부분적으로 테스트를 수행하는 등의 작업은 여전히 중요하다.

* **로그 남기기**: 실시간 스레드에 적절한 로그를 남기는 것은 중요하지만, 너무 빈번한 로그는 활동 주기에 영향을 줄 수 있다.

  ```c
  rt_print_auto_init(1);
  rt_printf("This is a test log message\n");
  ```
* **부분 테스트**: 전체 시스템을 디버깅하기보다는 작은 단위로 나눠서 각각의 기능을 테스트하는 것이 효과적이다.

***

Xenomai 애플리케이션을 디버깅하는 것은 실시간 특성을 유지하면서 매우 신중하게 접근해야 하는 작업이다. 제공된 자료와 도구들을 적절하게 활용하며 디버깅을 진행하면 더 나은 소프트웨어 개발을 할 수 있다. 실시간 시스템 특성상 오류를 조기에 찾아내고 수정하는 것이 매우 중요하므로, 디버깅 작업을 주기적으로 수행하며 코드 품질을 유지해야 한다.
