Отладка 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 и сразу остановить процессор. Программа возвращается в самое начало, туда, где процессор начинает работу после сброса.