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 выведет краткое описание всех доступных команд.


Footnotes

  1. Командное приглашение по умолчанию, MIX > может быть изменено командой prompt (see Команды конфигурирования)

  2. Возможности 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 через обычные ловушки после команды для команд next и run. Если вас это удивляет, вы можете посмотреть исходный код Scheme в файле префикс/share/mdk/mixguile-vm-stat.scm (где префикс соответствует корневому каталогу установки, обычно /usr или /usr/local).

См. другие примеры использования функций-ловушек в Функции-ловушки.