| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- atmel
- MVVM
- Visual Studio
- GPIO
- 아두이노
- avr-gcc
- buildroot
- 회로
- Debug
- yocto
- raspberrypi
- nucleo
- 라즈베리파이
- AVR
- vscode
- WPF
- STM32
- bare metal
- AArch64
- Debugging
- C++
- Arduino
- c#
- Raspberry
- QEMU
- esp32
- UART
- 디버깅
- Visual Studio Code
- Linux
- Today
- Total
임베디드를 좋아하는 조금 특이한 개발자?
[RaspberryPI4] JTAG(FT232H)로 Linux 커널 디버깅 - 2 (실제 디버깅) 본문
[RaspberryPI4] JTAG(FT232H)로 Linux 커널 디버깅 - 2 (실제 디버깅)
Gordon_ 2026. 7. 17. 06:26- 개발 환경
WSL2 : Ubuntu 24.04 LTS
buildroot : 2024.02
target board : RaspberryPI 4
openocd : 0.12.0
중요)
되도록이면 Ubuntu 24.04 를 사용해야합니다. 22.04에서 openocd 설치시 0.11.0 버전으로 설치되며, 해당 버전은 라즈베리파이 이 보드 관련 config 파일이 없습니다.
- 참고 문서
JTAG를 통해 RaspberryPI4 디버깅 방법
https://medium.com/@0xNoor/setup-openocd-with-jtag-uart-on-raspberry-pi-4-using-ft232h-da05ca01c693
반드시 이전 포스트를 확인하고 환경을 구성해주기 바랍니다.
https://littlebitodd-developer.tistory.com/105
[RaspberyPI4] JTAG(FT232H)로 Linux 커널 디버깅 - 1 (필요 환경 준비)
- 개발 환경WSL2 : Ubuntu 24.04 LTSbuildroot : 2024.02target board : RaspberryPI 4openocd : 0.12.0 중요) 되도록이면 Ubuntu 24.04 를 사용해야합니다. 22.04에서 openocd 설치시 0.11.0 버전으로 설치되며, 해당 버전은 라즈베
littlebitodd-developer.tistory.com
1. 서론
드디어 라즈베리파이를 JTAG로 디버깅 할 수 있는 환경이 갇추어졌습니다. 이제 디버깅하는 방법을 알아보도록 하겠습니다. 하지만 몇가지 문제가 있기에 좀 디버깅하는 방법이 복잡합니다. 천천히 해보도록 하겠습니다.
2. 디버깅 순서

위 순서를 통해 디버깅을 할 수 있습니다. 특히 FT232H의 경우 raspberryPI 맞춤 디버거가 아니므로 몇가지 문제가 있습니다. 먼저 gdb 에서 reset을 할 수 없습니다. 또한 JTAG를 연결하려면 먼저 라즈베리파이가 부팅되어야 합니다. 그러므로 해당 문제를 해결하기 위해 몇가시 해결 방법을 도입했습니다. 해결 방법은 위 순서를 설명하면서 같이 하도록 하겠습니다.
3. 라즈베리파이 부팅
https://littlebitodd-developer.tistory.com/105
[RaspberyPI4] JTAG(FT232H)로 Linux 커널 디버깅 - 1 (필요 환경 준비)
- 개발 환경WSL2 : Ubuntu 24.04 LTSbuildroot : 2024.02target board : RaspberryPI 4openocd : 0.12.0 중요) 되도록이면 Ubuntu 24.04 를 사용해야합니다. 22.04에서 openocd 설치시 0.11.0 버전으로 설치되며, 해당 버전은 라즈베
littlebitodd-developer.tistory.com
먼저 우리는 위 포스트 "3. 디버깅을 위한 Linux 빌드"에서 리눅스를 빌드하였습니다. 이제 sd카드로 image를 설치하고 라즈베리파이를 부팅 해보도록 하겠습니다.

먼저 image 파일의 위치는 위와 같습니다.
- image 파일 위
./output/raspberrypi4_64/image/sdcard.img
그리고 image를 sdcard에 설치하는 방법은 아래 포스트 "5. SD 카드에 Linux 설치"를 참고하세요.
https://littlebitodd-developer.tistory.com/19
Buildroot를 이용하여 Custom Linux 빌드 (Beaglebone, Raspberrypi 용)
참고 자료https://buildroot.org/downloads/manual/manual.html#_getting_started The Buildroot user manualPackage imagemagick installs the following scripts: $(STAGING_DIR)/usr/bin/{Magick,Magick++,MagickCore,MagickWand,Wand}-config So it’s fixup would b
littlebitodd-developer.tistory.com
4. U-Boot 진입
U-Boot에 진입하는 이유는 Linux을 Debug하기 전에 먼저 U-boot에서 JTAG를 연결하고 GDB를 설정하기 위함입니다.
U-Boot는 자동적으로 Linux에 부팅하도록 설정되어 있어 따로 부팅 후 몇초 후 입력하지 않으면 바로 Linux에 부팅합니다. 그렇기에 라즈베리파이 부팅 후 U-Boot에 진입하는 방법을 알아보도록 하겠습니다.

"Hit any key to stop autoboot" 메세지가 나왔을 때 어떤 입력을 주어 U-Boot에 진입합니다.
5. openOCD 실행
먼저 openOCD를 실행하기 전 FT232H가 연결되어있는지 확인합니다.
lsusb

중요)
openOCD의 버전이 0.12.0 이상인지 확인해주세요. 그 이유는 0.12.0 버전 부터 bcm2711(RPI4의 MPU)을 지원합니다.
openocd -v

openOCD를 실행하기 위해서는 2가지 파일이 필요합니다. 하나는 "JTAG 장비"에 대한 설정 파일이고, 다른 하나는 "타겟 보드" 에 대한 설정 파일입니다. 다행이도 openOCD에서는 FT232H JTAG와 라즈베리파이4에 대한 설정 파일을 모두 제공해주고 있으므로, 따로 파일을 작성할 필요는 없습니다.
FT232H 설정 파일 위치 : /usr/share/openocd/scripts/interface/ftdi/um232h.cfg
BCM2711 설정 파일 위치 : /usr/share/openocd/scripts/target/bcm2711.cfg
- openOCD 실행 명령어
openocd -f interface/ftdi/um232h.cfg -f target/bcm2711.cfg

Linux는 0번째 코어로 부팅하므로 저희는 3333 Port를 사용하여 GDB에 연결할 것입니다.
6. GDB 실행
주의)
반드시 아래 포스트를 따라서 Linux를 빌드해야합니다.
https://littlebitodd-developer.tistory.com/105
[RaspberyPI4] JTAG(FT232H)로 Linux 커널 디버깅 - 1 (필요 환경 준비)
- 개발 환경WSL2 : Ubuntu 24.04 LTSbuildroot : 2024.02target board : RaspberryPI 4openocd : 0.12.0 중요) 되도록이면 Ubuntu 24.04 를 사용해야합니다. 22.04에서 openocd 설치시 0.11.0 버전으로 설치되며, 해당 버전은 라즈베
littlebitodd-developer.tistory.com
# gdb 실행
gdb-multiarch

이제 리눅스 ELF 파일(vmlinux)를 설정하고, JTAG를 통해 라즈베리파이에 연결하도록 하겠습니다.
6.1. vmlinux 파일 추가
file output/raspberrypi4_64/build/linux-custom/vmlinux

정상적으로 vmlinux를 추가하였다면 아래와 같이 start_kernel 함수에 대한 시작 주소를 확인 할 수 있습니다.
info address start_kernel

또한 vmlinux를 추가하면서 자동적으로 architecture가 "aarch64"로 설정되었음을 확인할 수 있습니다.
show architecture

6.2. 라즈베리파이 연결
다음으로 라즈베리파이에 연결해야할 차례입니다.
우리는 Linux를 부팅할 때 사용하는 0번째 코어를 디버깅하려고 하니 3333 Port를 사용하여 라즈베리파이에 연결해야합니다.
target remote localhost:3333

7. 디버깅 설정
이제 디버깅을 할 수 있도록 GDB를 설정하도록 하겠습니다.
7.1. BreakPoint 설정
저는 Linux가 부팅되는 과정을 디버깅하기 위해서 start_kernel 함수의 시작 위치를 BreakPoint로 설정하도록 하겠습니다.
// start_kernel 시작 주소에 break point 설정
hbreak start_kernel
// 현재 설정되어 있는 breakpoint 확인
info breakpoints

7.2. GDB TUI 설정
디버깅할때 소스코드를 보면서 어떤 위치에서 코드가 실행되고 있는지 보면서하는 것이 편할 것입니다. 그래서 GDB에서는 TUI를 통해 화면을 나누어 현재 어떤 위치에서 코드가 실행중인지 표현할 수 있습니다.
layout src

7.3. 라즈베리파이 보드 실행
GDB로 라즈베리파이를 연결한 순간 부터 라즈베리파이 보드는 실행을 멈춥니다. 그러므로 이제 리눅스를 부팅하기 위해서 라즈베리파이를 다시 실행하도록 해주어야 합니다.
continue

8. 리눅스 부팅
이제 라즈베리파이에서 Linux를 부팅하도록 하겠습니다.
boot

리눅스가 부팅은 되었지만 Start kernel ... 에서 멈추는 것을 확인할 수 있습니다. 그 이유는 우리가 start_kernel에 BreakPoint를 설정했기에 해당 위치에서 코드가 멈춘 것입니다.
9. 리눅스 커널 디버깅
다시 GDB로 돌아 오면 정상적으로 start_kernel 시작 위치에서 코드가 멈춘 것을 확인 할 수 있습니다.

레지스터도 정상적으로 확인 할 수 있습니다.

10. 후기
이를 통해 QEMU 에뮬레이터 뿐많이 아니라 실제 하드웨어를 통해 리눅스를 디버깅하는 방법을 알아보았습니다. 확실히 라즈베리파이의 경우 자료가 많다 보니 어렵지 않게 JTAG로 디버깅하는 방법을 확인 할 수 있었습니다. 역시 라즈베리파이 만한 SBC가 없다는 것을 확인하였으며, Linux 디버깅을 통해 실제 하드웨어에서 어떻게 동작하는지도 확인 할 수 있었습니다.
물론 VSCode를 사용하여 더욱 쉽게 디버깅하는 방법도 있습니다. 해당 방법은 아래 관련 포스트에서 확인하실 수 있습니다.
- 관련 포스트
https://littlebitodd-developer.tistory.com/75
[Linux Debugging] QEMU로 실행한 Linux를 GDB로 디버깅
- 개발 환경WSL2 (Ubuntu 24.04 LTS)buildroot (2024.02)Qemu emulator (8.2.2 (Debian 1:8.2.2+ds-0ubuntu1.8))- 사전 필요 작업https://littlebitodd-developer.tistory.com/74 [Linux Debugging] Buildroot를 통해 디버깅할 리눅스 빌드- 개발 환
littlebitodd-developer.tistory.com
https://littlebitodd-developer.tistory.com/76
[Linux Kernel Debugging] VScode로 간편히 Linux kernel 디버깅하기
- 개발 환경WSL2 (Ubuntu 24.04 LTS)buildroot (2024.02)Qemu emulator (8.2.2 (Debian 1:8.2.2+ds-0ubuntu1.8))- 사전 필요 작업https://littlebitodd-developer.tistory.com/74 [Linux Debugging] Buildroot를 통해 디버깅할 리눅스 빌드- 개발 환
littlebitodd-developer.tistory.com
'Embedded > Raspberry PI' 카테고리의 다른 글
| [RaspberryPI4] JTAG(FT232H)로 Linux 커널 디버깅 - 1 (필요 환경 준비) (0) | 2026.06.20 |
|---|---|
| [RaspberryPI4] Bare metal에서 UART 수신(Rx) 구현 (0) | 2025.07.27 |
| [RaspberryPI4] Bare metal에서 UART통신 구현 (0) | 2025.07.18 |
| [RaspberryPI4] Bare metal에서 UART통신을 위한 레지스터 확인 (0) | 2025.07.18 |
| [RaspberryPI4] Bare metal에서 C언어로 GPIO 제어 (0) | 2025.07.16 |
