Node:Отладка, Previous:Интерактивный режим, Up:Запуск программы
Интерактивный режим mixvm даёт возможности пошагового выполнения
программ и установки точек останова. Для пошагового выполнения используйте
next. Чтобы выполнить наш пример из двух инструкций hello.mix,
вы можете сделать следующее:
MIX > load hello Program loaded. Start address: 3000 MIX > pc Current address: 3000 MIX > next MIXAL HELLO WORLD Elapsed time: 1 /Total program time: 1 (Total uptime: 1) MIX > pc Current address: 3001 MIX > next End of program reached at address 3002 Elapsed time: 10 /Total program time: 11 (Total uptime: 11) MIX > pc Current address: 3002 MIX > next MIXAL HELLO WORLD Elapsed time: 1 /Total program time: 1 (Total uptime: 12) MIX > MIX > run Running ... ... done Elapsed time: 10 /Total program time: 11 (Total uptime: 22) MIX >
(заметим, что этот пример также показывает, как виртуальная машина обрабатывает накопительную статистику времени и автоматический перезапуск программы).
Установить по заданному адресу точку останова можно командой sbpa
(set breakpoint at address, установить точку останова по адресу). Если
установлена точка останова, run остановится перед выполнением
инструкции по заданному адресу. Новое выполнение run завершит
выполнение программы. Вернёмся к нашему примеру hello world:
MIX > sbpa 3001 Breakpoint set at address 3001 MIX > run Running ... MIXAL HELLO WORLD ... stopped: breakpoint at line 8 (address 3001) Elapsed time: 1 /Total program time: 1 (Total uptime: 23) MIX > run Running ... ... done Elapsed time: 10 /Total program time: 11 (Total uptime: 33) MIX >
Заметьте, что поскольку мы компилировали hello.mixal с отладочной
информацией (флаг -g mixasm), виртуальноая машина может
указать нам строку исходного файла, соответствующую точке останова.
Собственно говоря, можно непосредственно устанавливать точки останова
на строках исходного кода командой sbp НОМЕР_СТРОКИ:
MIX > sbp 4 Breakpoint set at line 7 MIX >
sbp устанавливает точку останова на первой осмысленной строке
исходного кода. Так, в вышеприведённом примере мы потребовали установить
точку останова на строке, не соответствующей инструкции MIX, и она была
установлена на первой строке, содержащей реальную инструкции после
заданной. Чтобы снять точку останова, используйте cbpa АДРЕС
и cbp НОМЕР_СТРОКИ, или cabp чтобы удалить все установленные
точки останова. Вы можете также установить условную точку останова, т.е.
указать mixvm прерывать выполнение программы только когда
меняется значение регистра, ячейки памяти, флага сравнения или триггера
переполнения командами sbp[rmco] (see Команды отладки).
MIXAL позволяет определять символические константы, либо используя
псевдоинструкцию EQU, либо начиная строку инструкции с метки
(что присваивает метке значение текущего адреса памяти). Поэтому с
каждой программой на MIXAL связана таблица символов, которую вы можете
просматривать командой psym. В нашем примере hello world вы
можете получить следующий вывод:
MIX > psym START: 3000 TERM: 19 MSG: 3002 MIX >
Также при отладке полезны команды strace (включающая отслеживание
выполненных инструкций), pbt (выводящая след выполненных инструкций)
и weval (вычисляющая на лету значение w-выражения). Полное описание
всех доступных команд MIX см. в mixvm.
Node:Команды, Next:Устройства, Previous:Вызов, Up:mixvm
Вы можете войти в интерактивный режим виртуальной машины MIX, просто
вызвав mixvm без аргументов. Тогда вы окажетесь в приглашении
оболочки1
MIX >
которое показывает, что новая виртуальная машина была проинициализирована
и готова выполнять команды. Как мы уже упоминали, это командное
приглашение даёт вам все возможности редактирования командной строки,
описанные в руководстве пользователя Readline (скорее всего, вы уже
хорошо знакомы с этими возможностями, поскольку они присутствуют во
многих утилитах GNU, например, оболочке bash)2. В двух словах, readline
даёт возможности дополнения команд клавишей TAB и работы с историей
команд клавишами курсора. Файл истории команд, содержащий последние команды,
введённые в предыдущих сеансах, находится в каталоге конфигурации MDK
(~/.mdk).
Пока вы новичок, вашим лучшим помощником будет команда help,
выводящая обзор всех доступных команд MIX и способов их использования.
Её синтаксис таков:
| help [команда] | команда mixvm |
Вывести краткое описание заданной команды и её использования. Если
команда не указана, help выведет краткое описание всех
доступных команд.
|
Командное приглашение по умолчанию, MIX > может
быть изменено командой prompt (see Команды конфигурирования)
Возможности readline будут доступны, если вы скомпилировали MDK с поддержкой readline, т.е. если GNU readline установлена в вашей системе. Как правило, в системах GNU/Linux и BSD это так.
Node:Ловушки, Next:Дополнительные функции ВМ, Previous:Оболочка mixvm, Up:Описание функций Scheme
Ловушки - это функции, вычисляемые перед выполнением команды mixvm
(или соответствующей функции-оболочки Scheme) или после него, либо
после обнаружения во время выполнения программы MIX обязательной или
условной точки останова. Следующие функции позволяют устанавливать
ловушки:
| mix-add-pre-hook command hook | Function |
Добавляет функцию в список ловушек перед командой, связанных с данной
командой. command - строка, называющая соответствующую
команду mixvm, а hook - функция, принимающая в качестве
единственного аргумента строку-список аргументов команды. Следующий код
Scheme определяет простую ловушку и связывает её с командой run:
(define run-hook
(lambda (args)
(display "argument list: ")
(display args)
(newline)))
(mix-add-pre-hook "run" run-hook)
Ловушки перед командой выполняются в порядке, в котором они были добавлены, перед вызовом соответствующей команды (или связанной с ней функции-оболочки Scheme). |
| mix-add-post-hook command hook | Function |
Добавляет функцию в список ловушек после команды, связанных с
данной командой. Аргументы имеют то же значение, что и в случае
mix-add-pre-hook.
|
| mix-add-global-pre-hook hook | Function |
| mix-add-global-post-hook hook | Function |
Глобальные ловушки перед/после команд выполняются перед/после вызова
любой команды mixvm или функции-оболочки. В этом случае hook
принимает два аргумента: строку с именем вызванной команды и
строку-список её аргументов.
|
| mix-add-break-hook hook | Function |
| mix-add-cond-break hook | Function |
Добавляет функцию-ловушку, выполняемую при обнаружении в ходе выполнения
программы обязательной (соответственно, условной) точки останова.
hook - функция, принимающая два аргумента: номер строки исходного
текста, откуда вызывается ловушка, и текущее значение счётчика программы.
Следующий код показывает пример определения и установки ловушки останова:
(define break-hook
(lambda (line address)
(display "Breakpoint at line ") (display line)
(display " and address ") (display address)
(newline)))
(mix-add-break-hook break-hook)
Функции-ловушки остановов реализованы в Scheme через обычные ловушки
после команды для команд |
См. другие примеры использования функций-ловушек в Функции-ловушки.