# GDB를 이용한 Xenomai 디버깅

GDB(GNU Debugger)는 Xenomai 애플리케이션의 디버깅에 매우 강력한 도구이다. Xenomai 환경에서의 디버깅은 표준 POSIX 스레드 애플리케이션과는 몇 가지 차이점이 있으므로, 이 섹션에서는 GDB를 효과적으로 사용하는 방법을 자세히 설명한다.

#### GDB 시작하기

1. **디버그 빌드 생성** 디버깅을 허용하려면 애플리케이션을 디버그 모드로 컴파일해야 한다. 이를 위해 일반적으로 다음과 같이 컴파일 플래그를 사용한다:

   ```sh
   gcc -g -o my_xenomai_app my_xenomai_app.c -lxenomai
   ```

   이 명령은 디버깅 정보를 포함하는 실행 파일을 생성한다.
2. **GDB 시작** 생성된 디버그 빌드를 사용하여 GDB를 시작한다:

   ```sh
   gdb ./my_xenomai_app
   ```

#### 기본 GDB 명령

다음은 GDB의 기본 명령어이다:

* **break**: 브레이크포인트 설정

  ```sh
  (gdb) break main
  ```
* **run**: 애플리케이션 실행

  ```sh
  (gdb) run
  ```
* **step**: 코드 한 줄씩 실행

  ```sh
  (gdb) step
  ```
* **continue**: 다음 브레이크포인트까지 실행

  ```sh
  (gdb) continue
  ```
* **print**: 변수 값 출력

  ```sh
  (gdb) print my_variable
  ```

3. **Xenomai 특수 상황** Xenomai는 실시간 시스템이므로, 실시간 스레드의 상태를 확인하기 위해 `xr_debug`와 같은 유틸리티를 사용할 필요가 있다.

#### 스레드 디버깅

Xenomai 애플리케이션은 주로 실시간 스레드를 사용하기 때문에, GDB를 이용해 여러 스레드를 디버깅하는 것이 중요하다. 다음은 스레드 디버깅과 관련된 몇 가지 명령어이다:

* **info threads**: 현재 실행 중인 모든 스레드 목록을 표시한다.

  ```sh
  (gdb) info threads
  ```
* **thread thread\_id**: 특정 스레드로 전환한다.

  ```sh
  (gdb) thread 3
  ```

#### Xenomai 주의사항

Xenomai의 실시간 특성은 디버깅을 어렵게 만들 수 있다. 특히, 특정 시점에서의 스냅샷을 통해 문제를 분석해야 하는 경우가 많다. 이를 위해 다음과 같은 기법을 사용할 수 있다:

* **실시간 장애 상황 분석**: 실시간 시스템에서는 실시간 스레드가 불규칙하게 중단되거나 지연될 수 있다. GDB를 통해 중단 시점의 메모리와 레지스터 상태를 조사한다.
* **메모리 조사**: 특정 메모리 주소의 상태를 조사하여 문제를 파악한다.

  ```sh
  (gdb) x/x 0xaddress
  ```
* **레지스터 값 확인**: 레지스터 값을 확인하여 현재 스레드의 상태를 파악한다.

  ```sh
  (gdb) info registers
  ```

#### Xenomai 특수 명령어

* **xeno\_bt**: Xenomai에서는 백트레이스(backtrace)를 확인하기 위해 `xeno_bt` 명령어를 활용한다.

  ```sh
  (gdb) xeno_bt
  ```
* **xeno\_ps**: 모든 실시간 스레드의 상태를 확인한다.

  ```sh
  (gdb) xeno_ps
  ```

#### GDB와 Xenomai 연동

GDB는 Xenomai와 잘 통합되어 있으며, 시스템이 실시간 임계 상태에 있는지 확인하기 위해 특별한 주의사항을 따른다. 다음은 GDB와 Xenomai를 연동하여 디버깅을 최적화하는 몇 가지 추가적인 기법이다:

1. **GDB 초기화 스크립트**: Xenomai 디버깅을 시작할 때마다 반복적으로 설정해야 하는 초기화 명령이 있다면, 이를 `.gdbinit` 파일에 저장하여 자동으로 실행되게 할 수 있다:

   ```gdb
   set print thread-events on
   set pagination off
   ```
2. **심볼 파일 로딩**: 애플리케이션이 로드된 심볼 파일을 포함하여 디버거가 더 많은 정보를 제공할 수 있도록 한다.

   ```sh
   (gdb) file my_xenomai_app
   ```
3. **핸들러 설정**: 예외 상황에 대한 핸들러를 설정하여 중단 이유를 플래그할 수 있다.

   ```sh
   (gdb) handle SIGXCPU print nostop noprint
   ```

#### 실시간 성능 문제 해결

실시간 시스템에서는 성능 문제를 해결하는 것이 중요하다. GDB 외에도 Xenomai는 다양한 성능 분석 도구를 제공하며, 다음은 그 예이다:

1. **latency**: Xenomai는 실시간 시스템의 지연(latency)을 테스트할 수 있는 `latency` 유틸리티를 제공한다. 이 유틸리티를 사용하여 실시간 반응 속도를 측정한다.

   ```sh
   sudo /usr/xenomai/bin/latency
   ```
2. **rtail**: 실시간 시스템의 로그를 실시간으로 확인하기 위해 `rtail`을 사용한다.

   ```sh
   sudo /usr/xenomai/bin/rtail -f /var/log/messages
   ```
3. **/proc/xenomai/stat**: Xenomai의 핵심 통계 정보를 `/proc/xenomai/stat` 파일에서 확인할 수 있다.

   ```sh
   cat /proc/xenomai/stat
   ```

#### 종료 및 정리

디버깅 작업이 완료되면 GDB 세션을 종료한다. 단순히 `quit` 명령어를 사용하여 GDB를 종료할 수 있다.

```sh
(gdb) quit
```

디버깅 세션이 종료되면, 마지막으로 시스템 상태를 재검사하여 모든 리소스가 올바르게 해제되었는지 확인하는 것이 좋다.

***

이 섹션에서는 GDB를 이용한 Xenomai 애플리케이션 디버깅의 기본적인 방법과 기법에 대해 설명하였다. GDB는 Xenomai 환경에서 매우 강력한 도구이며, 잘 활용하면 실시간 애플리케이션의 버그를 효과적으로 추적하고 해결할 수 있다.

각 단계에서 제시한 다양한 명령어와 기법을 활용하면, Xenomai 환경에서 실시간 성능을 유지하면서도 문제를 빠르게 해결할 수 있을 것이다.
