Скетч с тремя вложенными условиями печатал в монитор четыре строки за виток, и я перешивал его одиннадцать раз за вечер: каждая новая метка — новая прошивка, каждая прошивка — двадцать секунд ожидания, а переменная, которая вела себя странно, так и осталась загадкой до утра. Спасла точка останова — не строка в мониторе, а настоящий отладчик, встроенный в IDE 2. Скетч замер на отмеченной строке, и рядом в панели VARIABLES лежали все локальные значения сразу: живые, свежие, без единого Serial.println в коде. Один клик — и я увидел то, ради чего перешивал плату одиннадцать раз.
Разбираю механику: как ставятся точки останова, что показывает watch и стек вызовов, чем step over отличается от step into — и сразу честную оговорку, из-за которой урок начинается с грусти: на классической Uno отладчик без внешнего щупа не работает, и ниже я показываю, почему именно. Когда отладчик выигрывает у печати в порт, а когда сам ломает картину — отдельная таблица внизу. Порядок «симулятор, потом Serial, потом щупы» я раскладывал в уроке про методику отладки, а окно монитора и его настройки вспоминаются в уроке про монитор порта в IDE 2; здесь — инструмент с самой верхней ступени.
Точка останова за один клик
Механика в IDE 2 редакторская, как у больших сред для настольных языков. Клик по серой полосе слева от номера строки ставит точку останова — красный кружок; повторный клик снимает. Запуск не кнопкой «Загрузить», а через Debug: среда собирает скетч с отладочной информацией, шьёт плату и ждёт. Как только выполнение доезжает до отмеченной строки, всё замирает: строка подсвечивается, внизу панель VARIABLES перечисляет локальные и глобальные значения, рядом WATCH, куда вписывается своё выражение, и стек вызовов — путь из функций, который привёл на эту строку.
Дальше четыре кнопки. Continue отпускает скетч до следующей точки. Step over выполняет текущую строку целиком: если в ней вызов функции, внутрь вы не заходите. Step into заходит внутрь, Step out доводит текущую функцию до конца и выпрыгивает. Значения в панели пересчитываются на каждом шаге — вы двигаетесь по скетчу и видите строку, на которой число становится не тем, чем должно. Код при этом не трогается вовсе: никаких печатей, никаких правок, скетч остаётся ровно тем же, что уйдёт в итоговую прошивку. Плату и порт Debug берёт те же, что вы выбрали для обычной загрузки, — про этот выбор я вспоминал в уроке про плату и порт.
Uno без щупа: где отладчик спотыкается
Официальный гайд по отладке IDE 2 разбирает настройку плат Zero и щупов J-Link, Atmel-ICE — и это не случайные примеры: отладка живёт там, где чип умеет сообщать о себе по отладочному протоколу. Платы на SAMD — Zero, MKR-серия, Nano 33 IoT — отлаживаются по USB без единой покупки. У ATmega328P в Uno и Nano такой встроенной возможности нет: debugWIRE у чипа существует, но едет он по линии RESET, а на Uno эту линию держит мост USB-UART. Ближайшее исключение в том же семействе — Nano Every и Uno WiFi Rev2: у них на плате сидит отдельный отладочный чип mEDBG, и IDE 2 отлаживает их прямо по USB, без покупок. Отсюда жёсткие правила. Без щупа отладчик на Uno молчит — точка не сработает и панель не откроется. С щупом — работает, но народные рецепты требуют резать дорожку RESET на плате, и после разреза плата шьётся только через тот же щуп: обратная дорога без паяльника не клеится.
Консольный конвейер из урока про Arduino CLI эту дыру не закрывает: compile и upload он делает отлично, интерактивных панелей и шагов у терминала нет, а команда отладки заводится только для плат с аппаратной поддержкой. Мой вердикт с границей применимости: если отладчик нужен сегодня — дешевле взять плату с нативной отладкой, чем щуп; если проект прикован к Uno — работаем печатью и графиком и не тратим вечер на попытки завести то, что не заводится без пробника за десятки тысяч рублей.
// Скользящее среднее по трём чтениям A0 и сигнальный светодиод.// В отладчике достаточно одной точки на строке с avg: панель VARIABLES// покажет и sum, и avg после каждой остановки — печати не нужны вовсе. void setup() { Serial.begin(9600); pinMode(12, OUTPUT); Serial.println("start");} void loop() { int sum = 0; for (int i = 0; i < 3; i++) { sum = sum + analogRead(A0); } int avg = sum / 3; // целочисленное деление: дробь уходит if (avg > 600) { digitalWrite(12, HIGH); } else { digitalWrite(12, LOW); } Serial.print("avg="); Serial.println(avg); delay(500);}Где отладчик сильнее, а где сам ломает картину
Сравнение по цене одного круга. Печать в порт: увидели странное значение — придумали гипотезу — добавили Serial.println — прошивка — смотрим — гипотеза не подошла, ещё круг. Каждый круг стоит десятки секунд, за вечер набирается десяток-другой. Отладчик: точка переезжает мышкой прямо в сессии, watch добавляется на лету, круг занимает секунды. Редкий виток — тоже его случай: точка по счётчику ловит двенадцатый проход, тогда как печать всего подряд превращает монитор в стену, которую листаешь с прокруткой. И только отладчик даёт стек вызовов: он показывает, через какие функции скетч доехал до строки, — печать этого не даёт вовсе.
Границы честные. Отладчик замирает весь чип: таймеры, ШИМ, прерывания — всё стоит, пока вы читаете панель. Любое временное явление он ломает самим фактом остановки: мигание с периодом 300 мс видно как застывший кадр, а волна ШИМ — как одна ступенька. Для таймингов честнее остаются Serial-точки из урока про отладку логики, особенно когда в скетче прерывания — при остановке отладчика они просто не случатся вовремя, и панель покажет мир, которого не было. Для быстрого сигнала честнее график, к нему мы вернёмся в следующем уроке этого кластера.
| Задача | Serial.println | Отладчик IDE 2 |
|---|---|---|
| Посмотреть значение разово | добавить печать и перешить: 15-30 с на круг | watch без правки кода, значения живые |
| Поймать редкий виток | печатать всё, листать стены текста | точка по счётчику, стек покажет путь |
| Тайминги и ШИМ | честно, но примерно 1 мс за символ на 9600 бод | врёт: останов замирает весь чип целиком |
| Плата Uno или Nano | единственный доступный путь | нужен щуп Atmel-ICE или J-Link, дорожка под нож |
Мой рабочий порядок после года с этим инструментом. Логика сходится в симуляторе — там время послушно и провода не гнилые. Дальше развилка по железу: плата с нативной отладкой — ставим точки и смотрим VARIABLES, это самый быстрый способ найти строку, где число становится не тем. Плата без поддержки — печать и график, без мучений со щупами. Половина вечеров экономится не самим отладчиком, а порядком: пока гипотеза проверяется кликом, печать по кругу остаётся в прошлом квартале.
Две привычки, которые ускоряют сессию. Первая: точки умеют условия — правый клик по кружку открывает поле для выражения, и срабатывает она только когда выражение истинно: редкий виток ловится без кликов на каждый проход. Вторая: в WATCH пишите вычисления, а не только переменные — sum / 3 или avg > 600 прямо в панели отвечают на вопрос, который иначе пришлось бы считать головой или перепрошивать печатью. И держите под рукой скетч-подопытный: на нём стоит один раз прогнать все четыре кнопки шага, чтобы в боевой сессии пальцы не думали.
- 1. Как поставить точку останова в IDE 2?
- 2. Почему IDE 2 не отладит обычную Uno без внешнего щупа?
- 3. Скетч стоит на точке останова. Что происходит с ШИМ на пине 9 в это время?
- 4. Что делает Step over?
- 5. Печать строк по 20 символов на 9600 бод стоит примерно 20 мс на строку. Когда это станет настоящей помехой?
- Точка останова — клик по гаттеру; запуск через Debug: скетч замирает на строке, VARIABLES показывает все значения без правок кода
- Step over — строка целиком, Step into — внутрь функции, Step out — до её конца, Continue — до следующей точки
- Uno и Nano без щупа не отлаживаются: debugWIRE едет по линии RESET, на Uno её держит мост USB-UART; SAMD и ESP32-S3 отлаживаются по USB
- Отладчик сильнее печати на редких витках и разовых значениях, но врёт на таймингах: останов замирает весь чип
- Плата с нативной отладкой дешевле щупа к Uno и остаётся рабочей платой для проекта
Частые вопросы по теме урока
- Как поставить точку останова в IDE 2?
- Точка ставится кликом по гаттеру — серой полосе слева от кода. Повторный клик снимает её. Запускать скетч при этом нужно через Debug, а не обычной загрузкой. кликнуть по серой полосе слева от номера строки
- Почему IDE 2 не отладит обычную Uno без внешнего щупа?
- debugWIRE едет по линии RESET, занятой мостом на Uno и Nano. Без щупа (Atmel-ICE, J-Link) отладчик на AVR не работает; платы на SAMD и ESP32-S3 отлаживаются по USB. ATmega328P отлаживается через debugWIRE по линии RESET, а на Uno её держит мост USB-UART
- Скетч стоит на точке останова. Что происходит с ШИМ на пине 9 в это время?
- Остановка отладчика замирает весь чип: таймеры, ШИМ и прерывания стоят, пока вы читаете панель. Для таймингов и ШИМ честнее Serial-печать и график. останавливается: отладчик замирает весь чип вместе с таймерами
- Что делает Step over?
- Step over выполняет строку целиком без входа в функции. Зайти внутрь — Step into, довести функцию до конца и выпрыгнуть — Step out. выполняет текущую строку целиком, не заходя внутрь вызовов
- Печать строк по 20 символов на 9600 бод стоит примерно 20 мс на строку. Когда это станет настоящей помехой?
- На 9600 бод байт едет около миллисекунды, строка в 20 символов — 20 мс. Пока гипотезы меняются медленно, цена невидима; на коротких таймингах печать сама становится участником эксперимента. когда проверяете тайминги короче сотни миллисекунд