21.10.4.2. VSCode의 `launch.json` 설정을 통한 Cortex-Debug 익스텐션 그래픽 환경 디버깅 연동 및 스텝 인(Step-in) 변수 조사(Variable Inspection)

21.10.4.2. VSCode의 launch.json 설정을 통한 Cortex-Debug 익스텐션 그래픽 환경 디버깅 연동 및 스텝 인(Step-in) 변수 조사(Variable Inspection)

이전 장에서 맛본 CLI 기반의 GDB 터미널 해킹은 1990년대 해커들에게는 향수를 불러일으키겠지만, 2020년대의 모던(Modern) C++ 개발자들에게 매번 키보드를 두드려 16진수 메모리를 파헤치게 하는 것은 고문에 가깝다.

우리가 코드를 짤 때 매일 쓰는 Visual Studio Code (VSCode) 편집기는, 내부에 숨겨진 launch.json 파일 하나만 제대로 세팅하면 앞서 배운 그 무시무시한 J-Link GDB 서버와 .elf 파일, 그리고 터미널 스크립트를 하나로 엮어 원클릭 하드웨어 디버깅 GUI 환경을 구축해 준다.

1. Cortex-Debug 익스텐션 설치

VSCode 좌측의 확장(Extensions) 마켓플레이스 탭에서 Cortex-Debug (제작자: marus25)를 검색하여 설치한다. 이 익스텐션이 바로 VSCode의 예쁜 마우스 클릭 UI를 백그라운드의 투박한 arm-none-eabi-gdb 커맨드로 번역해 주는 일등 공신이다.

2. .vscode/launch.json 마법진 그리기

PX4 소스코드의 최상단 폴더에 있는 .vscode 폴더 안에 launch.json 파일을 열고(없으면 만든다), 다음과 같이 J-Link와 픽스호크를 연결하는 완벽한 마법진을 그려 넣는다.

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "PX4 J-Link Debugging (payload_autodrop)",
            "type": "cortex-debug",
            "request": "launch",
            "servertype": "jlink",
            // 내가 타겟으로 삼을 보유 펌웨어 엘프 파일 경로 지정!
            "executable": "${workspaceRoot}/build/px4_fmu-vX_default/px4_fmu-vX_default.elf",
            // 픽스호크 4 메인 칩셋 이름
            "device": "STM32F765VI",
            "interface": "swd",
            "runToMain": false,
            // (핵심) 부팅 시 GDB가 읽을 초기화 스크립트 연결
            "svdFile": "${workspaceRoot}/build/px4_fmu-vX_default/NuttX/nuttx/tools/nuttx-gdbinit",
            // GDB 클라이언트 경로
            "armToolchainPath": "/usr/bin",
            "gdbPath": "arm-none-eabi-gdb"
        }
    ]
}

3. 마우스 하나로 시간을 지배하다

이 설정 파일(launch.json)을 저장하고 나면, VSCode 좌측의 Run and Debug 탭(또는 F5 키)를 누를 때 우리가 방금 지어준 이름 PX4 J-Link Debugging 메뉴가 뜬다. 재생(▶) 버튼을 파워풀하게 눌러보자.

놀라운 광경이 펼쳐진다.
VSCode 하단의 터미널 창에서 JLinkGDBServer가 알아서 켜지고, 보드를 리셋한 뒤 초록색 펌웨어 부팅 로그들을 쏟아내기 시작한다. 기체가 부팅을 완료하면 이제 터미널 창은 잊어버려도 좋다.

당신이 짠 src/modules/payload_autodrop/PayloadAutoDrop.cpp 파일을 열고, 의심 가는 줄(예: _current_state = AppState::TRIGGER;)의 가장자리 숫자(Line Number) 옆 빈 공간을 마우스로 클릭해 보라.
빨간색 점(Breakpoint) 이 쾅 하고 찍힐 것이다.

이제 터미널이 아니라 드론을 손에 들고 직접 조종기(RC)의 투하 스위치를 딸깍 내려보라.

FSM이 상태를 천이하며 코드가 저 빨간 점에 닿는 그 찰나의 순간!
드론의 모터와 CPU가 허공에서 일제히 멈추고(Halted), 당신의 VSCode 에디터 화면에는 저 빨간 점 위치에 노란색 화살표가 꽂히면서 실행이 일시 정지된다.

3.1 Step-in / 스텝 오버 (Step-over)

상단에 뜬 작은 리모컨 메뉴를 이용해 ‘F10 (Step Over)’ 을 누르면, 드론의 시간이 내 마우스 클릭 한 번에 ‘코드 1줄(약 0.0001초)’ 씩만 찔끔찔끔 흐르게 할 수 있다.

3.2 실시간 변수 조사 (Variable Inspection)

코드가 멈춰있는 동안 VSCode 왼쪽의 ‘Variables(변수)’ 창을 열어보라.
현재 시점의 내 모듈 안에 있는 _local_pos_sub->update() 결괏값이나, 1차 IIR 필터 공식 계산 직후의 고도값 변수(filtered_alt) 위에 그냥 마우스를 올려두기만 해도 **현재 RAM 메모리에 저장된 그 변수의 값(예: 24.53 m)**이 툴팁으로 투명하게 비춰 보인다.

결국 임베디드 코딩의 제왕은 터미널에서 C++를 상상하는 자가 아니라, 하드웨어 타이머와 GDB 프로토콜을 통달하여 쇳덩어리(MCU) 내부의 신경망을 눈으로 직접 까뒤집고 수술할 수 있는 시스템 해커(Debugger)인 것이다.


이것으로, 모듈의 기초 설계부터 실전 펌웨어 배포, 비행 성능 부검, 그리고 GDB JTAG 타겟 디버깅에 이르기까지 **커스텀 PX4 앱 통합 실무 바이블(제21장)**의 대장정이 완벽하게 끝을 맺었다.