Linux/buildroot

gdbserver를 활용한 원격 디버깅

임베디드 친구 2025. 4. 22. 14:39
728x90
반응형

gdbserver를 활용한 원격 디버깅

Buildroot를 활용하여 임베디드 시스템을 개발할 때, 원격 디버깅은 매우 중요한 과정입니다. 특히 네트워크를 이용한 원격 디버깅 기법을 사용하면, 직접 디바이스에 접근하지 않고도 오류를 분석하고 수정할 수 있습니다. 이번 포스팅에서는 gdbserver를 활용한 원격 디버깅 방법을 설명하고, Buildroot 환경에서 gdbserver를 설정하고 사용하는 방법을 단계별로 안내하겠습니다.

1. gdbserver란?

gdbserver는 GNU Debugger(GDB)의 원격 디버깅을 지원하는 서버 프로그램입니다. 임베디드 시스템에서 실행되는 애플리케이션을 로컬 개발 환경에서 디버깅할 수 있도록 도와줍니다. gdbserver는 타겟 디바이스에서 실행되고, 호스트 머신에서 실행 중인 GDB와 네트워크를 통해 통신합니다.

2. Buildroot에서 gdbserver 활성화하기

Buildroot에서 gdbserver를 사용하려면 해당 패키지를 활성화해야 합니다. 이를 위해 Buildroot의 메뉴 설정에서 다음 단계를 수행합니다.

  1. Buildroot 설정 메뉴 실행:
    make menuconfig
  2. Target packagesDebugging, profiling and benchmark 메뉴로 이동합니다.
  3. gdb를 선택하고, gdbserver를 활성화합니다.
  4. 변경 사항을 저장하고 Buildroot를 다시 빌드합니다.
    make

위 단계를 완료하면 Buildroot가 gdbserver를 포함한 파일 시스템 이미지를 생성합니다.

3. 타겟 디바이스에서 gdbserver 실행하기

Buildroot를 통해 gdbserver가 포함된 파일 시스템을 생성한 후, 이를 타겟 보드에 플래시하고 부팅합니다. 이후 디버깅할 애플리케이션을 준비하고, 다음 명령을 실행하여 gdbserver를 실행합니다.

./gdbserver :1234 ./my_application

여기서 :1234gdbserver가 사용할 포트 번호이며, ./my_application은 디버깅할 실행 파일입니다.

4. 호스트 머신에서 GDB를 실행하여 원격 디버깅하기

이제 호스트 머신에서 GDB를 실행하여 타겟 디바이스에서 실행 중인 애플리케이션을 디버깅할 수 있습니다. 이를 위해 다음 단계를 수행합니다.

  1. 디버깅할 애플리케이션을 컴파일할 때 디버깅 심볼을 포함하도록 설정합니다.

    gcc -g -o my_application my_application.c
  2. 호스트 머신에서 cross GDB를 실행합니다.

    arm-linux-gnueabihf-gdb my_application
  3. GDB에서 원격 디바이스에 연결합니다.

    (gdb) target remote <타겟 IP>:1234

    여기서 <타겟 IP>는 원격 디바이스의 IP 주소입니다.

  4. 브레이크포인트를 설정하고 프로그램 실행을 제어합니다.

    (gdb) break main
    (gdb) continue

5. gdbserver를 활용한 디버깅 예제

다음은 간단한 예제 코드입니다. 이 프로그램을 gdbserver를 통해 원격 디버깅할 수 있습니다.

#include <stdio.h>

void buggy_function() {
    int *ptr = NULL;
    *ptr = 42; // Segmentation fault 발생
}

int main() {
    printf("디버깅 예제 시작\n");
    buggy_function();
    printf("디버깅 예제 종료\n");
    return 0;
}

이 프로그램을 컴파일한 후, gdbserver를 사용하여 실행하면 segfault가 발생하는 부분을 원격으로 디버깅할 수 있습니다.

6. 추가 디버깅 명령어

원격 디버깅 과정에서 유용하게 사용할 수 있는 몇 가지 GDB 명령어를 소개합니다.

  • step (단계별 실행): 한 줄씩 코드를 실행하며 진행 상황을 확인합니다.
  • next (다음 줄 실행): 함수 내부로 들어가지 않고 다음 줄로 이동합니다.
  • print 변수명 (변수 값 출력): 특정 변수의 값을 확인합니다.
  • info registers (레지스터 정보 확인): 현재 CPU 레지스터 값을 확인합니다.
  • bt (백트레이스 확인): 함수 호출 스택을 출력하여 프로그램이 어디에서 충돌했는지 확인합니다.

7. 마무리

이번 포스팅에서는 gdbserver를 활용한 원격 디버깅 방법을 소개하였습니다. Buildroot 환경에서 gdbserver를 활성화하고, 타겟 보드에서 실행하는 방법을 설명하였으며, 호스트 머신에서 GDB를 사용하여 디버깅하는 과정까지 다루었습니다. 이를 활용하면 물리적으로 접근이 어려운 임베디드 시스템에서도 효율적으로 디버깅할 수 있습니다.

반응형