7 февраля 2013 г.

Точки останова и пошаговое исполнение в GDB Stub-ах

GDB Stub - это маленькая программка (или часть большой программы), которая позволяет отлаживать прошивку МК при помощи GDB без дополнительного оборудования (аппаратных отладчиков, например, J-Link, E1 или любых других). Общение осуществляется через любой последовательный (с точки зрения ПК) интерфейс (обычно UART или TCP). Протокол очень простой. Его описание можно найти в
Debugging with GDB: Appendix E GDB Remote Serial Protocol. Stub должен уметь читать/писать регистры, читать/писать внутреннюю память, устанавливать/убирать точки останова (опционально) и выполнять программу по шагам (тоже опционально). Это минимальный набор необходимых функций. GDB умеет сам устанавливать программные точки останова через запись в память, а шагание по инструкциям умеет эмулировать при помощи точек останова.


Принцип работы с программными точками останова следующий.
Установка:
  1. заменить инструкцию по необходимому адресу на генератор программного прерывания (у МК RX мнемоника BRK, например).
Удаление:
  1. вернуть исходный код операции на место точки останова.
Но самое интересное впереди. Возобновление выполнения программы после попадания на точку останова без её (точки останова) удаления:
  1. уменьшить счётчик PC на размер инструкции BRK;
  2. удалить точку останова;
  3. сделать шаг в одну инструкцию;
  4. установить точку останова на прежнее место;
  5. продолжить выполнение программы.
Одно но: если программные точки останова реализованы для всех поддерживаемых архитектур, то программное шагание - всего лишь для нескольких.

Небольшое дополнение: когда GDB клиент просят установить точку останова, он её сохраняет в списке и не более того. Непосредственное изменение памяти программы происходит перед запуском программы. А после остановки программы, по той или иной причине, все точка останова убираются из памяти, что бы быть установленными перед следующим запуском.

Комментариев нет:

Отправить комментарий