Как использовать точки останова для отладки

9

Точки останова - отличный способ увидеть, как компилятор работает с вашим кодом. Теперь мой вопрос: есть ли возможность использовать точки останова при отладке кода?

H. Pauwelyn
источник

Ответы:

9

Как отмечается в ответе Майенко, среда IDE Arduino не предоставляет механизм точек останова, но Atmel Studio поддерживает точки останова . [*]

Однако, если у вас есть переключатель и светодиод, вы можете отслеживать ход вашей программы таким образом, чтобы обеспечить некоторые преимущества точек останова. Вы могли бы добавить подпрограмму, скажем BPReport(), что через последовательный выход или ЖК-дисплей сообщает значения критических переменных, затем загорается светодиод и ждет, пока переключатель не будет нажат и отпущен, с отладкой. Позвоните в вашу BPReport()программу, где бы вы ни хотели, безусловную точку останова Для условных точек останова у вас может быть подпрограмма, BPReportIf(cond)которая вызывает BPReport()if, если condtrue. Если вы не хотите выводить через последовательный порт, вы можете использовать несколько светодиодов или ЖК-дисплей, и вы можете использовать несколько переключателей, если вам нужны внешние средства управления отключением (например, это condможет быть проверка одного из дополнительных переключателей).

[*] Некоторые аппаратные отладчики изменяют загруженный код каждый раз, когда точки останова добавляются, изменяются или удаляются. Такое использование изнашивает флэш-память быстрее, чем просто время от времени загружает ее. Если для такой отладки интенсивно использовался чип, не используйте его в производственной системе.

Джеймс Уолдби - jwpat7
источник
4

Хотя Majenko его ответ правильный, есть и другие варианты.

Что касается реальной аппаратной отладки, заявленной Маженко, я бы сказал:

  1. Установите и используйте настоящую IDE, такую ​​как Atmel Studio или плагин arduino eclipse под названием sloeber (я автор), и
  2. Используйте полный аппаратный отладчик или аппаратное обеспечение, имеющее его на борту, например Arduio zero, или аппаратное обеспечение, использующее другую технологию отладки, например ESP8266, которая позволяет отладку по USB

Другим вариантом отладки из совершенно другой категории является организация вашего кода таким образом, чтобы логика принятия решений (аппаратно-независимая) и действие (аппаратно-зависимая) были полностью разделены.

Затем скомпилируйте эскиз как локальную программу и отладьте «логику принятия решений» на локальном компьютере. Этот метод не допускает «аппаратную отладку». Этот метод также позволяет юнит-тестирование.

Обратите внимание, что ваш локальный компьютер, вероятно, является 32- или 64-битным, а большинство Arduino - 8-битными, что приведет к различиям в типах данных, что является дополнительным моментом внимания при использовании этого метода.

jantje
источник
4

Библиотека Arduino-Debug предоставляет простой отладчик для эскизов Arduino. Команды отладки добавляются непосредственно в эскиз. Командная оболочка отладчика запускается на точках останова и утверждениях.

введите описание изображения здесь

На приведенном выше снимке экрана показан пример эскиза, запущенного на Arduino Mega с монитором Serial output, используемым приложением, и Serial1, используемым для оболочки отладчика.

Команды отладки Sketch

  • ASSERT (cond) Проверить состояние подтверждения. Если false, вызывается оболочка отладки. Эскиз не может продолжаться.
  • BREAKPOINT () Вызывается оболочка отладки.
  • BREAK_IF (cond) Оболочка отладки вызывается, если условие истинно.
  • CHECK_STACK (комната) Проверьте, есть ли место (байты) в стеке. Если false, вызывается оболочка отладки.
  • DEBUG_STREAM (dev) Использовать указанное потоковое устройство для сеанса отладки. Типично Serial.
  • НАБЛЮДАТЬ (expr) Распечатать выражение в поток отладки.
  • OBSERVE_IF (cond, expr) Вывести выражение в поток отладки, если условие истинно.
  • REGISTER (var) Зарегистрировать переменную для доступа из оболочки отладки. Команды отладочной оболочки

Команды отладочной оболочки

  • VARIABLE Вывести адрес и значение переменной.
  • @VARIABLE Вывести адрес переменной указателя и значение ссылки.
  • backtrace Печать простого call-стека.
  • команды Распечатать список команд (см. также справку).
  • data Печать содержимого области данных, т.е. глобальных переменных.
  • Перейти Оставить отладочную оболочку и продолжить выполнение эскиза.
  • heap Распечатывает содержимое кучи, т.е. динамически распределяемые данные.
  • help Распечатать список команд.
  • память Печать состояния памяти.
  • выйти Стоп эскиз.
  • stack Выводит содержимое стека, т.е. фреймы вызовов, аргументы, адреса возврата.
  • Переменные Распечатать список зарегистрированных переменных.
  • где Печатать файл исходного кода и строку, где была вызвана отладочная оболочка.

Все команды оболочки отладки могут быть сокращены до односимвольных команд. Пожалуйста, смотрите README для получения дополнительной информации; детали установки, пример эскиза и бенчмаркинг.

Микаэль Патель
источник
1
Пожертвованная библиотека Микаэля позволяет вам устанавливать условные контрольные точки, печатать значения переменных, состояние памяти, трассировки вызовов и проверять и изменять переменные в контрольной точке. Pro: не требует аппаратного обеспечения ($$), не так сильно нагружает Flash (как установка и удаление точек останова с помощью аппаратного отладчика). ....
JRobert
1
.... Con: Более высокое влияние на кодовое пространство программы, некоторое пространство ОЗУ и, возможно, время выполнения, если исследовать критичный по времени код; некоторая кривая обучения для компиляции (а затем и удаления) вызовов библиотеки; необходимость предвидеть точки останова или перекомпилировать их, когда вы обнаружите, где они вам нужны. Минусы не критика работы Микаэля; они приходят с этой техникой.
JRobert
1
@JRobert Хороший Pro-Con резюме! Я попытался устранить некоторые недостатки, позволив настроить отладчик. Существует набор определений, которые позволят чувствительным к занимаемой площади приложениям сократить оболочку отладки до минимума. Как и любой отладчик для встраиваемых систем, сложно отлаживать критичный по времени (непрерывный) код с точками останова. Единственная альтернатива - это точки наблюдения. Их можно оптимизировать с помощью буфера трассировки и удалить последовательный вывод в критичном по времени коде.
Микаэль Патель
3

Не в Arduino IDE.

Тебе следует:

  1. Установите и используйте настоящую IDE, такую ​​как Atmel Studio, и
  2. Используйте полный аппаратный отладчик

Не предусмотрено отладки через интерфейс UART / USB с помощью загрузчика.

Маженко
источник