Отладчик µVision2. Добавление статических переменных в окно отладчика Watch

Александр Бельченко
29 апреля 2003

Я перевел еще часть главы 5 «Отладка программ» из документа GS51.pdf. Я решил опубликовать его до окончания перевода всей 5й главы, поскольку этот материал оказался мне полезен при отладке одной из программ. Эта программа имела многомодульную структуру, причем отдельные модули (обмен данными через UART, опрос кнопок клавиатуры) имели в своем составе статические переменные.

Как вы помните, областью видимости статических переменных является тот модуль или функция, внутри которых они объявлены. Поэтому, если переменная используется только в одном модуле и объявлена как статическая, то я спокойно могу объявить в другом модуле статическую переменную с таким же именем (например, count — в качестве некого счетчика), но это будут две разные переменные. В нескольких модулях можно реализовать похожие алгоритмы (например, обработку каких-то данных в виде конечных автоматов) и использовать похожие имена переменных.

Статические переменные, объявленные в теле функции, сохраняют свое значение между вызовами функции. Умелое использование статических переменных облегчает процесс написания программы и улучшает понимание алгоритма работы.

Ну а как насчет процесса отладки?

Во время отладки необходимо отслеживать состояние тех или иных переменных программы. Локальные переменные текущей функции автоматически отображаются на странице Locals окна отладчика Watch & Call Stack Window. Объявленные внутри функции статические переменные также отображаются в этом окне.

Для отслеживания значений глобальных переменных используются страницы Watch#1 и Watch#2 окна отладчика Watch & Call Stack Window. Переменные для отображения добавляются на эти страницы вручную одним из 3х способов.

Одним из самых простых методов добавления переменной в окно Watch является следующий: выделите в тексте вашей программы имя переменной, затем щелкните по нему правой кнопкой мыши. В открывшемся контекстном меню вы увидите пункт «Add var to Watch Window ...», где var — это имя добавляемой переменной. Выберите страницу (#1 или #2), и переменная появится на соответствующей странице.

Еще одним способом является добавление имени переменной непосредственно в окне Watch. Выделите щелчком мыши строку с подсказкой <type F2 to edit> и нажмите F2. Затем наберите имя переменной.

Третьим способом является использование команды отладчика WATCHSET. Команды отладчика вводятся на странице Command окна Output Window. Для добавления переменной в окно Watch командой WATCHSET (допускается сокращенная форма записи WS) наберите в командной строке следующее:

 WS n,var_name 

где
n — номер страницы Watch (1 или 2), на которую будет добавлена переменная;
var_name — имя добавляемой переменной.

Все три способа хорошо работают для глобальных переменных. Для статических переменных они работают только тогда, когда при отладке вы находитесь в том модуле, внутри которого объявлена эта статическая переменная. Поскольку из других модулей эти переменные не видны, то отладчик не может добавить переменную в окно Watch, если она не входит в область видимости текущего отлаживаемого модуля.

Следствием этого факта будет являться то, что добавленные в окно Watch статические переменные не будут сохраняться между сеансами отладки. По умолчанию в настройках проекта Options — Options for Target на странице Debug установлены опции, разрешающие сохранение точек останова, переменных и выражений в окне Watch, дампов памяти и окна Toolbox (см. поле Restore Debug Session Settings на странице Debug). Восстановление состояния окна Watch производится при запуске отладочной сессии через использование серии команд WATCHSET. Но, как я сказал ранее, статические переменные не могут быть добавлены таким способом из-за правила области видимости.

Решением этой небольшой проблемы является использование полностью указанных имен для статических переменных. Подробно о том, как образуются полные имена для переменных вашей программы, можно прочитать на страницах 118-119 главы 5 документа GS51.pdf (см. также перевод). Для добавления статических переменных вы должны использовать полное имя вида

 \имя_модуля\имя_статической_переменной 

где имя_модуля — это имя модуля, в котором объявлена статическая переменная. Имя модуля совпадает с именем исходного Си-файла без расширения «.с» (см. страницу 118 документа GS51.pdf).

Здесь вы можете взять пример проекта Static для процессора типа 8052 (zip 4кБ), в котором используются статические переменные, и посмотреть, как использовать при отладке полное имя для статических переменных.

Добавления, замечания, уточнения по переводу присылайте по почте.