Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Отладка embedded Rust на Raspberry Pi Pico 2 с помощью GDB

В этой главе мы рассмотрим, как отлаживать программы на embedded Rust для Raspberry Pi Pico 2 (RP2350) с помощью GDB. Понадобится отладочный зонд, который нужно подключить к Raspberry Pi Pico 2. Прежде чем продолжить, прочитайте главу «Отладочный зонд для Raspberry Pi Pico 2».

Что даёт отладочный зонд

В главе о зонде мы видели, что он избавляет от необходимости каждый раз нажимать кнопку BOOTSEL при прошивке. Но возможности зонда намного шире. Он позволяет использовать GDB прямо с компьютера, так что вы можете отлаживать программу во время её работы на Pico 2.

Что такое GDB?

Если вы никогда не пользовались GDB, вот простое объяснение: GDB — это отладчик командной строки, который позволяет приостанавливать программу, смотреть, что происходит внутри неё, читать память и выполнять код пошагово, чтобы находить проблемы.

Для отладки Pico 2 нужна версия GDB с поддержкой архитектуры ARM. Установить её можно командой:

sudo apt install gdb-multiarch

Включаем GDB в Embed.toml

Раньше мы использовали probe-rs через команду cargo embed. Тот же инструмент может запускать и GDB-сервер, который позволяет подключить GDB к Pico 2 через отладочный зонд.

Для этого нужно отредактировать файл Embed.toml в корне проекта. Это файл конфигурации, который использует команда cargo embed. Добавьте в него следующий раздел, чтобы включить GDB-сервер:

[default.gdb]
# Открывать ли GDB-сервер после прошивки.
enabled = true

Пример проекта

Для этого упражнения я создал простую программу, которая мигает светодиодом, с использованием rp-hal. Embassy здесь не используется, чтобы всё оставалось простым. Файл Embed.toml уже настроен, поэтому можно клонировать проект и сразу начать работать:

git clone https://github.com/ImplFerris/pico-debug
cd pico-debug

Если сейчас выполнить команду cargo embed, GDB-сервер запустится автоматически и будет слушать порт 1337 (порт по умолчанию для probe-rs).

Подключение GDB к удалённому серверу

Чтобы подключить GDB к запущенному GDB-серверу probe-rs, откройте новый терминал и запустите GDB с бинарным файлом нашего проекта:

Примечание: в версии probe-rs 0.30 есть проблема: при попытке подключиться к GDB-серверу соединение сразу закрывается. Я откатился к версии 0.28, как рекомендовано в этом обсуждении проблемы. После отката снова запустите cargo embed.

gdb-multiarch ./target/thumbv8m.main-none-eabihf/debug/pico-debug

Затем подключитесь к серверу на порту 1337:

(gdb) target remote :1337

На этом этапе GDB подключён к Pico 2 через отладочный зонд, и вы можете использовать точки останова, пошаговое выполнение, просмотр памяти и другие команды отладки.

Возврат к началу программы

Когда вы подключаете GDB к запущенному GDB-серверу, процессор может быть не остановлен в начале вашей программы. Он может находиться где-то глубоко внутри кода.

Чтобы начать отладку с чистого состояния, выполните:

(gdb) monitor reset halt

Эта команда говорит отладочному зонду сбросить Pico 2 и сразу остановить процессор. Программа возвращается в самое начало, туда, где процессор начинает работу после сброса.