반응형

GDB를 사용하여 원격 디버깅하는 방법을 다룹니다. 

진행을 위해 호스트는 윈도우가 설치된 노트북, 타겟은 라즈베리파이3를 사용했습니다.



2021. 2. 28  최초작성

2023. 9. 27  검토



GDB는 대부분의 Linux 시스템에 사용되는 텍스트 기반의 디버거입니다.

리모트 디버깅을 하려면 타겟에는 gdbserver를 실행하고 호스트에는 크로스 디버거 gdb를 실행해야 합니다.



0. 호스트에 크로스 GDB를 설치해야 합니다.

 

아래 링크에서 raspberry-gcc10.2.1-r2.exe 를 다운로드하여 설치합니다. 

설치되는 디폴트 경로는 C:\SysGCC\raspberry입니다.

 

https://gnutoolchains.com/raspberry/

 

 

C:\SysGCC\raspberry\bin 경로에 필요한 gdb가 arm-linux-gnueabihf-gdb.exe라는 이름으로 있습니다. 




리눅스라면 다음처럼 크로스 GDB를 설치합니다. 이 경우 실행파일 이름이 gdb-multiarch입니다. 

 

$ sudo apt install gdb-multiarch

 

본 글에서는 호스트가 윈도우라고 가정하고 진행합니다.




1. 다음 파일들을 윈도우에서 작성해야 합니다. 

편의상 명령 프롬프트가 실행되는 위치인 C:\Users\사용자 이름에 test 폴더를 생성하여 진행합니다. 



test 폴더를 생성하고 해당 폴더로 이동합니다. 



다음처럼 명령 프롬프트에서 메모장을 실행하여 원하는 파일을 생성할 수 있습니다. 



메모장을 사용한 경우 Makefile은 다음처럼 이름을 바꾸어줘야 합니다.

 

 

작성해야하는 두 개의 파일입니다.


helloWorld.cpp


#include <iostream>

int main()
{
    int a = 1;
    int b = 2;

    int c = a + b;

  std::cout << c << std::endl;
}



Makefile

Makefile의 CFLAGS 옵션에 -g 옵션을 추가해야 합니다.


CC=arm-linux-gnueabihf-g++.exe
CFLAGS=-g

all: helloWorld.cpp
$(CC) helloWorld.cpp $(CFLAGS) -o helloWorld
clean:
rm -f helloWorld




다음 명령으로 컴파일합니다.



다음처럼 helloWorld 파일이 생성됩니다.



다음과 같은 에러가 난 경우 Makefile에서 들여쓰기 한 부분을 빈칸 4개로수정해주세요. 

 

C:\Users\webnautes\test>make

Makefile:5: *** missing separator.  Stop.




2. 라즈베리파이에 SSH 접속해둡니다. 

윈도우에서 진행한다면 MobaXterm을 사용하는 것을 권장합니다. 

 

 

 

 

3. 윈도우에서 scp를 사용하여 프로그램을 타겟에 복사합니다. 192.168.45.74는 라즈베리파이의 IP 주소로 변경하세요. 

 

scp helloWorld pi@192.168.45.74:/home/pi

 




4. 라즈베리파이와 연결된 ssh 터미널에서 프로그램을 실행시켜봅니다. 

실행하기 위해 퍼미션을 추가해주는 것이 필요합니다.




5. 타겟에 gdbserver를 설치합니다.

 

$ sudo apt-get install gdbserver




6. gdbserver를 다음처럼 실행합니다.

 

포트번호 2001는 바꿀 수 있습니다.

여기에선 프로그램 이름이 helloWorld라고 가정합니다.

 

문제없다면 pid와 Listening port가 출력됩니다.

 

$  gdbserver localhost:2001 helloWorld

 



7. 호스트에서 helloWorld 프로그램이 있는 위치에서 다음처럼 크로스 디버거를 실행합니다.

 

윈도우라면

arm-linux-gnueabihf-gdb helloWorld

 

리눅스라면

$ gdb-multiarch helloWorld






8. 호스트의 GDB 프롬프트 "(gdb)"에서 다음 명령을 사용하여 타겟에 접속합니다.

 

IP 주소는 타겟의 주소로 변경하세요. 

포트 번호는 gdbserver 실행시 지정한 것과 같아야 합니다.

 

(gdb) target remote 192.168.45.74:2001



9. 타겟에 다음 메시지가 출력됩니다.

 

Remote debugging from host ~~~~~

 



10. 호스트인 윈도우에서 디버깅을 해봅니다. 




타겟에 출력된 메시지입니다.  3이 출력되어 있는 것을 볼 수 있습니다. 

 



좀 더 편하게 디버깅을 하시려면 아래 포스트를 참고하세요.

 

Visual Studio Code에서 GDB 원격 디버깅하는 방법

https://webnautes.tistory.com/1855



참고

https://opencoursehub.cs.sfu.ca/bfraser/grav-cms/cmpt433/guides/files/DebuggingGuide.pdf

 

https://medium.com/@karel.l.vermeiren/cross-architecture-remote-debugging-using-gdb-with-visual-studio-code-vscode-on-linux-c0572794b4ef



반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts