А. Ю. Каргашина и А. С. Миркотан под редакцией > Ю. М. Баяковского

Вид материалаКнига

Содержание


Выполнение программы
Jsr pc,@table
Подобный материал:
1   ...   17   18   19   20   21   22   23   24   ...   27

Выполнение программы


Команда ;G сообщает отладчику о том, что нужно передать управление по указанному адресу. Поэтому, если набрать 0,0;G, программа будет выполняться с начального адреса, если только базовый регистр отладчика был правильно установлен, как было показано выше. Однако, как правило, не имеет смысла применять рассматриваемую команду без некоторых предварительных действий, потому что программа просто будет исполнена, как если бы ее запустили без всякого отладчика.

Простой путь эффективного использования команды ;G заключается в проверке работоспособности программы, начиная с некоторой точки. Допустим для иллюстрации, что нам нужно проверить правильность работы программы вывода. Если она начинается с относительного адреса 330, то после занесения в соответствующее место памяти тестовых данных в ответ на приглашение отладчика * вводим 0,330;G. Все же и это не самый эффективный путь использования возможностей ODT, потому что после каждого запуска программа будет «вылетать». Перед запуском с определенного адреса тестируемой программы вы должны быть уверены, что в определенном месте исполнение будет приостановлено. Это достигается включением в программу точек останова. Сначала мы обсудим, как заводить и перемещать точки останова, а потом как ими пользоваться.

Чтобы установить точку останова в заданной ячейке памяти, нужно набрать ее адрес и за ним две литеры: ;B. Отладчик ответит новым приглашением *. Таким путем можно завести до восьми точек с номерами от 0 до 7. Причем, если мы специально не указали номер текущей точки останова, ей автоматически присваивается наименьший из незанятых номеров. К примеру, команда 0,620;6B установит точку останова номер 6 в ячейке 620 программы, если только этот номер уже не был присвоен какой-либо другой точке. Если же он был задан, то его можно убрать, для чего в ответ на приглашение * отладчика нужно набрать команду ;6B, после которой данный номер освобождается. Обратите внимание, что в последней команде не указывается текущий адрес точки останова. Чтобы убрать все точки останова, надо набрать просто ;B.

Если вы забыли, куда поставили какую-то конкретную точку, то наберите $B/, в ответ на что отладчик выдаст адрес точки с нулевым номером. Далее, применяя ↓ , последовательно просмотрите адреса остальных точек.

Заводить или изменять точки останова нужно до запуска программы командой ;G либо после завершения отладчиком выполнения одной из команд ;P (о которых будет сказано ниже) и выхода его на символ *.

Необходимо упомянуть об одном ограничении. Подпрограмма комплекса ODT пересылает содержимое ячеек, в которых устанавливаются точки останова, командой BPT (BreakPoint Trap) и восстанавливает его, когда точки останова удаляются. Следовательно, точку останова нельзя установить в ячейке, на содержимое которой ссылается другая программа. Так, например, если должна выполняться команда JSR PC,@TABLE, то в ячейку TABLE точку останова ставить нельзя. Если же команда имеет вид JSR PC,TABLE, то никакого вреда от точки останова не будет.

Начнем с заведения единственной точки останова по начальному адресу программы, набрав в соответствии со сказанным директиву 0,0;B. После этого запускаем программу директивой 0,0;G. Исполнение команд программы продолжается до тех пор, пока не будет достигнута точка останова, и перед выполнением той команды, на месте которой она стоит, управление передается отладчику.

Поскольку в нашем случае точка останова находится в самом начале, отладчик остановится до выполнения каких бы то ни было команд программы и сообщит нам о том, что происходит, строкой на терминале: B0;0,000000, открывая адрес, по которому прервано исполнение; после этого он будет ждать дальнейших инструкций. Теперь мы можем отлаживать программу покомандно. Прежде всего устанавливаем пошаговый режим командой ;1S. B действительности здесь вместо единицы можно использовать любую цифру, отличную от нуля, однако эту команду надо как-то отличить от аналогичной по написанию команды ;S, о которой речь впереди.

Как только пошаговый режим установлен, инструкцией ;P заставляем отладчик выполнить следующую команду. Если наша программа начинается двухадресной командой, то она будет выполнена и ODT выдаст B8;0,000004, выводя адрес следующей подлежащей исполнению команды. Если только что исполненная команда была командой перехода или условного перехода, условие которого оказалось выполненным, то отладчик выдает адрес точки перехода, как оно и должно быть, так как это адрес следующей исполняемой команды. Обратите внимание, что в пошаговом режиме выдается несуществующая, восьмая точка останова.

На данном этапе отладки можно посмотреть и изменить содержимое любых ячеек памяти, потом инструкцией ;P вызвать исполнение следующей команды и т.д. В любой момент вместо ;P можно набрать ;S, чтобы сбросить пошаговый режим исполнения и далее директивой 0,0;G запустить программу сначала. Установленная нами точка останова сохранится, и все сделанные исправления останутся в силе.

Когда по инструкции ;P адресуются к EMT или TRAP, то не только они, но и вся процедура прерывания, а также еще одна команда основной программы немедленно исполняются. По причинам, которые вам станут ясны, если вы прочитаете гл. 4, существуют трудности в пошаговом исполнении мониторной программы ввода. Лучше ставить останов сразу после обращения к ней.

Если ввести инструкцию n;P, где n — восьмеричное число, то отладчик пропустит n команд программы, прежде чем вернет себе управление.

Другой способ более быстрого продвижения по командам заключается в применении инструкции ;P без введения пошагового режима исполнения (или после отмены его командой ;S). В результате исполнение начнется с последней невыполненной команды и будет продолжаться до тех пор, пока не встретится очередная точка останова. Снова перед выполнением команды в этой точке управление перейдет к отладчику. В промежутке между этими событиями никакая информация выдаваться не будет (если только в самой программе нет операций вывода и не возникнут ошибки, на которые специальная программа отреагирует сообщением об ошибке).

Если внутри отлаживаемого отрезка требуется ввод с терминала, пользователь должен набрать все, что нужно. Будьте внимательны и не вводите данные, когда отладчик ожидает от вас очередную инструкцию, и наоборот.

Для каждой из восьми точек останова отладчик заводит счетчик прохождений. Если точка останова инструкцией адрес;B заводится впервые, то ее счетчик сбрасывается.

Когда в процессе исполнения под управлением ODT точка останова достигается, отладчик проверяет содержимое счетчика. Он уменьшает его на единицу и проверяет, будет ли результат меньше или равен нулю. Если да, то отладчик заносит в счетчик 1, выдает сообщение о попадании в данную точку и ждет дальнейших указаний Если же результат строго положителен, то он возвращает управление программе пользователя. Поэтому для того, чтобы отладчик r раз пропустил заданную точку останова, в ее счетчик нужно заслать число r. Если программа отладки вышла в некоторую точку останова, то командой r;P, где r — восьмеричное число, устанавливается значение счетчика этой точки равным r, а дальнейшее ее действие эквивалентно команде ;P. Заметьте, что команды 1;P и ;P тождественны. Можно устанавливать счетчик прохождений, даже если программа не была остановлена в соответствующей точке. Как было сказано, внутри программы ODT по адресу $В расположен блок из восьми ячеек, в которых хранятся адреса точек останова. Сразу после этого блока находится ячейка, в которую заносится адрес следующей исполняемой команды в пошаговом режиме работы. А после нее идет блок, содержащий счетчики точек останова. Их значения можно установить командами отладчика. Надо только не ошибиться в подсчете числа нажатий клавиши ↓ после того, как была раскрыта ячейка $В.