# 이미지 디버깅 및 테스트

이미지를 생성하고 커스터마이징 한 후, 이를 디버깅하고 테스트하는 과정은 매우 중요하다. 이를 통해 최종 제품이 안정적이고 성능이 최적화되었는지 확인할 수 있다.

#### 디버깅 방법

이미지 디버깅에는 여러 가지 방법과 도구가 사용된다. 주로 사용하는 방법은 다음과 같다:

**1. 로그 분석**

로그는 디버깅 과정에서 매우 유용한 정보를 제공한다. 일반적으로 로그는 다음과 같은 위치에서 확인할 수 있다:

* **Build Logs:** 빌드 중에 생성된 로그는 비트베이크의 출력, 각 패키지의 컴파일 로그, 배포 이미지 생성 로그를 포함한다. 대표적인 로그 파일은 `build/tmp/log/` 디렉토리 아래에 있다.

```shell
bitbake -k {image_name} > build/tmp/log/populate_sdk.log 2>&1
```

* **Runtime Logs:** 런타임 로그는 대상 시스템에서 동작하는 과정을 추적할 수 있으며, 보통 `syslog`, `dmesg`와 같이 시스템 로그를 확인한다.

```shell
dmesg
journalctl -xe
```

**2. 디버깅 도구**

* **GDB:** GNU 디버거를 사용하여 라이브러리와 애플리케이션을 디버깅한다.

```shell
gdb {binary_name}
```

* **Valgrind:** 메모리 누수 및 메모리 관련 문제를 디버깅하는 데 사용한다.

```shell
valgrind {binary_name}
```

* **Strace:** 시스템 호출 및 신호를 추적한다.

```shell
strace {binary_name}
```

#### 테스트 방법

이미지와 그에 포함된 소프트웨어가 올바르게 동작하는지 확인하기 위해 다양한 테스트 방법이 사용된다.

**1. 유닛 테스트**

개발된 소프트웨어 모듈별로 유닛 테스트를 작성하고 실행하여 각각이 올바르게 동작하는지 확인한다. Yocto 프로젝트에서는 `ptest` 프레임워크를 이용하여 유닛 테스트를 포함할 수 있다.

```shell
bitbake -c ptest {recipe_name}
```

**2. 통합 테스트**

전체 시스템의 통합 상태를 테스트하여 모듈들이 올바르게 상호작용하는지 확인한다.

* **자동화 테스트:** JUnit, Selenium과 같은 자동화 도구를 사용하여 테스트를 자동화할 수 있다.

**3. 하드웨어 테스트**

생성된 이미지를 실제 하드웨어에 올려 테스트한다. 하드웨어 테스트에는 다음과 같은 것들이 포함된다:

* **부팅 테스트:** 시스템이 예상대로 부팅하는지 확인한다.
* **퍼포먼스 테스트:** 시스템의 성능을 측정하여 최적화 필요한 부분을 파악한다.
* **네트워크 테스트:** 네트워크 연결성과 데이터 전송이 제대로 이루어지는지 확인한다.

```shell
dd if={image_file} of=/dev/{target_device} bs=4M
sync
```

**4. 시뮬레이터/에뮬레이터 테스트**

하드웨어 테스트는 비용과 시간이 많이 소요될 수 있으므로, 하드웨어 자원이 제한적일 때는 시뮬레이터나 에뮬레이터를 사용하여 테스트를 진행할 수 있다.

* **QEMU:** Yocto 프로젝트는 QEMU를 기본적으로 지원하여 가상 환경에서 이미지를 테스트할 수 있다.

```shell
runqemu {image_name}
```

**5. CI/CD 파이프라인**

지속적 통합/지속적 배포(CI/CD) 파이프라인을 사용하여 이미지 빌드 및 테스트 과정을 자동화한다. 이는 Jenkins, GitLab CI/CD, Travis CI 등으로 구현할 수 있다.

```yaml
stages:
  - build
  - test

build:
  stage: build
  script:
    - bitbake {image_name}

test:
  stage: test
  script:
    - bitbake -c ptest {recipe_name}
```

#### 문제 해결 팁

* **디버그 플래그 활성화:** 빌드 시 디버 그 플래그(`DEBUG_BUILD`)를 활성화하여 빌드한다.

```shell
EXTRA_OECONF += " --enable-debug"
```

* **확장된 로그:** 로그 수준을 높여 더 많은 정보를 수집한다.

```shell
BB_LOGCONFIG = "everything"
```

* **다양한 디버깅 포맷:** 다양한 포맷으로 로그를 저장하여 접근성을 높인다.

```
bitbake -v -D {image_name}
```

#### 최종 점검

디버깅 및 테스트 과정이 끝난 후 최종적으로 다음 사항을 점검한다:

* 모든 유닛 테스트 및 통합 테스트가 성공했는지.
* 하드웨어에서 예상대로 동작하는지.
* 배포 이미지가 최적화되어 있는지.
* 문서화가 충분히 이루어졌는지.

이와 같은 충분한 디버깅과 테스트 과정을 거쳐 안정적이고 신뢰할 수 있는 이미지를 생성할 수 있다. 디버깅 및 테스트는 반복적이고 시간이 걸리는 작업이지만, 최종 제품의 품질을 높이는 데 매우 중요한 단계이다.
