






      Министерство приборостроения, средств автоматизации

                      и систем управления






                  Операционная система МОС ВП

                Подсистема разработки программ

                    Символический отладчик

                    Руководство оператора



                       Лист утверждения

                   2б.00152-01 34 07-1-ЛУ

                           Листов 2


                                   Руководитель темы,

                                   Зам. директора ИНЭУМ

                                   ---------------- Хрущев С.Н.

                                   "---"------------1987 г.

                   Представители предприятия-разработчика:

                                   Зав. отделом

                                   ---------------- Нахмансон В.С.

                                   "---"----------- 1987 г.

                                   Зам. зав. отделом

                                   ---------------- Михайлов В.С.

                                   "---"----------- 1987 г.





                             1987


        Перв. примен.                              Литера O
        2б.00152-01



                            - 2 -
 
                   2б.00152-01 34 07-1-ЛУ
 
 
 
 
 
 
 
 
 
                       Представители ИНЭУМ:
 
 
                               Ответственный исполнитель темы
 
                               Зав. отделением
 
                               -------------- Остапенко Г.П.
 
                               "---"--------- 1987 г.
 
                                Нормоконтролер
 
                                --------------
 
                                "---"--------- 1987 г.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 










        Утвержден

        2б.00152-01 34 07-1-ЛУ 















                      Операционная система МОС ВП 

                    Подсистема разработки программ

                        Символический отладчик 

                        Руководство оператора

                        2б.00152-01 34 07-1

                             Листов 309/3К











1K
10K
307K









                                 1987

           Перв. примен.                            Литера O
           2б.00152-01




 
    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                      Операционная система МОС ВП
 
                    Подсистема разработки программ
 
                        Символический отладчик
 
                         Руководство оператора
 
                           00152-01 34 07-1
 
                              Листов 306
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                                 1987
 


                                - 2 -
 
                          00152-01 34 07-1
 
 
 
 
                              АННОТАЦИЯ
 
 
 
 
 
           Данное  руководство  предназначено  для  использования
 
      символического отладчика системы МОС ВП. В документе предс-
 
      тавлены средства,  свойства  и  возможности  отладчика  вне
 
      зависимости от используемых языков программирования.
 
           Документ состоит из двух частей.
 
           В первой части описаны действия оператора по запуску и
 
      организации сеанса отладки. Показаны особенности  работы  с
 
      отладчиком в экранном  и  обычном  (построчном)  режимах  с
 
      использованием символических имен.
 
           Вторая часть содержит описание всех команд отладчика.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


                                - 3 -
 
                          00152-01 34 07-1
 
 
 
 
 
 
                              СОДЕРЖАНИЕ
 
 
 
 
 
      1.  Назначение, условия выполнения программы            11
 
      1.1.  Введение в отладку                                11
 
      1.2.  Особенности отладчика                             13
 
      1.2.1.  Распределение памяти                            14
 
      1.2.2.  Отладка на уровне ассемблирования               14
 
      1.2.3.  Управление выполнением программы                16
 
      1.2.4.  Точки приостанова                               16
 
      1.2.5.  Точки отслеживания                              16
 
      1.2.6.  Точки просмотра                                 17
 
      1.2.7.  Манипулирование ячейками и переменными программы17
 
      1.2.8.  Вычисление выражений                            17
 
      1.2.9.  Файлы регистрации                               18
 
      1.2.10. Командные процедуры                             18
 
      1.2.11. Управляющие структуры                           18
 
      1.2.12. Определение  команд,  функциональных  клавиш   и
 
              символических имен                              19
 
      1.2.13. Отладка в экранном режиме                       19
 
      1.2.14. Отладка в клавишном режиме                      20
 
      1.2.15. Отладка разделяемого образа                     20
 
      1.3.  Общее описание применения                         20
 
      1.3.1.  Вызов отладчика                                 20
 
      1.3.2.  Завершение сеанса отладки                       21
 
      1.3.3.  Управление выводом                              21
 
      1.3.4.  Привилегии и ограничения                        21
 
 


                                - 4 -
 
                          00152-01 34 07-1
 
 
 
      2.  Выполнение программы                                22
 
      2.1.  Начало сеанса отладки                             22
 
      2.1.1.  Компиляция с квалификатором /DEBUG              23
 
      2.1.2.  Компоновка с квалификатором /DEBUG              24
 
      2.1.3.  Запуск отлаживаемой программы                   25
 
      2.1.4.  Команда DEBUG                                   26
 
      2.2.  Приведение отладчика в действие                   28
 
      2.3.  Файлы инициализации отладчика                     29
 
      2.4.  Условия отладки при запуске отладчика             30
 
      2.4.1.  Параметры   отладки,    зависимые    от    языка
 
              программирования                                31
 
      2.4.2.  Независимые от языка параметры отладки          32
 
      2.5.  Файлы регистрации                                 33
 
      2.5.1.  Команда SET OUTPUT и SHOW OUTPUT                35
 
      2.5.2.  Команды SET LOG и SHOW LOG                      36
 
      2.6.  Командные процедуры                               38
 
      2.6.1.  Командные процедуры, создаваемые редактором     40
 
      2.6.2.  Использование  файлов  регистрации  в   качестве
 
              командных процедур                              41
 
      2.7.  Прерывание сеанса отладки                         42
 
      2.7.1.  Управляющие символы CTRL/Y и CTRL/C             44
 
      2.7.2.  Возможные действия после прерывания             44
 
      2.7.3.  Команды SPAWN и ATTACH                          45
 
 
 
      3.  Управление выполнением программы                    46
 
      3.1.  Начало выполнения программы                       46
 
      3.1.1.  Команда STEP                                    46
 
      3.1.1.1.  Команды SET STEP и SHOW STEP                  50
 
      3.1.2.  Команда GO                                      53
 


                                - 5 -
 
                          00152-01 34 07-1
 
 
      3.1.3.  Команда CALL                                    55
 
      3.2.  Временная приостановка выполнения программы       56
 
      3.2.1.  Точки приостанова                               56
 
      3.2.1.1.  Командная    последовательность    в     точке
 
                приостанова                                   60
 
      3.2.2.  Точки приостанова по исключительной ситуации    64
 
      3.2.3.  Точки просмотра                                 67
 
      3.2.3.1.  Ограничения на точки просмотра                71
 
      3.3.  Контроль за выполнением программы                 72
 
      3.3.1.  Точки отслеживания                              72
 
      3.3.1.1.  Отслеживание кодов операций                   75
 
      3.3.2.  Команда SHOW CALLS                              80
 
      3.4.  Взаимосвязанные функции квалификаторов            83
 
      3.4.1.  Квалификаторы, определяющие ячейку программы    83
 
      3.4.2.  Квалификаторы вывода информации                 84
 
      3.5.  Обработчики выхода                                85
 
      3.5.1.  Последовательность    выполнения    обработчиков
 
              выхода                                          85
 
      3.5.2.  Отладка обработчиков выхода                     86
 
      3.5.3.  Просмотр обработчиков выхода                    86
 
 
 
      4.  Символические имена и их интерпретация              87
 
      4.1.  Символическая отладка                             87
 
      4.2.  Используемые отладчиком таблицы символических имен89
 
      4.2.1.  Таблица символических имен отладки              90
 
      4.2.2.  Таблица глобальных символических имен           91
 
      4.2.3.  Таблица текущих символических имен              92
 
      4.3.  Типы символических имен                           95
 
      4.3.1.  Постоянные символические имена отладчика        96
 
      4.3.2.  Символические имена, создаваемые командой DEFINE97


                                - 6 -
 
                          00152-01 34 07-1
 
 
 
      4.3.3.  Программные символические имена                 98
 
      4.3.3.1.  Простые символические имена                   99
 
      4.3.3.2.  Индексированные символические имена           100
 
      4.3.3.3.  Структурные символические имена               102
 
      4.3.3.4.  Символические     имена,     квалифицированные
 
                указателем                                    103
 
      4.4.  Разрешение символического имени на исходном языке 104
 
      4.4.1.  Программный  контекст  об'явлений  символических
 
              имен                                            104
 
      4.4.2.  Глобальные символические имена                  106
 
      4.5.  Разрешение символического имени отладчиком        108
 
      4.5.1.  Спецификация имени пути                         112
 
      4.5.1.1.  Примеры имен пути                             115
 
      4.5.1.2.  Полное и неполное имя пути                    117
 
      4.5.1.3.  Номера вызовов                                119
 
      4.5.2.  Команды SHOW MODULE, SET MODULE и CANCEL MODULE 123
 
      4.5.3.  Команды SET SCOPE, SHOW SCOPE и CANCEL SCOPE    127
 
      4.5.4.  Команда SHOW SYMBOL                             129
 
      4.6.  Отладка разделяемых образов                       130
 
      4.6.1.  Отладка об'ектных модулей                       131
 
      4.6.2.  Отладка неустановленных разделяемых образов     131
 
      4.6.3.  Отладка установленных разделяемых образов       132
 
 
 
      5.  Обращения к ячейкам программы                       134
 
      5.1.  Типы об'ектов отладчика                           134
 
      5.1.1.  Типы адресных выражений                         138
 
      5.2.  Простые адреса                                    139
 
      5.2.1.  Символические обращения                         139
 
      5.2.2.  Номера строк                                    140
 


                                - 7 -
 
                          00152-01 34 07-1
 
 
      5.2.3.  Номера операторов                               141
 
      5.2.4.  Числовые метки                                  142
 
      5.2.5.  Числовые литералы                               144
 
      5.2.6.  Символические имена текущего об'екта            145
 
      5.2.7.  Символические имена логического предшественника 146
 
      5.2.8.  Символическое имя логического преемника         148
 
      5.3.  Адресные выражения                                150
 
      5.3.1.  Операнды                                        150
 
      5.3.2.  Знаки операций                                  151
 
      5.3.3.  Старшинство                                     153
 
      5.3.4.  Команда EVALUATE/ADDRESS                        154
 
 
 
      6.  Просмотр и занесение данных                         155
 
      6.1.  Режимы                                            155
 
      6.1.1.  Режимы основания                                157
 
      6.1.1.1.  Операторы основания                           161
 
      6.1.2.  Символический и несимволический режимы          163
 
      6.2.  Команда EXAMINE                                   164
 
      6.2.1.  Квалификаторы команды EXAMINE                   165
 
      6.2.2.  Просмотр команд программы                       167
 
      6.2.3.  Просмотр списков                                168
 
      6.2.4.  Просмотр диапазонов                             168
 
      6.2.5.  Просмотр последовательных об'ектов              171
 
      6.2.6.  Просмотр значений регистров                     171
 
      6.2.7.  Длинное слово состояния процессора              173
 
      6.3.  Команда DEPOSIT                                   174
 
      6.3.1.  Занесение числовых данных                       175
 
      6.3.2.  Занесение строк кода КОИ-8                      177
 
      6.3.2.1.  Занесение  с  помощью  адресного  выражения  с
 
                типом кода КОИ-8                              177


                                - 8 -
 
                          00152-01 34 07-1
 
 
 
      6.3.2.2.  Занесение  с  помощью  адресного  выражения  с
 
                типом, отличным от кода КОИ-8                 178
 
      6.3.2.3.  Занесение в адресное выражение без типа       178
 
      6.3.3.  Занесение и замена команд СМ 1700               180
 
      6.3.4.  Занесение величин с различными основаниями      182
 
      6.3.5.  Занесение значений в регистры                   184
 
      6.3.5.1.  Занесение значений в длинное  слово  состояния
 
                процессора                                    185
 
      6.4.  Команда EVALUATE                                  187
 
 
 
      7.  Воспроизведение исходного кода                      190
 
      7.1.  Размещение исходных файлов                        191
 
      7.1.1.  Команды SET SOURCE, SHOW SOURCE и CANCEL SOURCE 192
 
      7.1.2.  Пример                                          195
 
      7.2.  Воспроизведение по номеру строки                  197
 
      7.3.  Воспроизведение по адресному выражению            200
 
      7.4.  Воспроизведение во время выполнения программы     203
 
      7.5.  Воспроизведение результатов поиска цепочки        206
 
      7.6.  Параметры воспроизведения исходного кода          213
 
      7.6.1.  Параметры границ                                213
 
      7.6.2.  Параметр максимального числа исходных файлов    217
 
      7.7.  Различия  между  исходным   и   об'ектным   кодом,
 
            обусловленные оптимизацией                        219
 
 
 
      8.  Отладка в экранном режиме                           222
 
      8.1.  Общее описание экранного режима                   222
 
      8.2.  Создание экранных кадров                          224
 
      8.2.1.  Экранные кадры, предопределенные отладчиком     224
 
      8.2.1.1.  Предопределенный кадр SRC                     226
 


                                - 9 -
 
                          00152-01 34 07-1
 
 
      8.2.1.2.  Предопределенный кадр OUT                     227
 
      8.2.1.3.  Предопределенный кадр INST                    229
 
      8.2.1.4.  Предопределенный кадр REG                     231
 
      8.2.2.  Создание новых экранных кадров                  231
 
      8.2.3.  Псевдо-имена кадра                              236
 
      8.3.  Использование экранных кадров                     237
 
      8.3.1.  Использование команды DISPLAY                   238
 
      8.3.2.  Выбор кадров для выходной информации            239
 
      8.3.3.  Прокрутка кадров                                241
 
      8.3.4.  Сохранение кадров                               242
 
      8.4.  Создание определений окна                         243
 
      8.4.1.  Использование окон, определенных отладчиком     243
 
      8.4.2.  Использование определений собственных окон      244
 
      8.5.  Изменение размеров экрана терминала               245
 
      8.6.  Использование клавиш малой  клавиатуры  для  ввода
 
            команд                                            249
 
      8.7.  Пример использования экранного режима             261
 
      8.8.  Пример сеанса отладки в экранном режиме           262
 
      8.8.1.  Пример  кадров  значений  регистров   и   команд
 
              ассемблера                                      282
 
 
 
      9.  Организация отладки                                 288
 
      9.1.  Выделение дополнительной памяти                   288
 
      9.1.1.  Команда ALLOCATE                                289
 
      9.1.2.  Команда SET MODULE/ALLOCATE                     290
 
      9.2.  Использование управляющих структур                293
 
      9.2.1.  Команда FOR                                     294
 
      9.2.2.  Команда IF                                      295
 
      9.2.3.  Команда WHILE                                   296
 
      9.3.  Об'явление параметров командным процедурам        297


                                - 10 -
 
                          00152-01 34 07-1
 
 
 
      9.4.  Определение дополнительных команд                 300
 
      9.5.  Определение клавиш                                301
 
      9.5.1.  Задание определений клавиш                      302
 
      9.5.2.  Использование  определений  клавиш,  назначенных
 
              отладчиком                                      304
 
      9.5.3.  Просмотр определений клавиш                     304
 
      9.5.4.  Удаление определений клавиш                     305
 
 
 
      00152-01 34 07-2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


                                - 10K -
 
                         2б.00152-01 34 07-1
 
 
 
      9.4.  Определение дополнительных команд                 300
 
      9.5.  Определение клавиш                                301
 
      9.5.1.  Задание определений клавиш                      304
 
      9.5.2.  Использование  определений  клавиш,  назначенных
 
              отладчиком                                      304
 
      9.5.3.  Просмотр определений клавиш                     304
 
      9.5.4.  Удаление определений клавиш                     305
 
 
 

      2б.00152-01 34 07-2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


                                - 11 -
 
                          00152-01 34 07-1
 
 
             1. Назначение, условия выполнения программы
 
 
 
           1.1. Введение в отладку
 
 
           Обычная функция программы заключается в преобразовании
 
      ряда входной информации в ряд выходной информации  в  соот-
 
      ветствии с логическими процедурами в этой программе. Ненор-
 
      мальное  функционирование,  такое  как  неправильный  вывод
 
      (выходная информация), преждевременное окончание  программы
 
      или переход в бесконечный цикл, говорит о том, что  имеется
 
      одна или несколько ошибок программирования.
 
           Отладка представляет собой процесс  нахождения  ошибок
 
      программирования  в  успешно  скомпилированной   программе,
 
      которая  неверно  ведет  себя  при  прогоне.  Символический
 
      отладчик системы МОС ВП (или просто отладчик) является спе-
 
      циальной программой, которая помогает пользователю находить
 
      такие ошибки программирования. Символическая отладка  озна-
 
      чает отладку с использованием для обращения к ячейкам памя-
 
      ти  символических  имен,  а  не  виртуальных  адресов.  Для
 
      интерпретации символических имен отладчик  должен  иметь  о
 
      них соответствующую информацию (в форме символьных записей)
 
      в выполняемом образе во время прогона. Об этом  более  под-
 
      робно сказано в разделе 4.
 
           После проверки своей программы на опечатки или синтак-
 
      сические ошибки, которые могли быть не обнаружены  компиля-
 
      тором, пользователь  должен  сформулировать  план  отладки,
 
      основываясь на выявленном  в  результате  прогона  неверном
 
      поведении программы.
 
           Аварийное окончание программы предполагает либо  логи-
 
      ческую ошибку, либо ошибку, вызванную какими-либо  окружаю-
 


                                - 12 -
 
                          00152-01 34 07-1
 
 
      щимими условиями. Так как аварийное окончание обычно проис-
 
      ходит сравнительно скоро после  вызвавшей  его  ошибки,  то
 
      удобным способом подхода к нахождению ошибки является  отс-
 
      леживание программы в обратном направлении от точки оконча-
 
      ния. С помощью  отладчика  пользователь  может  просмотреть
 
      выходные данные программы в  точках,  расположенных  непос-
 
      редственно перед точкой окончания. Таким образом, он  может
 
      локализовать ошибку, которая  вызвала  аварийное  окончание
 
      программы.
 
           Метод обратного отслеживания не  всегда  эффективен  в
 
      тех случаях, когда ошибка вызывает  переход  в  бесконечный
 
      цикл или тогда, когда ошибка указателя заводит программу  в
 
      неправильную ячейку или область. В таких случаях  программ-
 
      ный вывод, найденный при останове программы, не несет ника-
 
      кой полезной информации. Здесь лучшим методом является отс-
 
      леживание в прямом направлении. С помощью отладчика пользо-
 
      ватель может продвигаться по программе заранее определенны-
 
      ми шагами, просматривая ключевые ячейки по мере этого прод-
 
      вижения. При обнаружении неверного результата  пользователь
 
      может локализовать вызвавшую его ошибку.
 
           После  выявления  ошибок   пользователь   корректирует
 
      исходную программу, затем компилирует  (или  ассемблирует),
 
      компонует и ставит на выполнение исправленную версию  своей
 
      программы.
 


                                - 13 -
 
                          00152-01 34 07-1
 
 
           1.2. Особенности отладчика
 
 
           Отладчик представляет собой  гибкий,  универсальный  и
 
      мощный инструмент, который предназначен для помощи  пользо-
 
      вателю в нахождении ошибок в его исходной программе.
 
           Отладчик  -  это  диалоговая  программа.  Пользователь
 
      задает выполнение команд отладчика со  своего  терминала  и
 
      сразу же видит их действие.
 
           Отладчик является  символическим.  Пользователь  может
 
      обращаться к ячейкам  программы  по  символическим  именам,
 
      которые применены для этих ячеек в программе.
 
           Отладчик обеспечивает отладку программ, написанных  на
 
      различных языках программирования.  Программист  использует
 
      отладчик с языком своей исходной программы. Если  программа
 
      написана на нескольких языках, то можно переходить от одно-
 
      го языка к другому в процессе сеанса отладки.
 
           Отладчик позволяет применять различные  формы  и  типы
 
      данных для ввода и вывода. По умолчанию исходный язык прог-
 
      раммы определяет формат, используемый для  ввода  и  вывода
 
      данных. Пользователь может также применять и другие форматы
 
      данных. Например, содержимое ячейки  программы  может  быть
 
      введено или выведено в шестнадцатеричной, восьмеричной  или
 
      десятичной форме (т.е. с соответствующими основаниями).
 
           Отладчик обеспечивает  пользователю  помощь  во  время
 
      работы. Когда пользователь вводит с клавиатуры слово  HELP,
 
      отладчик отвечает выводом списка команд  и  соответствующих
 
      средств, относительно которых пользователь  может  получить
 
      справочную информацию в процессе отладки.
 
           Отладчик обеспечивает в  процессе  работы  возможность
 
      воспроизводить строки с исходными кодами программы для язы-
 


                                - 14 -
 
                          00152-01 34 07-1
 
 
      ков, позволяющих это делать. Другими словами, он  позволяет
 
      выборочно отображать операторы языка  программирования,  из
 
      которых состоит программа.
 
           Отладчик имеет экранный режим работы,  который  позво-
 
      ляет вести отладку с использованием составных окон.
 
           Отладчик позволяет определять функции клавиш  дополни-
 
      тельной (малой) клавиатуры.
 
 
 
           1.2.1. Распределение памяти
 
 
           Отладчик позволяет пользователю  разделять  предостав-
 
      ленную ему виртуальную  память  между  своей  программой  и
 
      отладчиком. Пользователь может также  потребовать  дополни-
 
      тельную память для отладки своей программы. Более детальная
 
      информация об этом приведена в описании команд  ALLOCATE  и
 
      MODULE/ALLOCATE.
 
 
 
           1.2.2. Отладка на уровне ассемблирования
 
 
           Отладка на уровне ассемблирования может включать  сле-
 
      дующие варианты:
 
           - рассмотрение программных данных, как если бы они  не
 
      имели соответствующих генерируемых компилятором типов;
 
           - интерпретация программных данных в восьмеричной  или
 
      шестнадцатеричной форме, а не с десятичным основанием,  так
 
      как эти основания более точно отражают конфигурацию битов в
 
      адресах виртуальной памяти;
 
           - обращение  к  данным  с  использованием  виртуальных
 
      адресов вместо символических имен;
 
           - обращение к ячейкам программы по виртуальным адресам
 
      или смещениям относительно программных меток;


                                - 15 -
 
                          00152-01 34 07-1
 
 
           - просмотр  и  манипулирование   содержимым   об'ектов
 
      машинного уровня (например, регистров);
 
           - управление и контроль за  выполнением  программы  по
 
      командам, а не по строкам;
 
           - просмотр, занесение и замена команд.
 
           Если необходимо отлаживать программу на языке высокого
 
      уровня (или программу на языке МАКРО  системы  МОС  ВП)  на
 
      уровне ассемблирования,  то  можно  использовать  следующие
 
      средства отладчика:
 
           - различные  типы,  в  которых  можно   воспроизводить
 
      содержимое виртуальных адресов памяти;
 
           - режимы восьмеричного и шестнадцатеричного оснований,
 
      в которых можно интерпретировать  содержимое  адресов  вир-
 
      туальной памяти;
 
           - несимволический режим, при котором можно  транслиро-
 
      вать любое символическое имя в его числовой эквивалент;
 
           - постоянные символические имена отладчика, с  помощью
 
      которых можно обращаться к машинным регистрам;
 
           - команду STEP/INSTRUCTION, которая позволяет просмат-
 
      ривать каждую команду уровня ассемблирования в программе  в
 
      процессе ее выполнения;
 
           - команды SET TRACE/CALL и SET  TRACE/BRANCH,  которые
 
      позволяют отслеживать последовательность  выполнения  прог-
 
      раммы путем контроля всех команд, изменяющих обычную после-
 
      довательность выполнения программы.
 


                                - 16 -
 
                          00152-01 34 07-1
 
 
           1.2.3. Управление выполнением программы
 
 
           Во время отладки пользователь может управлять выполне-
 
      нием программы. Команда GO начинает или продолжает выполне-
 
      ние программы. Программа выполняется вплоть  до  достижения
 
      точки приостанова, до модификации точки просмотра, до обна-
 
      ружения исключительной ситуации или до окончания программы.
 
           Команда STEP начинает или продолжает выполнение  прог-
 
      раммы, но выполняется только такое  количество  инструкций,
 
      строк или операторов, какое было  указано  пользователем  в
 
      параметре данной команды. Если пользователь не указывает  с
 
      данной командой никаких параметров, то используется величи-
 
      на по умолчанию.
 
 
 
           1.2.4. Точки приостанова
 
 
           Путем установки точек приостанова  пользователь  может
 
      временно приостановить  выполнение  программы  в  указанных
 
      ячейках. После этого он  может  проверить  состояние  своей
 
      программы, используя команды отладчика.
 
 
 
           1.2.5. Точки отслеживания
 
 
           Устанавливая точки  отслеживания,  пользователь  может
 
      отслеживать последовательность выполнения программы.  Когда
 
      приводится в действие точка отслеживания в программе  поль-
 
      зователя, отладчик  мгновенно  приостанавливает  выполнение
 
      программы, сообщает  о  достижении  точки  отслеживания,  а
 
      затем продолжает выполнение программы.
 


                                - 17 -
 
                          00152-01 34 07-1
 
 
           1.2.6. Точки просмотра
 
 
           Установкой точки просмотра пользователь может  обеспе-
 
      чить останов программы в  случае  модификации  определенной
 
      переменной или другой области памяти. При приведении  точки
 
      просмотра в действие в программе пользователя отладчик вре-
 
      менно  приостанавливает  выполнение  и  сообщает  о  ячейке
 
      (области) модифицированной переменной, приводит исходную  и
 
      измененную величины этой переменной,  а  также  инструкцию,
 
      которая вызвала это изменение.
 
 
 
           1.2.7. Манипулирование    ячейками    и    переменными
 
      программы
 
 
           Применяя команду EXAMINE, пользователь  может  опреде-
 
      лить величину переменной или  ячейки  программы.  Используя
 
      команду DEPOSIT, пользователь может изменить эту  величину.
 
      После этого можно продолжить выполнение программы для  наб-
 
      людения воздействия этого изменения на  процесс  выполнения
 
      программы без необходимости повторного компилирования, пов-
 
      торной компоновки или повторного запуска программы.
 
 
 
           1.2.8. Вычисление выражений
 
 
           При помощи команды EVALUATE можно  вычислять  значения
 
      выражений исходного языка (эти выражения могут быть арифме-
 
      тическими, битовыми цепочками или алгебраическими), а также
 
      адресных выражений.
 


                                - 18 -
 
                          00152-01 34 07-1
 
 
           1.2.9. Файлы регистрации
 
 
           По запросу пользователя отладчик  может  записывать  в
 
      файле регистрации как команды, которые вводятся пользовате-
 
      лем во время сеанса отладки, так и ответы отладчика на  эти
 
      команды. Можно использовать файлы регистрации для  хранения
 
      операций, выполненных в процессе отладки, а также в качест-
 
      ве командных процедур при последующих сеансах отладки.
 
 
 
           1.2.10. Командные процедуры
 
 
           Командная процедура  представляет  собой  файл  команд
 
      отладчика, который выполняется отладчиком по запросу  поль-
 
      зователя. Пользователь может создать командную процедуру  с
 
      помощью редактора текста, а также может применить для этого
 
      файл регистрации отладчика.  Можно  использовать  командные
 
      процедуры для повторного создания сеанса отладки, для  про-
 
      должения предыдущего сеанса или для сохранения определенных
 
      команд отладчика с целью их многократного  использования  в
 
      течение сеанса отладки.
 
 
 
           1.2.11. Управляющие структуры
 
 
           Отладчик обеспечивает в командах логические  управляю-
 
      щие структуры, которые позволяют  управлять  последователь-
 
      ностью выполнения командного файла отладчика. Эти структуры
 
      включают команды FOR, IF и WHILE.
 


                                - 19 -
 
                          00152-01 34 07-1
 
 
           1.2.12. Определение команд,  функциональных  клавиш  и
 
      символических имен
 
 
           С помощью команды  DEFINE/COMMAND  пользователь  может
 
      создавать  свои  собственные  команды  отладчика.  По  этой
 
      команде строка символов (команда пользователя)  связывается
 
      с символическим именем. Отладчик обрабатывает это  имя  как
 
      команду до конца сеанса отладки.
 
           Подобным  же  образом  отладчик  позволяет  определять
 
      функции клавиш малой клавиатуры терминала с помощью команды
 
      DEFINE/KEY. Эта команда позволяет связывать строку символов
 
      (команду пользователя) с клавишей. В дальнейшем, при  нажа-
 
      тии определенной таким образом клавиши, выполняется команда
 
      пользователя. Определение клавиши действует до конца сеанса
 
      отладки.
 
           Отладчик позволяет также либо создавать новые символи-
 
      ческие имена, либо изменять значение существующих. Это осу-
 
      ществляется с помощью команды DEFINE.
 
 
 
           1.2.13. Отладка в экранном режиме
 
 
           Экранный режим является средством отладчика, позволяю-
 
      щим наблюдать выходную информацию отладчика в виде кадра на
 
      экране в отличии от обычного построчного вывода. Экран тер-
 
      минала можно также разделить на  части  (области)  и  таким
 
      образом отображать различные данные в разных частях.
 


                                - 20 -
 
                          00152-01 34 07-1
 
 
           1.2.14. Отладка в клавишном режиме
 
 
           Клавишный режим - это  еще  одно  средство  отладчика,
 
      позволяющее использовать для ввода малую клавиатуру.  Поль-
 
      зователь может использовать значения  клавиш,  определяемые
 
      отладчиком по умолчанию, или определить свои собственные.
 
 
 
           1.2.15. Отладка разделяемого образа
 
 
           Отладчик  позволяет  отлаживать   разделяемые   образы
 
      (образы, которые напрямую не выполнимы). Разделяемый  образ
 
      рассматривается как модуль, который может  быть  установлен
 
      командой SET MODULE, после чего можно обращаться к его сим-
 
      волическим именам.
 
 
 
           1.3. Общее описание применения
 
 
           1.3.1. Вызов отладчика
 
 
           В общем случае для  вызова  отладчика  необходимо  при
 
      компиляции (или  ассемблировании)  и  компоновке  программы
 
      указать квалификатор /DEBUG. Этот квалификатор  можно  ука-
 
      зать и с командой RUN.
 
           Более того, можно вызвать отладчик во время выполнения
 
      программы, прервав ее выполнение  выдачей  CTRL/Y  и  введя
 
      затем команду DEBUG (после  выдачи  запроса  интерпретатора
 
      DCL). После ввода команды DEBUG отладчик выдает на терминал
 
      информационное сообщение и подсказку DBG>.
 


                                - 21 -
 
                          00152-01 34 07-1
 
 
           1.3.2. Завершение сеанса отладки
 
 
           Завершить отладку можно командой EXIT или CTRL/Z.  Оба
 
      способа вызывают на выполнение обработчик завершения работы
 
      отладчика.
 
           Завершить сеанс отладки можно и таким образом: прервав
 
      работу командой CTRL/Y или CTRL/C,  выдать  соответствующую
 
      команду языка DCL.
 
 
 
           1.3.3. Управление выводом
 
 
           Пользователь  может  управлять  выводом  отладчика   с
 
      помощью команды SET OUTPUT.
 
           Для ввода информации из файла или с другого  терминала
 
      можно использовать логическое  имя  DBG$INPUT.  Для  вывода
 
      информации отладчика в файл или на  другой  терминал  можно
 
      использовать логическое имя DBG$OUTPUT. (Заметим,  что  для
 
      назначения другого терминала может потребоваться привилегия
 
      BYPASS).
 
 
 
           1.3.4. Привилегии и ограничения
 
 
           Единственной привилегией, которую должен иметь пользо-
 
      ватель для отладки файла, является выполнение привилегии на
 
      этот файл.
 
           Однако существуют два ограничения:
 
           1) нельзя компоновать файл, планируемый для  работы  с
 
      отладчиком, с квалификатором /NOTRACE компоновщика;
 
           2) отлаживать программу можно только в режиме  пользо-
 
      вателя. В  режимах  супервизора,  исполнительном  или  ядра
 
      отлаживать нельзя. Если необходима отладка в режиме, отлич-
 


                                - 22 -
 
                          00152-01 34 07-1
 
 
      ном от режима пользователя, то следует обратиться к утилите
 
      DELTA/XDELTA.
 
 
 
 
                       2. Выполнение программы
 
 
 
           Отладчик можно вызвать двумя способами.
 
           Если программа еще не запускалась,  то  можно  указать
 
      квалификатор   /DEBUG   либо   при   компоновке   программы
 
      (LINK/DEBUG), либо при ее запуске (RUN/DEBUG).
 
           С другой стороны,  если  программа  уже  запущена  без
 
      отладчика, то можно прервать ее выполнение нажатием клавиши
 
      CTRL/Y и затем выдать команду DEBUG диалогового  командного
 
      языка (DCL).
 
 
 
           2.1. Начало сеанса отладки
 
 
           При запуске программы на  выполнение  под  управлением
 
      отладчика ее можно отлаживать символически, применяя симво-
 
      лические имена, использованные  в  исходном  тексте  данной
 
      программы.
 
           Отладка в символической форме возможна из-за того, что
 
      отладчик использует таблицу символических имен, которую  он
 
      хранит в файле выполняемого образа (EXE).  Часть  указанной
 
      таблицы - таблица символических имен  отладки  (DST)-  соз-
 
      дается компилятором или ассемблером. Другая часть - таблица
 
      глобальных   символических   имен   (GST)    -    создается
 
      компоновщиком. Указывая квалификатор /DEBUG при  компиляции
 
      и компOновке, пользователь управляет созданием этих таблиц.
 
           В целом,  если  пользователь  намерEвается  отлаживать
 
      свою программу, ему следует указывать квалификатор /DEBUG и


                                - 23 -
 
                          00152-01 34 07-1
 
 
      при компиляции, и  при  компоновке.  Таблица  символических
 
      имен, созданная компилятором, обрабатывается компоновщиком,
 
      поэтому при прогоне программы пользователь  может  получить
 
      полную информацию о таблице символических имен.
 
           Приводимый пример иллюстрирует начало сеанса  отладки,
 
      во время которого пользователь может использовать всю  сим-
 
      волическую информацию программы MEANSUB:
 
       $ BASIC/DEBUG MEANSUB
 
       $ LINK/DEBUG MEANSUB
 
       $ RUN MEANSUB
 
                         M32 SM DEBUG версия *****
 
       %DEBUG-I-INIтIAL, LANGUAGE IS BASIC, MODULE
 
                         SET TO 'MEANSUB$MAIN'
 
       DBG>
 
           Надо отметить, что не следует  указывать  квалификатор
 
      /DEBUG в команде RUN, если он был указан  в  команде  LINK.
 
      Однако, если необходимо запустить программу без  отладчика,
 
      а при компOновке был указан квалификатор /DEBUG, то следует
 
      указать с командой RUN квалификатор /NODEBUG.
 
           Уже отлаженную  программу  можно  перекомпилировать  и
 
      перекомпоновать без создания  таблицы  символических  имен.
 
      Таким образом можно уменьшить  размер  и  об'ектного  файла
 
      (OBJ), и файла образа (EXE).
 
 
 
           2.1.1. Компиляция с квалификатором /DEBUG
 
 
           При указании квалификатора /DEBUG при компиляции  соз-
 
      дается таблица символических имен отладки (DST), содержащая
 
      информацию как о  символических  именах,  использованных  в
 
      программе, так и о номерах строк. Поэтому его использование
 


                                - 24 -
 
                          00152-01 34 07-1
 
 
      при компиляции отлаживаемой программы всегда желательно.
 
           Если квалификатор /DEBUG не указан при компиляции,  то
 
      информация об именах локальных переменных в таблицу  симво-
 
      лических имен не включается. Однако компилятор еще содержит
 
      информацию об именах подпрограмм и номерах  строк,  поэтому
 
      можно получить символическую информацию отслеживания,  если
 
      программа завершается грубой ошибкой.
 
           Если формирование таблицы символических имен  (включая
 
      информацию отслеживания)  не  нужно,  то  можно  указать  в
 
      команде компиляции квалификатор /DEBUG=NONE.
 
 
 
           2.1.2. Компоновка с квалификатором /DEBUG
 
 
           При указании квалификатора /DEBUG компоновщик  создает
 
      таблицу глобальных символических имен (GST) с именами  всех
 
      глобальных данных  программы.  Компоновщик  подключает  все
 
      таблицы символических имен, созданные компилятором. И нако-
 
      нец, компоновщик выставляет флаг в файле образа,  указываю-
 
      щий,  что  программа  должна  выполняться  под  управлением
 
      отладчика.
 
           Если квалификатор /DEBUG  не  был  указан  с  командой
 
      LINK, то компоновщик включает только информацию,  необходи-
 
      мую для  символического  отслеживания.  Флаг  о  выполнении
 
      программы под управлением отладчика не выставляется.
 
           Можно отменить  генерацию  таблиц  символических  имен
 
      (включая информацию отслеживания), если указать  квалифика-
 
      тор /NOTRACE в команде LINK. В таком случае нельзя  исполь-
 
      зовать для отладки программы отладчик.
 


                                - 25 -
 
                          00152-01 34 07-1
 
 
           2.1.3. Запуск отлаживаемой программы
 
 
           Для управления запуском программы командой  RUN  можно
 
      использовать квалификаторы  /DEBUG  и  /NODEBUG.  Если  при
 
      запуске необходимо передать  управление  отладчику,  а  при
 
      компоновке не был задан квалификатор /DEBUG, TO  необходимо
 
      указать команду RUN/DEBUG. В этом  случае,  однако,  нельзя
 
      вести  отладку  с  использованием  локальных  символических
 
      имен.
 
           Если отладчик не требуется, а при компоновке был  ука-
 
      зан квалификатор /DEBUG, то при запуске можно указать  ква-
 
      лификатор /NODEBUG.
 
           В табл.1 приведена символическая информация, доступная
 
      в выполняемом образе при указании квалификатора /DEBUG  при
 
      компиляции, компоновке и при запуске программы.
 
                                                        Таблица 1
 
          Символическая информация и квалификатор /DEBUG
 
      -----------------------------------------------------------
       Квалификатор         !Квалифи-!Квалифи-! Доступная
                            !        !        !
       компилятора          !катор   !катор   !символическая
                            !        !        !
       (Ассемблера)         !компо-  !команды !информация
                            !        !        !
                            !новщика !RUN     !
      -----------------------------------------------------------
                -           !    -   ! /DEBUG !  отслеживания
                            !        !        !
      /DEBUG или /DEBUG=ALL !    -   ! /DEBUG !  отслеживания
                            !        !        !
      /NODEBUG или /DEBUG=  !        ! /DEBUG !  нет
      NONE                  !        !        !
                            !        !        !
      /DEBUG=TRACEBACK или  !    -   ! /DEBUG !  отслеживания
                            !        !        !
      =(TRACEBACK,NOSYMBOLS)!        !        !
                            !        !        !
                -           ! /DEBUG !    -   !  отслеживания,
                            !        !        !
                            !        !        ! глобальные симво-
                            !        !        !
                            !        !        ! лические имена
                            !        !        !


                                - 26 -
 
                          00152-01 34 07-1
 
 
                                              Продолжение табл. 1
      -----------------------------------------------------------
       Квалификатор         !Квалифи-!Квалифи-! Доступная
                            !        !        !
       компилятора          !катор   !катор   !символическая
                            !        !        !
       (Ассемблера)         !компо-  !команды !информация
                            !        !        !
                            !новщика !RUN     !
      -----------------------------------------------------------
      /DEBUG или /DEBUG=ALL ! /DEBUG !    -   !  локальные симво-
                            !        !        !
                            !        !        ! ческие имена,
                            !        !        !
                            !        !        ! глобальные симво-
                            !        !        !
                            !        !        ! лические имена,
                            !        !        !
                            !        !        ! отслеживание
                            !        !        !
      /NODEBUG или          ! /DEBUG !    -   !  глобальные сим-
                            !        !        !
      /DEBUG=NONE           !        !        ! волические имена
                            !        !        !
      /DEBUG=TRACEBACK      ! /DEBUG !    -   !  отслеживания,
                            !        !        !
      или =(TRACEBACK,      !        !        ! глобальные симво-
                            !        !        !
      NOSYMBOLS)            !        !        ! лические имена
 
 
           2.1.4. Команда DEBUG
 
 
           Если программа пользователя выполняется не под  управ-
 
      лением отладчика, а  вызов  его  требуется,  то  необходимо
 
      выполнить действия:
 
           - прервать выполняемую программу вводом команды CTRL/Y
 
      с клавиатуры;
 
           - выдать команду DEBUG.
 
           После ввода команды DEBUG отладчик выдает информацион-
 
      ное сообщение и подсказку DBG>, указывая о своей готовности
 
      к приему команд отладчика.
 
           Команду DEBUG особенно удобно использовать в случаях:
 
           - если программа перешла в бесконечный цикл. После  ее
 
      прерывания и ввода команды DEBUG можно отлаживать эту прог-
 
      рамму для определения причины бесконечного цикла;


                                - 27 -
 
                          00152-01 34 07-1
 
 
           - когда пользователь ввел команду RUN/NODEBUG, но поз-
 
      же решил, что ему требуется отладчик;
 
           - когда пользователь не  указал  квалификатор  команды
 
      /DEBUG во время компилирования, во время компоновки или  во
 
      время запуска, но хочет отладить  свою  программу.  Следует
 
      отметить, что в такой ситуации большая часть  символической
 
      информации не доступна для отладчика, поэтому  пользователь
 
      должен применять для обращения к программе и к  ее  ячейкам
 
      данных адреса виртуальной памяти, а не символические имена.
 
           После прерывания своей программы и ввода команды DEBUG
 
      пользователь не знает,  на  какой  именно  инструкции  была
 
      прервана  его  программа.  Для  определения  этого  следует
 
      использовать команду SHOW CALLS.
 
           Следует отметить, что можно вводить некоторые  команды
 
      диалогового командного языка (DCL) после  прерывания  своей
 
      программы и по-прежнему иметь возможность запуска отладчика
 
      путем ввода команды DEBUG (п. 2.7.2).
 
           Приводимый пример показывает, как можно прервать прог-
 
      рамму и запустить отладчик с  помощью  команды  DEBUG.  При
 
      этом следует отметить, что управляющие символы CTRL/Y отоб-
 
      ражаются как ^Y:
 
      $ RUN PROG
 
      ^Y
 
      $ DEBUG
 
                      M32 SM DEBUG версия 1.0
 
      %DEBUG-I-INITIAL, LANGUAGE IS COBOL, MODULE SET TO
 
                          'INVENTORY'
 
      DBG>
 


                                - 28 -
 
                          00152-01 34 07-1
 
 
           2.2. Приведение отладчика в действие
 
 
           Отладчик является разделяемым образом, который перено-
 
      сится системой МОС  ВП  в  адресное  пространство  процесса
 
      пользователя, когда элемент SYS$IMGSTA  является  первым  в
 
      массиве адресов передачи.  Этот  элемент  является  первым,
 
      когда пользователь определяет одну из следующих  комбинаций
 
      команд DCL в процессе разработки программы:
 
           - LINK/DEBUG без RUN/NODEBUG;
 
           - RUN/DEBUG (если не указано LINK/NOTRACEBACK);
 
           - DEBUG после прерывания программы  (если  не  указано
 
      LINK/NOTRACEBACK).
 
           Если квалификатор /NOTRACEBACK определен во время ком-
 
      поновки, компоновщик не  генерирует  таблицу  символических
 
      имен отладки (DST). Так как таблица DST должна быть доступ-
 
      на для выполнения отладчика, указание  этого  квалификатора
 
      во  время  компоновки  запрещает  отладку  соответствующего
 
      образа независимо от того, какие другие квалификаторы  ука-
 
      заны или не указаны во время компоновки или запуска.
 
           При запуске, при условии выдачи любой из упомянутых  в
 
      подразделе 2.2 комбинаций команд  DCL,  компонента  системы
 
      МОС ВП SYS$IMGSTA  отображает  отладчик  (т.е.  разделяемый
 
      образ DEBUG.EXE) в старшие адреса области P0 рядом с  обра-
 
      зом задачи пользователя и передает управление отладчику.
 
           Когда отладчик получает управление, он  инициализирует
 
      часть адресного пространства рядом с образом отладчика тре-
 
      мя таблицами  символических  имен:  таблицей  символических
 
      имен отладки (DST), таблицей глобальных символических  имен
 
      (GST) и таблицей текущих символических имен (RST)
 


                                - 29 -
 
                          00152-01 34 07-1
 
 
      (подраздел 4.2).
 
           На рис. 1 показано распределение виртуального адресно-
 
      го пространства процесса, в котором  программа  выполняется
 
      под управлением отладчика.
 
 
                          Адресное пространство процесса
 
            Младшие  I---------------------------------------I
                     I                                       I
            адреса   I        Программа пользователя         I
                     I                                       I
                     I              (PROG.EXE)               I
                     I                                       I
                     I---------------------------------------I
                     I                                       I
                     I               Отладчик                I
                     I                                       I
                     I              (DEBUG.EXE)              I
                     I                                       I
                     I---------------------------------------I
                     I                                       I
                     I Таблица символических имен отладки    I
                     I                                       I
                     I                 (DST)                 I
                     I                                       I
                     I---------------------------------------I
                     I                                       I
                     I Таблица глобальных символических имен I
                     I                                       I
                     I                 (GST)                 I
                     I                                       I
                     I---------------------------------------I
                     I                                       I
                     I  Таблица текущих символических имен   I
                     I                                       I
            Старшие  I                 (RST)                 I
                     I                                       I
            адреса   I---------------------------------------I
 
                                Рис. 1
 
 
 
           2.3. Файлы инициализации отладчика
 
 
           Файлы инициализации отладчика содержат команды,  кото-
 
      рые всегда выдаются пользователем после обращения к  отлад-
 
      чику. Тогда каждый раз при вызове  отладчика  пользователем
 
      эти команды выполняются автоматически.
 
           Например, пользователь может  иметь  файл,  содержащий


                                - 30 -
 
                          00152-01 34 07-1
 
 
      следующие команды:
 
       SET SOURCE DISK $
 
       SET STEP LINE, SOURCE
 
       SET MODULE/ALL
 
       SET LANGUAGE FORTRAN
 
       SET OUTPUT LOG,VER
 
       SET LOG LINK.LOG
 
       DEFINE/COMMAND W="@WALK_LINK_LIST.COM"
 
           Чтобы сделать этот файл файлом инициализации  отладчи-
 
      ка, используется команда DEFINE:
 
       $ DEFINE DBG$INIT[JONES.DBGDIR]DEBUG.INI
 
           Отладчик выполнит команды этого файла до выдачи запро-
 
      са DBG>, как показано в примере:
 
                       M32 SM DEBUG версия *****
 
       %DEBUG-I-INITIAL, LANGUAGE IS BASIC, MODULE SET TO
 
       'MEANSUB&MAIN'
 
       SET LOG LINK.LOG
 
       DEFINE/COMMAND W="0WALK_LINK_LIST.COM"
 
       %DEBUG-I-VERIFYICF, EXITING INDIRECT COMMAND FILE
 
       "DBG$INIT"
 
       DBG>
 
 
 
           2.4. Условия отладки при запуске отладчика
 
 
           В начале работы (т.е. при запуске) отладчик  воспроиз-
 
      водит информационное сообщение в следующем формате:
 
                       M32 SM DEBUG версия (номер)
 
       %DEBUG-I-INITIAL, LANGUAGE IS XXX, MODULE SET TO YYY
 
       DBG>
 
           Первая строка данного сообщения определяет номер  вер-
 


                                - 31 -
 
                          00152-01 34 07-1
 
 
      сии программного обеспечения отладчика.  Во  второй  строке
 
      содержится информация относительно  инициализации,  которая
 
      указывает текущий язык (XXX) и программный модуль (YYY).  В
 
      третьей строке содержится подсказка отладчика DBG>.
 
 
 
           2.4.1. Параметры   отладки,   зависимые    от    языка
 
      программирования
 
 
           Параметры отладки оказывают влияние на то, как  отлад-
 
      чик будет интерпретировать команды и воспроизводить резуль-
 
      таты выполнения команд.
 
           В начале работы  отладчик  устанавливает  значение  по
 
      умолчанию для каждого параметра отладки. Эти значения могут
 
      быть воспроизведены с помощью соответствующей команды SHOW,
 
      могут быть изменены с помощью соответствующей команды  SET,
 
      а в  некоторых  случаях  могут  быть  и  отменены  командой
 
      CANCEL.
 
           Значения по  умолчанию  некоторых  параметров  отладки
 
      могут меняться в зависимости от используемого в данное вре-
 
      мя языка программирования. Это означает, что  устанавливае-
 
      мый параметр может иметь по умолчанию одно  значение,  если
 
      текущим языком является БЭЙСИК, или другое  значение,  если
 
      текущим языком является МАКРО. Такие  параметры  называются
 
      зависимыми от языка параметрами отладки.
 
           Зависимыми от языка параметрами отладки являются  сле-
 
      дующие:
 
           - MODE (режим);
 
           - RADIX (основание системы счисления);
 
           - STEP (шаг);
 
           - TYPE (тип).
 


                                - 32 -
 
                          00152-01 34 07-1
 
 
           Пользователь может изменить  текущий  язык  с  помощью
 
      команды SET LANGUAGE, при этом меняются значения  установки
 
      по умолчанию для зависимых  от  языка  параметров  отладки.
 
      Однако, если пользователь  изменил  значение  установки  по
 
      умолчанию любого параметра с помощью команды SET, то  новое
 
      значение будет действовать независимо от последующей коман-
 
      ды SET LANGUAGE.
 
           Для определения, какой язык используется  в  настоящее
 
      время  (т.е.  каков  текущий  язык),  следует  использовать
 
      команду SHOW LANGUAGE.
 
 
 
           2.4.2. Независимые от языка параметры отладки
 
 
           Во время запуска значения по умолчанию  для  следующих
 
      параметров отладки устанавливаются независимо  от  текущего
 
      языка программирования:
 
           - MODULE (модуль);
 
           - SCOPE (диапазон, область действия).
 
           Параметр MODULE позволяет вводить символическую инфор-
 
      мацию модуля в таблицу текущих символических имен (RST). Во
 
      время запуска отладчик вводит в таблицу  RST  символические
 
      записи для модуля, содержащего адрес  передачи.  Имя  этого
 
      модуля и имя языка, на котором написан этот модуль,  приво-
 
      дится в информационном сообщении отладчика.
 
           Адрес передачи представляет собой  ячейку  в  пределах
 
      компилированного кода, определяемую  ключевым  словом  (или
 
      ключевыми словами) на исходном  языке,  которая  обозначает
 
      начало программы. Например, на языке ПАСКАЛЬ системы МОС ВП
 
      адрес передачи представляет собой ячейку в пределах  компи-
 
      лированного  кода,  которая  определяется  ключевым  словом
 


                                - 33 -
 
                          00152-01 34 07-1
 
 
      PROGRAM.
 
           Параметр диапазона (или  области  действия)  оказывает
 
      влияние на интерпретацию отладчиком символических имен.
 
           При запуске отладчика с помощью команды RUN, значением
 
      параметра SCOPE является модуль, в котором содержится адрес
 
      передачи. При запуске отладчика с  помощью  команды  DEBUG,
 
      значением параметра SCOPE является модуль, в  котором  было
 
      прервано выполнение программы.
 
           В разделе 3 содержится полное описание того, как прог-
 
      раммный модуль и параметры диапазона влияют на  интерпрета-
 
      цию символических имен отладчиком.
 
 
 
           2.5. Файлы регистрации
 
 
           Пользователь имеет возможность сохранить записи сеанса
 
      отладки с помощью файла регистрации. Можно также  заставить
 
      отладчик выполнить команды, содержащиеся во внешнем  файле.
 
      Такой файл, когда он выполнятся, называется командной  про-
 
      цедурой. Кроме того, пользователь может заставить  отладчик
 
      выполнить файл регистрации как командную процедуру.
 
           Файл регистрации отладчика является файлом, в  котором
 
      содержится каждая команда отладчика, выданная пользователем
 
      в течение конкретного сеанса отладки, а также ответы отлад-
 
      чика на эти команды.
 
           В файле регистрации  каждая  команда,  которую  выдает
 
      пользователь в ответ на подсказку отладчика  (DBG>),  начи-
 
      нает строку, но сама подсказка отладчика  не  записывается.
 
      Ответ отладчика на  эту  команду  приводится  на  следующей
 
      строке (или на следующих строках) и, за исключением воскли-
 
      цательного знака в начале каждой строки ответов, аналогичен
 


                                - 34 -
 
                          00152-01 34 07-1
 
 
      тому, что пользователь видит на своем терминале.
 
           Пример файла регистрации отладчика  (следует  обратить
 
      внимание на отсутствие подсказок  отладчика  и  на  наличие
 
      восклицательных  знаков  в  начале  каждой  строки  ответов
 
      отладчика):
 
      SHOW OUTPUT
 
      !OUTPUT: NOVERIFY, TERMINAL, LOGGING TO _DB2:[GMF]EV.LOG;1
 
      SHOW TRACE
 
      !%DEBUG-I-NOTRACES,NO TRACEPOINTS ARE SET, NO OPCODE
 
      !TRACING
 
      SET TRACE %LINE 30
 
      SET BREAK %LINE 60
 
      SHOW TRACE
 
      !TRACEPOINT AT MEANSUB$MAIN %LINE 30
 
      GO
 
      !ROUTINE START AT MEANSUB$MAIN
 
      !TRACE AT MEANSUB$MAIN\%LINE 30
 
      !BREAK AT MEANSUB$MAIN\%LINE 60
 
      SET TRACE %LINE 40
 
      SHOW TRACE
 
      !TRACEPOINT AT MEANSUB$MAIN\%LINE 40
 
      !TRACEPOINT AT MEANSUB$MAIN\%LINE 30
 
      GO %LINE 20
 
      !START AT MEANSUB$MAIN\LINE 30
 
      !TRACE AT MEANSUB$MAIN\LINE 30
 
      !TRACE AT MEANSUB$MAIN\LINE 40
 
      !BREAK AT MEANSUB$MAIN\%LINE 60
 
           Для  создания  файла  регистрации  отладчика   следует
 
      использовать команду SET OUTPUT (п. 4.5.1). Для присвоения
 


                                - 35 -
 
                          00152-01 34 07-1
 
 
      имени этому файлу  следует  использовать  команду  SET  LOG
 
      (п. 4.5.2).
 
 
 
           2.5.1. Команда SET OUTPUT и SHOW OUTPUT
 
 
           Команда SET OUTPUT управляет текущей  формой  выходной
 
      информации отладчика, т.е. управляет способом, в соответст-
 
      вии с которым воспроизводятся и записываются ответы  отлад-
 
      чика на команды, вводимые пользователем.
 
           Формат:
 
      SET OUTPUT параметр[,параметр...]   .
 
           Список параметров вывода, которые могут быть определе-
 
      ны в данной команде, следующий:
 
           1) LOG - выводимая отладчиком информация  записывается
 
      в файле регистрации. Если пользователь не выдал команду SET
 
      LOG для присвоения имени этому файлу, то отладчик  присваи-
 
      вает имя по умолчанию DEBUG.LOG;
 
           2) NOLOG - выводимая отладчиком информация не  записы-
 
      вается в выходной файл. Это параметр вывода  по  умолчанию.
 
      Отладчик не записывает выходную информацию в файл регистра-
 
      ции до тех пор, пока пользователь в явной форме  не  потре-
 
      бует этого;
 
           3) TERMINAL - выходная информация отладчика  выводится
 
      на терминал. Это параметр  вывода  по  умолчанию.  Отладчик
 
      воспроизводит свои ответы на терминале, если только пользо-
 
      ватель не укажет обратного в явной форме;
 
           4) NOTERMINAL - выводимая  отладчиком  информация  (за
 
      исключением диагностических сообщений)  не  воспроизводится
 
      на терминале;
 
           5) VERIFY - отладчик включает  в  выходную  информацию
 


                                - 36 -
 
                          00152-01 34 07-1
 
 
      каждую входную командную строку из любой командной процеду-
 
      ры или последовательности DO,  которую  он  выполняет.  Это
 
      означает, что отладчик не  только  воспроизводит  результат
 
      выполнения каждой команды в командной процедуре или  после-
 
      довательности DO, но  воспроизводит  также  соответствующие
 
      команды;
 
           6) NOVERIFY - отладчик не  выводит  входные  командные
 
      строки, которые он выполняет из командных процедур  или  из
 
      последовательностей DO. Это параметр вывода  по  умолчанию.
 
      Отладчик не воспроизводит команды, которые  выполняются  им
 
      из командных  процедур  или  последовательностей  DO,  если
 
      только пользователь не потребует этого в явной форме.
 
           Для просмотра действующих в данный  момент  параметров
 
      вывода следует испольовать команду SHOW OUTPUT.
 
 
 
           2.5.2. Команды SET LOG и SHOW LOG
 
 
           Если  действует  параметр  LOG  (в  результате  выдачи
 
      команды SET OUTPUT LOG), пользователь может сообщить отлад-
 
      чику о необходимости записи выводимой информации в  указан-
 
      ный файл путем выдачи команды SET LOG в следующем формате:
 
           SET LOG спецификация_файла .
 
           Параметр спецификация_файла представлет собой специфи-
 
      кацию того файла,  в  который  отладчик  должен  записывать
 
      выходную информацию.
 
           Если действует параметр LOG, но пользователь не  выда-
 
      вал команду SET LOG для присвоения имени файлу регистрации,
 
      то отладчик записывает выходную информацию в файл с  именем
 
      по умолчанию DEBUG.LOG.
 
           Если параметр вывода LOG не действует, то отладчик  не
 


                                - 37 -
 
                          00152-01 34 07-1
 
 
      записывает  выходную  информацию  в  файл,  определенный  в
 
      команде SET LOG.  Однако,  если  пользователь  после  этого
 
      выдаст команду SET OUTPUT LOG, то отладчик начинает  запись
 
      в файл, определенный в команде SET LOG.
 
           Если параметр спецификация_файла  в  команде  SET  LOG
 
      включает как имя, так и тип файла,  то  отладчик  выполняет
 
      запись в определенный таким образом файл.
 
           Если параметр спецификация_файла в команде SET LOG  не
 
      включает тип файла, то отладчик  использует  тип  файла  по
 
      умолчанию (LOG).
 
           Для определения имени текущего файла регистрации  сле-
 
      дует использовать команду SHOW LOG.
 
           Пример демонстрирует использование команд SET LOG, SET
 
      OUTPUT, SHOW LOG и SHOW OUTPUT:
 
       DBG>SET LOG FILE                 !Присвоение имени файлу
 
                                        !регистрации 
 
       DBG>SET OUTPUT LOG               !Запись вывода в файл
 
                                        !регистрации 
 
       DBG>SHOW OUTPUT                  !Воспроизведение текущей
 
       OUTPUT: NOVERIFY, TERMINAL,      !конфигурации вывода 
 
       LOGGING TO _DB2:[GMF]FILE.LOG;1
 
       DBG>SHOW LOG                     !Воспроизведение имени
 
       LOGGING TO _DB2:[GMF]FILE.LOG;1  !текущего файла регистра-
 
       DBG>SET OUTPUT NOTERMINAL,NOLOG  !ции 
 
       %DEBUG-I-OUTPUTLOST, OUTPUT BEING LOST, BOTH NOTERMINAL
 
       AND NOLOG ARE IN EFFECT
 
       (выходная информация отладчика не сохранена,
 
       так как указаны параметры NOTERMINAL
 
       и NOLOG)
 
       DBG>SHOW LOG


                                - 38 -
 
                          00152-01 34 07-1
 
 
       NOT LOGGING TO _DB2:[GMF]FILE.LOG;1
 
       (регистрация отсутствует)
 
       DBG>SET LOG TERT.EEE             !Присвоение имени новому
 
                                        !файлу регистрации 
 
       DBG>SHOW LOG                     !Регистрация в файл
 
       NOT LOGGING TO _DB2:[GMF]TERT.EEE;1 !TERT.EEE не выполня-
 
                                        !ется, т.к. вывод уста-
 
                                        !новлен на NOLOG 
 
       DBG>SET OUTPUT LOG               !Изменение конфигурации
 
                                        !вывода 
 
       DBG>SHOW LOG
 
       LOGGING TO _DB2:[GMF]TERT.EEE;1
 
       (регистрация в файл ...)
 
       DBG>SHOW OUTPUT
 
       OUTPUT: NOVERIFY, NOTERMINAL, LOGGING TO
 
       _DB2:[GMF]TERT.EEE;1             !Воспроизведение текущей
 
                                        !конфигурации вывода
 
 
 
           2.6. Командные процедуры
 
 
           Командная процедура представляет собой файл,  содержа-
 
      щий одну или несколько команд отладчика. Пользователь может
 
      сообщить отладчику о необходимости выполнения команд отлад-
 
      чика из этого файла, задав перед спецификацией этого  файла
 
      символ @:
 
           @спецификация_файла   .
 
           Если спецификация_файла включает имя файла  без  типа,
 
      то отладчик предполагает тип по умолчанию COM.
 
           Команда @спецификация_файла может быть выдана с терми-
 
      нала, из командной  последовательности  DO  или  из  другой
 


                                - 39 -
 
                          00152-01 34 07-1
 
 
      командной процедуры.
 
           Если данная команда выдается с терминала, то  отладчик
 
      начинает выполнять первую команду  в  этом  файле  и  после
 
      выполнения всех команд выдает на экран подсказку DBG>.
 
           Если команда  @спецификация_файла  является  одной  из
 
      команд в последовательности DO, то отладчик начинает выпол-
 
      нение первой команды в этом файле после достижения  команды
 
      @спецификация_файла в этой последовательности. После выпол-
 
      нения всех команд в этом файле отладчик возобновляет выпол-
 
      нение команд, оставшихся в командной последовательности DO,
 
      а затем выдает подсказку DBG>.
 
           Если команда  @спецификация_файла  является  одной  из
 
      команд в другой (т.е. в вызывающей) командной процедуре, то
 
      отладчик начинает выполнение команд в вызываемой  командной
 
      процедуре при  достижении  этой  команды.  Он  возобновляет
 
      выполнение  оставшихся  в  вызывающей  командной  процедуре
 
      команд после выполнения всех команд в  вызванной  командной
 
      процедуре.
 
           Если команда в командной процедуре синтаксически  неп-
 
      равильна, то отладчик выдает сообщение об ошибке и  продол-
 
      жает выполнение следующей команды в данной командной проце-
 
      дуре.
 
           Когда действует параметр вывода по умолчанию  NOVERIFY
 
      (п. 2.5.1), отладчик не выводит ни на терминал, ни  в  файл
 
      регистрации команды из соответствующей командной процедуры.
 
      Отладчик просто выполняет эти команды и воспроизводит полу-
 
      чаемую в результате этого выходную информацию.
 
           Если пользователь хочет, чтобы отладчик  воспроизводил
 
      команды из командной процедуры в процессе их выполнения, он
 
      должен установить параметр вывода VERIFY (см. п. 2.5.1).


                                - 40 -
 
                          00152-01 34 07-1
 
 
           2.6.1. Командные процедуры, создаваемые редактором
 
 
           Пользователь может  применять  редактор  для  создания
 
      командной процедуры. Это выполняется путем создания  файла,
 
      а затем ввода команд отладчика в этот файл.
 
           Пример 1. Файл BREAK.EDT  содержит  следующие  команды
 
      отладчика:
 
       SET BREAK/AFTER:3 %LINE 120 DO (EXAMINE K,N,J,X(K); GO)
 
       SET BREAK/AFTER:3 %LINE 160 DO (EXAMINE K,N,J,X(K),S; GO)
 
       SET BREAK %LINE 90
 
           Назначение команд в этой командной процедуре состоит в
 
      установке точек приостанова в трех разных программных ячей-
 
      ках. Таким образом, при выдаче команды @BREAK.EDT во  время
 
      сеанса отладки отладчик установит точки приостанова,  опре-
 
      деленные в этой процедуре.
 
           Пример 2. Показан файл регистрации BREAK.LOG, в  кото-
 
      ром записано использование командной процедуры BREAK.EDT  в
 
      сеансе отладки:
 
       @BREAK.EDT         !Выполнение командной процедуры 
 
       SHOW BREAK         !Воспроизведение точек приостанова,
 
                          !установленных командой @BREAK.EDT 
 
       !BREAKPOINT /AFTER:3 AT MEANSUB$MAIN\%LINE 160 DO (EX
 
       !K,N,J,X(K),S;GO)
 
       !BREAKPOINT /AFTER:3 AT MEANSUB$MAIN\%LINE 120 DO (EX
 
       !K,N,J,X(K);GO)
 
       GO                 !Начало выполнения программы 
 
       !ROUTINE START AT MEANSUB$MAIN\MEANSUB$MAIN
 
       !BREAK AT MEANSUB$MAIN\MEANSUB$MAIN %LINE 120
 
       !MEANSUB$MAIN\MEANSUB$MAIN\K: 3.000000
 
       !MEANSUB$MAIN\MEANSUB$MAIN\N: 3.000000
 


                                - 41 -
 
                          00152-01 34 07-1
 
 
       !MEANSUB$MAIN\MEANSUB$MAIN\J: 1.000000
 
       !MEANSUB$MAIN\MEANSUB$MAIN\X(3): 93.00000
 
       !START AT MEANSUB$MAIN\MEANSUB$MAIN\%LINE 120
 
       !BREAK AT MEANSUB$MAIN\MEANSUB$MAIN\%LINE 160
 
       !MEANSUB$MAIN\MEANSUB$MAIN\K: 3.000000
 
       !MEANSUB$MAIN\MEANSUB$MAIN\N: 3.000000
 
       !MEANSUB$MAIN\MEANSUB$MAIN\J: 1.000000
 
       !MEANSUB$MAIN\MEANSUB$MAIN\X(3): 93.00000
 
       !MEANSUB$MAIN\MEANSUBQ$MAIN\S: 252.0000
 
       !START AT MEANSUB$MAIN\MEANSUB$MAIN\%LINE 160
 
       !BREAK AT MEANSUB$MAIN\MEANSUB$MAIN\%LINE 90
 
       CANCEL BREAK/ALL   !Отмена всех точек приостанова 
 
 
 
           2.6.2. Использование  файлов  регистрации  в  качестве
 
      командных процедур
 
 
           Пользователь может применять файл регистрации отладчи-
 
      ка в качестве командной процедуры. Файл регистрации  отлад-
 
      чика содержит команды отладчика и его выходную  информацию.
 
      Перед выходной информацией отладчика в строке всегда  стоит
 
      восклицательный знак, который сообщает отладчику о том, что
 
      следует игнорировать соответствующую строку.
 
           Восклицательный знак называется разделителем коммента-
 
      риев, так как используется для  отделения  комментариев  от
 
      командной строки. Использование отладчиком разделителя ком-
 
      ментариев в файле регистрации делает возможным  непосредст-
 
      венное использование (без  каких-либо  модификаций)  файлов
 
      регистрации отладчика в качестве командных процедур.
 
           Пользователь сообщает отладчику о необходимости выпол-
 
      нения команд из файла регистрации путем  определения  этого
 


                                - 42 -
 
                          00152-01 34 07-1
 
 
      файла в качестве командной процедуры следующим образом:
 
      DBG>@спецификация_файла   .
 
           Таким образом, файл регистрации BREAK.LOG  (п.  2.6.1)
 
      может быть использован в  качестве  командной  процедуры  в
 
      другом сеансе отладки путем выдачи команды:
 
      DBG>@BREAK.LOG   .
 
           Использование команды @BREAK.LOG в последующем  сеансе
 
      отладки вызывает выполнение команд отладчика:
 
           - @BREAK.EDT;
 
           - SHOW BREAK;
 
           - GO;
 
           - CANCEL BREAK/ALL.
 
           Таким образом, пользователь может  повторно  выполнить
 
      предыдущий сеанс отладки путем использования файла  регист-
 
      рации в качестве командной процедуры.  Это  весьма  удобно,
 
      если пользователь хочет продолжить отладку  с  того  места,
 
      где был закончен предыдущий сеанс. Можно также использовать
 
      файл регистрации в качестве командной  процедуры  в  другой
 
      программе или в модифицированной версии этой же программы.
 
 
 
           2.7. Прерывание сеанса отладки
 
 
           Так как сам по себе отладчик является образом  в  кон-
 
      тексте операционной системы МОС ВП, он реагирует на  преры-
 
      вание аналогично другим образам, выполняемым в режиме поль-
 
      зователя. Например, образ будет прерван (но не изменен),  а
 
      буфер ввода с терминала очищен, когда интерпретатор  команд
 
      DCL получает управление.
 
           Для прерывания сеанса отладки следует ввести управляю-
 
      щие символы CTRL/Y (которые  отображаются  на  терминале  в
 


                                - 43 -
 
                          00152-01 34 07-1
 
 
      виде ^Y):
 
      DBG>CTRL/Y
 
      ^Y
 
           После нажатия CTRL/Y управление получает интерпретатор
 
      команд DCL.
 
           Если пользователь выполняет программу не под  управле-
 
      нием отладчика, затем прерывает ее и запускает  отладчик  с
 
      помощью команды DEBUG, то информационное сообщение отладчи-
 
      ка указывает имя модуля, в котором содержится ячейка  прог-
 
      раммы, на которой было прервано выполнение, а также  назва-
 
      ние языка, на котором написан  соответствующий  программный
 
      модуль.
 
           Если пользователь выполняет программу под  управлением
 
      отладчика, может  потребоваться  ее  прерывание  с  помощью
 
      CTRL/Y и последующая выдача команды DEBUG.  Например,  если
 
      после выдачи команды GO программа зациклилась, то выйти  из
 
      него можно с помощью CTRL/Y. В этом случае отладчик выходит
 
      на выдачу подсказки DBG>, оставляя  все  параметры  отладки
 
      такими, как они были.
 
           Может также возникнуть необходимость прервать  команду
 
      отладчика, которая слишком долго не завершается или генери-
 
      рует весьма об'емную выходную  информацию.  В  этом  случае
 
      выдача CTRL/Y аннулирует такую команду, когда все структуры
 
      данных будут в согласованной форме.
 


                                - 44 -
 
                          00152-01 34 07-1
 
 
           2.7.1. Управляющие символы CTRL/Y и CTRL/C
 
 
           Действия управляющих символов CTRL/Y и CTRL/C идентич-
 
      ны, за исключением того случая,  когда  конкретная  система
 
      или прикладная программа содержит  подпрограмму,  закодиро-
 
      ванную для приема управляющего символа CTRL/C.
 
           Если такая подпрограмма существует, то ввод  управляю-
 
      щего символа CTRL/C вызывает передачу управления  обрабаты-
 
      вающей подпрограмме, а не интерпретатору команд.
 
           Если  подпрограммы  обработки   управляющего   символа
 
      CTRL/C не существует, то оба управляющих символа  CTRL/Y  и
 
      CTRL/C обеспечивают прерывание сеанса  отладки  и  передачу
 
      управления интерпретатору команд DCL, который  сообщает  об
 
      этом путем вывода подсказки.
 
           После выдачи  подсказки  интерпретатора,  пользователь
 
      может ввести любую команду DCL.
 
 
 
           2.7.2. Возможные действия после прерывания
 
 
           После прерывания сеанса отладки с помощью управляющего
 
      символа CTRL/Y или CTRL/C и соответствующего  воспроизведе-
 
      ния запроса интерпретатора DCL  пользователь  может  ввести
 
      любую из следующих команд DCL:
 
           - DEBUG (п. 2.1.4);
 
           - CONTINUE - передает управление обратно отладчику или
 
      программе (в зависимости от того, у кого из них было управ-
 
      ление во время прерывания);
 
           - STOP  -  вызывает  аварийное  завершение  отладчика;
 
      обработчик выхода отладчика не получает управления;
 
           - EXIT -  вызывает  нормальное  завершение  отладчика;
 
      обработчик выхода отладчика получает управление;


                                - 45 -
 
                          00152-01 34 07-1
 
 
           - команды, которые выполняются в пределах  интерпрета-
 
      тора команд DCL. Эти команды могут быть введены и  выполне-
 
      ны, не вызывая завершения образа отладчика. Например, после
 
      прерывания отладчика с помощью управляющего символа  CTRL/Y
 
      пользователь может ввести команду  SHOW  DAYTIME,  а  затем
 
      команду DEBUG, в результате чего управление будет возвраще-
 
      но отладчику;
 
           - любая другая команда DCL вызывает завершение  отлад-
 
      чика. При этом отрабатывает обработчик выхода отладчика;
 
           - SPAWN и ATTACH - позволяют  создать  подпроцесс  или
 
      подключиться к другому процессу (п. 2.7.3).
 
 
 
           2.7.3. Команды SPAWN и ATTACH
 
 
           Отладчик поддерживает команды SPAWN и ATTACH,  которые
 
      позволяют прерывать сеанс отладки без его окончания.
 
           Команда SPAWN действует аналогично команде SPAWN языка
 
      DCL. Эта команда  временно  приостанавливает  отладчик  для
 
      работы  интерпретатора  команд  DCL.  Можно  также  указать
 
      SPAWN/NOWAIT с командой DCL. Данный вариант позволяет  про-
 
      должать сеанс отладки, не  ожидая  завершения  порожденного
 
      подпроцесса.
 
           Однако, если  пользователь  планирует  выдать  команду
 
      SPAWN несколько раз во время одного сеанса отладки, то луч-
 
      ше использовать вместо команды SPAWN команду ATTACH. Коман-
 
      да ATTACH позволяет переходить туда и обратно между сеансом
 
      отладки и интерпретатором команд DCL или между двумя  сеан-
 
      сами отладки. Но сначала пользователь должен создать  подп-
 
      роцесс, а затем он может присоединяться к  нему,  когда  он
 
      захочет. Для возврата к  первоначальному  процессу  исполь-
 


                                - 46 -
 
                          00152-01 34 07-1
 
 
      зуется другая команда  ATTACH.  Поскольку  пользователь  не
 
      создает новый подпроцесс каждый  раз,  когда  он  оставляет
 
      отладчик, то ресурсы системы используются более эффективно.
 
 
 
 
                 3. Управление выполнением программы
 
 
 
           В данном разделе описывается запуск, временная  приос-
 
      тановка и управление выполнением программы, а  также  восп-
 
      роизведение текущего состояния программы. В ней описывается
 
      также отладка обработчиков выхода.
 
 
 
           3.1. Начало выполнения программы
 
 
           Для начала выполнения программы при запуске  отладчика
 
      или для продолжения выполнения программы  после  прерывания
 
      следует использовать команды STEP, GO или CALL.
 
 
 
           3.1.1. Команда STEP
 
 
           С помощью данной команды пользователь может  управлять
 
      выполнением своей программы. На выдачу команды STEP  отлад-
 
      чик реагирует следующим образом:
 
           1) выполняет одну или несколько команд;
 
           2) сообщает строку или  команду,  которая  следует  за
 
      последней выполненной командой;
 
           3) сообщает исходную  строку,  соответствующую  строке
 
      или команде,  которая  следует  за  последней  выполненной,
 
      только в том  случае,  если  действует  параметр  SOURCE  в
 
      командах STEP/SOURCE или SET STEP SOURCE и имеются исходные
 
      строки;
 


                                - 47 -
 
                          00152-01 34 07-1
 
 
           4) отладчик выдает подсказку (DBG>).
 
           Формат данной команды:
 
      STEP[/квалификатор...][целое]  .
 
           Десятичное целое число является  дополнительным  (т.е.
 
      необязательным)  параметром,  который  указывает,   сколько
 
      строк или команд должно  быть  выполнено.  Если  это  целое
 
      десятичное число отсутствует, то отладчик использует значе-
 
      ние по умолчанию - единицу.
 
           Квалификаторы данной команды определяют:
 
           1) выполнение отладчиком программы по строкам  или  по
 
      командам;
 
           2) его заход "в" вызываемые программы в области  прог-
 
      раммы пользователя или проход "поверх" этих подпрограмм;
 
           3) заход отладчика "в" или  проход  "поверх"  подпрог-
 
      рамм, вызываемых в системной области;
 
           4)  выполнение  до  следующей  команды  BRANCH,  CALL,
 
      RETURN или условия исключительной ситуации;
 
           5) воспроизведение сообщений, связанных с  выполнением
 
      команды STEP;
 
           6) воспроизведение строк исходного  кода  по  мере  их
 
      прохождения отладчиком.
 
           Если квалификаторы команды STEP не указываются пользо-
 
      вателем, то отладчик использует для нее те параметры, кото-
 
      рые были установлены командой SET STEP (подпункт  3.1.1.1),
 
      или параметры по  умолчанию,  связанные  с  текущим  языком
 
      программирования.
 
           Действия квалификаторов команды STEP следующие:
 
           1) /BRANCH - проход  до  следующей  команды  ветвления
 
      (типа BRANCH);
 
           2) /CALL - проход до следующей  команды  вызова  (типа


                                - 48 -
 
                          00152-01 34 07-1
 
 
      CALL);
 
           3) /EXCEPTION - выполнение до следующего условия  иск-
 
      лючительной ситуации;
 
           4) /INSTRUCTION - проход до следующей команды;
 
           5)  /INSTRUCTION=код_оп  -  выполнение  до   следующей
 
      заданной команды;
 
           6) /LINE - выполнение всего кода программы пользовате-
 
      ля между ячейкой, на которой последний раз было приостанов-
 
      лено выполнение, и до следующей строки;
 
           7) /INTO - отладчик входит "в" вызываемые подпрограммы
 
      в области программы пользователя (а  также  "в"  вызываемые
 
      программы в системной области, если указан также квалифика-
 
      тор /SYSTEM). Это означает, что отладчик не делает различий
 
      между командами (или строками)  вызываемой  подпрограммы  и
 
      самой программы при выполнении шагов. Таким образом, выпол-
 
      нение команды STEP может привести к приостановке выполнения
 
      внутри подпрограммы, в этом случае можно по шагам  последо-
 
      вательно выполнить команды (или строки) внутри  подпрограм-
 
      мы;
 
           8) /OVER - отладчик проходит "поверх" вызываемых подп-
 
      рограмм в  области  программы  пользователя  или  системной
 
      области. т.е. отладчик рассматривает все команды, выполнен-
 
      ные от команды CALL до  соответствующей  инструкции  RETURN
 
      включительно, как часть одного шага;
 
           9) /SILENT - указывает, чтобы сообщение "проход к...",
 
      связанное с командой STEP, не выдавалось на  дисплей.  Этот
 
      квалификатор наиболее полезен для  командных  процедур  или
 
      последовательностей DO, когда пользователь не желает  смот-
 
      реть сообщения о шагах выполнения;
 
           10)  /NOSILENT  -  отменяет   действие   квалификатора


                                - 49 -
 
                          00152-01 34 07-1
 
 
      /SILENT;
 
           11)  /SYSTEM  -  когда  действует  этот  квалификатор,
 
      отладчик входит "в"  вызываемые  подпрограммы  в  системной
 
      области  при  условии  определения  также  и  квалификатора
 
      /INTO. Это означает, что при выполнении шагов  отладчик  не
 
      делает различия между командами (строками) в пределах и  за
 
      пределами вызванной подпрограммы в системной области. Таким
 
      образом, выполнение команды STEP может привести к  приоста-
 
      новке выполнения в системной области;
 
           12) /NOSYSTEM - отладчик проходит "поверх"  вызываемых
 
      подпрограмм в системной одласти. Это означает, что отладчик
 
      рассматривает любые инструкции, выполненные от команды CALL
 
      в подпрограмме в системной области до соответствующей инст-
 
      рукции RETURN включительно, в качестве части одного шага;
 
           13) /SOURCE - при использовании этого квалификатора  с
 
      некоторыми языками программирования отладчик  воспроизводит
 
      строку исходного кода,  которая  соответствует  выполняемой
 
      команде (или командам).Этот квалификатор  подходит  не  для
 
      всех языков программирования (раздел 7);
 
           14) /NOSOURCE - при использовании этого  квалификатора
 
      отладчик не выводит строку исходного текста,  соответствую-
 
      щего выполняемой команде (или командам). Данный  квалифика-
 
      тор применим также не для всех языков программирования (см.
 
      раздел 7);
 
           15) /RETURN - указывает отладчику на проход до команды
 
      возврата из текущей подпрограммы. Применим только для подп-
 
      рограмм типа CALLS и CALLG.
 
           Когда  квалификатор  определяется  вместе  с  командой
 
      STEP, он отменяет (на время выполнения этой команды)  соот-
 
      ветствующий параметр STEP, установленный командой SET  STEP


                                - 50 -
 
                          00152-01 34 07-1
 
 
      или соответствующий параметр STEP по умолчанию, связанный с
 
      текущим языком программирования.
 
 
 
           3.1.1.1. Команды SET STEP и SHOW STEP
 
 
           Команда SET STEP устанавливает параметры шага по умол-
 
      чанию, т.е. устанавливает параметры пошагового  выполнения,
 
      которые используются отладчиком в том случае, когда команда
 
      STEP была выдана без квалификатора.
 
           Когда параметр шага определяется в качестве квалифика-
 
      тора в команде STEP, он отменяет действие любых  параметров
 
      шага, установленных командой SET STEP или параметров,  свя-
 
      занных с текущим языком программирования, на время действия
 
      этой команды STEP.
 
           Могут  быть  использованы   следующие  параметры  шага
 
      (п. 3.1.1): BRANCH,  CALL,  EXCEPTION,  LINE,  INSTRUCTION,
 
      INSTRUCTION=код_операции, INTO, OVER,  NOSILENT,  NOSOURCE,
 
      NOSYSTEM, RETURN, SILENT, SOURCE или SYSTEM. Следует, одна-
 
      ко, отметить, что перед параметром шага не приводится  нак-
 
      лонная черта (/), если только он не используется в качестве
 
      квалификатора команды STEP.
 
           Формат команды SET STEP:
 
      SET STEP параметр_шага [,параметр_шага...]  .
 
           Следует иметь в виду, что параметры шага по  умолчанию
 
      связаны с конкретным языком программирования. Поэтому, ког-
 
      да пользователь изменяет язык  программирования  с  помощью
 
      команды SET LANGUAGE, параметры шага также могут  изменять-
 
      ся.
 
           Для воспроизведения текуших  параметров  шага  следует
 
      использовать команду SHOW STEP .
 


                                - 51 -
 
                          00152-01 34 07-1
 
 
           На ассемблерном уровне программные ячейки чаще опреде-
 
      ляются виртуальными адресами или смещениями от  программных
 
      меток, чем символическими именами. Следовательно, использо-
 
      вание виртуальных адресов в  качестве  параметров  в  таких
 
      командах, как  STEP  (влияющих  на  выполнение  программы),
 
      является наиболее распространенным.
 
           Поэтому при отладке на ассемблерном уровне может  быть
 
      полезным установка параметра в команде STEP на INSTRUCTION.
 
      Затем при выдаче команды STEP программа  будет  выполняться
 
      по одной команде или группе команд. При единичном шаге мож-
 
      но  будет  читать  исходный  программный  код  как  команду
 
      ассемблера СМ 1700. Далее,  устанавливая  параметр  команды
 
      STEP в INTO,  становится  возможным  пошаговое  прохождение
 
      через  подпрограммы,  вызываемые  программой  пользователя.
 
      Следующий пример демонстрирует использование команды STEP:
 
      DBG>SHOW STEP                   !Воспроизведение текущих
 
      STEP TYPE: NOSYSTEM, SOURSE,    !параметров шага
 
      NOSILENT, OVER ROUTINE CALLS, BY LINE
 
      DBG>SHOW MODE                   !Воспроизведение текущих
 
      MODES: SYMBOLIC, D_FLOAT,       !режимов
 
      NOSCREEN,NOKEYPAD
 
      INPUT RADIX : DECIMAL
 
      OUTPUT RADIX: DECIMAL
 
      DBG>SET STEP INSTRUCTION, INTO, NOSOURSE !Установка пара-
 
                                               !метров STEP
 
      DBG>SHOW STEP                   !Воспроизведение текущих
 
                                      !параметров шага
 
      STEP TYPE: NOSYSTEM, NOSOURSE, NOSILENT, INTO ROUTINE
 
      CALLS, BY INSTRUCTION
 
      DBG>STEP                        !Пошаговое выполнение


                                - 52 -
 
                          00152-01 34 07-1
 
 
                                      !программы
 
      STEPPED TO CIRCLE %LINE 2 : PUSHAL  L^512
 
      DBG>STEP
 
      STEPPED TO CIRCLE %LINE 2+6: MNEGL #2,-(SP)
 
      DBG>STEP
 
      STEPPED TO CIRCLE %LINE 2+9: CALLS #2,L^FOR$WRITE_SF
 
      DBG>STEP
 
      STEPPED TO FOR$WRITE_SF+2 JMP L^56758 !Вход в вызванную
 
                                            !подпрограмму
 
                                            !FOR$WRITE_SF.
 
                                            !Kогда пройдена
 
                                            !двухбайтовая маска
 
                                            !входа, отладчик
 
                                            !опрашивает команды
 
                                            !по их виртуальным
 
                                            !адресам. Это связа-
 
                                            !но с тем, что имя
 
                                            !FOR$WRITE_SF отсут-
 
                                            !ствует в таблице
 
                                            !текущих символичес-
 
                                            !ких имен отладчика 
 
      DBG>STEP
 
      STEPPED TO 56758: MOVZBL #1,R0
 
      DBG>STEP
 
      STEPPED TO 56761: BRW    56870
 
 
 
 
 
      DBG>STEP/RETURN
 
      STEPPED TO 58561: RET      !выход из FOR$WRITE_SF
 
      DBG>STEP


                                - 53 -
 
                          00152-01 34 07-1
 
 
      STEPPED TO CIRCLE %LINE 4 : PUSHAL L^535 !Начало выполне-
 
                                               !ния основной
 
                                               !программы 
 
      DBG>STEP
 
      STEPPED TO CIRCLE %LINE 4+6: MNEGL #3,-(SP)
 
      DBG>STEP
 
      STEPPED TO CIRCLE %LINE 4+9: CALLS #2,L^FOR$READ_SF
 
      DBG>STEP
 
      STEPPED TO FOR$READ_SF+2: JMP L^56646 !Вход в подпрограмму
 
                                            !FOR$READ_SF
 
      DBG>STEP
 
      STEPPED TO 56646 : MOVZBL #2,R0
 
      DBG>STEP
 
      STEPPED TO 56649 : BRW 56870
 
      DBG>GO
 
      %DEBUG-I-EXITSTATUS, IS '%SYSTEM-S-NORMAL, NORMAL
 
      SUCCESSFUL COMPLETION'
 
      (нормальное успешное завершение)
 
 
 
           3.1.2. Команда GO
 
 
           Kоманда GO может использоваться для выполнения следую-
 
      щих функций:
 
           - для начала  выполнения  программы  пользователя  при
 
      запуске отладчика (в этом случае ее выполнение начинается с
 
      адреса передачи);
 
           - для возобновления выполнения с команды, следующей за
 
      последней выполненной. В этом случае пользователь не должен
 
      указывать адресное выражение в качестве  параметра  команды
 
      GO;
 


                                - 54 -
 
                          00152-01 34 07-1
 
 
           - для  возобновления  выполнения  с  указанной  ячейки
 
      программы. В этом случае пользователь определяет соответст-
 
      вующее адресное выражение в качестве параметра команды GO.
 
           В отличие от команды  STEP,  которая  приостанавливает
 
      выполнение  программы  после  выполнения  указанного  числа
 
      команд или строк, команда GO вызывает продолжение  выполне-
 
      ния программы пользователя вплоть до  появления  одного  из
 
      условий:
 
           - окончание программы;
 
           - достижение точки приостанова;
 
           - приведение в действие точки просмотра;
 
           - наличие исключительной ситуации;
 
           - прерывание программы управляющими  символами  CTRL/Y
 
      или CTRL/C.
 
           Формат команды GO:
 
      GO [адресное_выражение]  .
 
           Если адресное выражение определяется в качестве  пара-
 
      метра в команде GO, то отладчик начинает  выполнение  прог-
 
      раммы с ячейки, которая указывается этим  адресным  выраже-
 
      нием.
 
           Использование адресного выражения в качестве параметра
 
      в команде GO может оказаться полезным в тех ситуациях, ког-
 
      да желательно повторно выполнить секции своей программы,  а
 
      запускать ее с самого начала нет необходимости. Однако сле-
 
      дует отметить, что если  пользователь  определяет  параметр
 
      адресное_выражение в команде GO, то состояние  программы  в
 
      ячейке, указываемой этим адресным выражением,  должно  быть
 
      аналогичным состоянию программы во время выдачи команды GO.
 
      В противном случае результаты могут оказаться непредсказуе-
 
      мыми.


                                - 55 -
 
                          00152-01 34 07-1
 
 
           Примеры использования команды GO приводятся в подпунк-
 
      те 3.2.1.1.
 
 
 
           3.1.3. Команда CALL
 
 
           Команду CALL удобно использовать для отладки  подпрог-
 
      рамм в программе пользователя.
 
           При выдаче данной команды отладчик выполняет следующие
 
      действия:
 
           1) сохраняет текущие значения общих регистров;
 
           2) создает список аргументов;
 
           3) выполняет вызов подпрограммы, указанной в  команде,
 
      и передает соответствующие аргументы;
 
           4) выполняет соответствующую подпрограмму;
 
           5) воспроизводит значение, возвращенное этой  подпрог-
 
      раммой в регистр R0;
 
           6) восстанавливает значения общих  регистров  в  соот-
 
      ветствии со значениями, которые  находились  в  них  непос-
 
      редственно перед выдачей команды CALL;
 
           7) выдает подсказку (DBG>).
 
           Отладчик выполняет подпрограмму,  вызываемую  командой
 
      CALL, независимо от того, включает или нет программа  поль-
 
      зователя фактический вызов этой  подпрограммы.  Однако  эта
 
      подпрограмма должна  быть  скомпонована  с  соответствующей
 
      программой пользователя.
 
           Можно также отлаживать подпрограммы,  нескомпонованные
 
      с программой, путем  их  компоновки  с  фиктивным  основным
 
      модулем, который имеет адрес передачи, а затем использовать
 
      команду CALL для их выполнения.
 


                                - 56 -
 
                          00152-01 34 07-1
 
 
           Формат команды CALL:
 
      CALL имя_подпрограммы [(аргумент1[,аргумент2...])]
 
           Следует отметить, что все аргументы должны быть заклю-
 
      чены в круглые скобки.
 
 
 
           3.2. Временная приостановка выполнения программы
 
 
           В данном подразделе описываются  способы  приостановки
 
      выполнения программы  путем  установки  точек  приостанова,
 
      точек приостанова по исключительной ситуации и точек  прос-
 
      мотра.
 
 
 
           3.2.1. Точки приостанова
 
 
           Точка приостанова является ячейкой программы, в  кото-
 
      рой отладчик выполняет следующие действия:
 
           1) приостанавливает выполнение программы;
 
           2) проверяет счетчик AFTER и продолжает (возобновляет)
 
      выполнение программы, если он еще не достиг заданного  зна-
 
      чения;
 
           3) оценивает выражение WHEN (если оно задано)  и  про-
 
      должает  выполнение  программы,  если  оно  имеет  значение
 
      "ложь" (FALSE) в текущем языке программирования;
 
           4) воспроизводит имя или виртуальный адрес ячейки,  на
 
      которой приостанавливается выполнение;
 
           5) выполняет команды  в  командной  последовательности
 
      DO, если такая последовательность определена в команде  SET
 
      BREAK;
 
           6) выдает подсказку (DBG>).
 
           Для установки точек приостанова  следует  использовать
 
      команду SET BREAK, которая имеет формат:


                                - 57 -
 
                          00152-01 34 07-1
 
 
      SET BREAK [/квалификатор ...] [адресное_выражение-
 
      [,адресное_выражение,...]] [WHEN (выражение)]-
 
      [DO (команда [;команда...])]
 
           Когда указывается адресное выражение, то точка  приос-
 
      танова привязывается к данной программной  ячейке.  Задание
 
      нескольких  адресных  выражений  эквивалентно  установлению
 
      нескольких точек приостанова (по одной для каждого адресно-
 
      го выражения). При  достижении  заданного  адреса  отладчик
 
      приостанавливает  выполнение  программы  перед  выполнением
 
      команды, находящейся в этой ячейке.
 
           Некоторые  командные  квалификаторы  (/BRANCH,  /CALL,
 
      /EXCEPTION, INSTRUCTION[=код_операции]  и  /LINE)  отражают
 
      классы условий, на которых могут  быть  точки  приостанова.
 
      Например, SET BREAK/CALL задает отладчику остановку на каж-
 
      дом вызове подпрограммы. Если  указывается  один  из  таких
 
      квалификаторов, то адресное выражение не употребляется.
 
           Квалификатор /RETURN указывает, что точка  приостанова
 
      устанавливается не по заданному адресу, а при  возврате  из
 
      подпрограммы, содержащей этот адрес.
 
           Помимо упомянутых, команда SET BREAK  имеет  следующие
 
      квалификаторы: /AFTER:N, /SILENT, /SOURCE и /TEMPORARY. Эти
 
      квалификаторы обычно  воздействуют  на  вывод  (визуальной)
 
      информации в точке приостанова или информации о  достижении
 
      точки приостанова.
 
           При наличии предложения WHEN отладчик  производит  его
 
      анализ: если параметр "выражение" имеет  значение  "истина"
 
      (TRUE) для текущего языка программирования, то  срабатывает
 
      точка приостанова. Однако, если значение выражения - "ложь"
 
      (FALSE), то точка приостанова не действует и командная пос-
 
      ледовательность DO не выполняется.


                                - 58 -
 
                          00152-01 34 07-1
 
 
           Если пользователь определяет командную  последователь-
 
      ность DO, то отладчик выполняет команды этой последователь-
 
      ности  при  приведении  в  действие  соответствующей  точки
 
      приостанова (см. подпункт 3.2.1.1).
 
           Если пользователь применяет виртуальный  адрес  памяти
 
      или адресное выражение, значение которого не является  сим-
 
      волической ячейкой, в  качестве  параметра  в  команде  SET
 
      BREAK, то он должен проверить, что команда фактически начи-
 
      нается с байта  определяемой  таким  образом  памяти.  Если
 
      команда не начинается с этого  байта,  то  может  произойти
 
      ошибка при выполнении команды, включающей этот  байт.  Сле-
 
      дует отметить, что при установке точки приостанова отладчик
 
      не выполняет проверки того, что указанная  ячейка  является
 
      началом команды.
 
           Когда параметром в  команде  SET  BREAK  является  имя
 
      подпрограммы, отладчик отмечает этот факт при приведении  в
 
      действие точки приостанова выдачей следующего сообщения:
 
      ROUTINE BREAK AT ROUTINE NAME ...
 
      (приостанов подпрограммы на имени подпрограммы ...)  .
 
           Точки приостанова подпрограмм являются особыми случая-
 
      ми, так как точка приостанова фактически устанавливается на
 
      адрес памяти на два байта больше, чем  адрес  памяти  имени
 
      самой подпрограммы (называемой входной  точкой  подпрограм-
 
      мы). Это сделано затем, чтобы точка приостанова не устанав-
 
      ливалась на  двухбайтовую  входную  маску  подпрограммы,  а
 
      попадала на первую команду подпрограммы,  следующую  непос-
 
      редствено за входной маской.
 
           Следует сказать, что команда EXAMINE  имя_подпрограммы
 
      не пропускает входную маску подпрограммы. Поэтому для прос-
 
      мотра первой команды в  подпрограмме  необходимо  использо-


                                - 59 -
 
                          00152-01 34 07-1
 
 
      вать:
 
      DBG>EXAMINE имя_подпрограммы + 2  .
 
           Для просмотра действующих  точек  приостанова  следует
 
      выдать команду SHOW BREAK .
 
           После  установки  точка  приостанова  продолжает  быть
 
      активной на протяжении всего сеанса  отладки,  если  только
 
      пользователь не отменяет ее с помощью команды CANCEL  BREAK
 
      или не заменяет другой точкой приостанова, точкой просмотра
 
      или точкой отслеживания в этой же ячейке программы. В таком
 
      случае спецификация старой точки приостанова  переписывает-
 
      ся.
 
           Для отмены одной или нескольких точек приостанова сле-
 
      дует использовать команду CANCEL BREAK в формате:
 
      CANCEL BREAK [/квалификатор] [адресное_выражение-
 
      [,адресное_выражение...]]
 
           Если      пользователь       определяет       параметр
 
      адресное_выражение, то точка приостанова в ячейке,  указан-
 
      ной этим адресным выражением,  отменяется.  В  этом  случае
 
      квалификатор команды не определяется.
 
           Если  пользователь  указывает  квалификатор  /ALL,  то
 
      отменяются все точки приостанова.
 
           Пример показывает, как точки приостанова можно устано-
 
      вить, отменить и перезаписать:
 
      DBG>SET BREAK %LINE 15  !Установка точки приостанова 
 
      DBG>SHOW BREAK          !Воспроизведение точки приостанова 
            
      BREAKPOINT AT TOY\%LINE 15
 
      DBG>CANCEL BREAK %LINE 15 !Отмена точки приостанова 
 
      DBG>SHOW BREAK
 
      %DEBUG-I-NOBREAKS, NO BREAKPOINTS ARE SET
 
                       (никакие точки приостанова не установлены)


                                - 60 -
 
                          00152-01 34 07-1
 
 
      DBG>SET BREAK %LINE 15  !Установка точки приостанова 
 
      DBG>SET WATCH %LINE 15  !Установка точки просмотра в
 
                              !этой же ячейке 
 
      DBG>SHOW BREAK          !Точка приостанова перезаписана 
 
      %DEBUG-I-NOBREAKS, NO BREAKPOINTS ARE SET
 
                       (никакие точки приостанова не установлены)
 
      DBG>SHOW WATCH          !Установлена точка просмотра 
 
      WATCHPOINT AT TOY\%LINE 15 FOR 4. BYTES.
 
      (точка просмотра в строке 15 на 4 байта)
 
      DBG>SET BREAK %LINE 15  !Установка точки приостанова 
 
      DBG>SET BREAK/AFTER:5 %LINE 15 !Установка модифицированной
 
                                     !точки приостанова в этой же
 
                                     !ячейке 
 
      DBG>SHOW BREAK                      !Предыдущая точка при-
 
      BREAKPOINT /AFTER:5 AT TOY\%LINE 15 !останова перезаписана 
 
           Нужно отметить, что следующие  команды  перезаписывают
 
      друг   друга,   если    содержат    идентичные    параметры
 
      адресное_выражение:
 
      SET BREAK (во всех формах)  ;
 
      SET TRACE  ;
 
      SET WATCH  .
 
 
 
           3.2.1.1. Командная    последовательность    в    точке
 
      приостанова
 
 
           Eсли необходимо, чтобы отладчик выполнил одну или нес-
 
      колько своих команд сразу после достижения точки приостано-
 
      ва, то пользователь должен указать эти команды в  командной
 
      последовательности DO:
 


                                - 61 -
 
                          00152-01 34 07-1
 
 
      SET BREAK адресное_выражение DO (команда [;KOманда...]).
 
           Независимо от того, является ли последовательность  DO
 
      одной командой, списком команд  или  командной  процедурой,
 
      круглые скобки являются  необходимыми  разделителями.  Если
 
      последовательность DO является списком команд,  то  команды
 
      должны разделяться точкой с запятой (;).
 
           Отладчик выполняет команды из последовательности DO  в
 
      том порядке, в котором они приводятся. Если одна из  команд
 
      в последовательности DO является командной процедурой (под-
 
      раздел 2.6), то отладчик начинает выполнение команд в соот-
 
      ветствующем  файле  тогда,  когда  достигает   спецификации
 
      командного файла (@спецификация_файла) в последовательности
 
      DO. После того, как  отладчик  выполнит  каждую  команду  в
 
      командной процедуре, он  продолжает  выполнение  команд  из
 
      последовательности DO вплоть до окончания  этой  последова-
 
      тельности или до достижения другой спецификации  командного
 
      файла.
 
           Командная последовательность DO может содержать коман-
 
      ды, которые возобновляют  выполнение  программы.  Например,
 
      последовательность  DO  может  содержать  несколько  команд
 
      EXAMINе, сопровождаемых командой GO.
 
           Следует отметить, что отладчик не  выполняет  проверки
 
      синтаксической правильности команд  в  пределах  последова-
 
      тельности DO после выдачи пользователем команды SET  BREAK,
 
      содержащей  такую  последовательность.  Отладчик  проверяет
 
      правильность  синтаксиса  только  тогда,  когда  фактически
 
      выполняет команды последовательности DO  при  приведении  в
 
      действие соответствующей точки приостанова.
 
           Любая команда отладчика, включая команду SET  BREAK  с
 
      командной последовательностью DO, может приводиться в  пос-


                                - 62 -
 
                          00152-01 34 07-1
 
 
      ледовательности DO. Вложение последовательностей DO  допус-
 
      кается до любого уровня (при условии  соблюдения  синтакси-
 
      ческих правил).
 
           На число и тип команд отладчика,  которые  могут  быть
 
      включены в последовательность DO, не накладывается  никаких
 
      ограничений. Если все команды, которые должны быть включены
 
      в эту последовательность, не  умещаются  на  одной  входной
 
      строке, можно указать символ продолжения строки (-) в конце
 
      такой входной строки, а затем нажать клавишу RETURN  (возв-
 
      рат). Таким способом можно продолжать ввод команд в  преде-
 
      лах одной последовательности DO.
 
           Если необходимо,  чтобы  командная  последовательность
 
      выполнялась при определенных условиях, в команду SET  BREAK
 
      включают предложение WHEN:
 
      SET BREAK адресное_выражение WHEN (выражение)-
 
      DO (команда [;команда...])
 
           Предложение WHEN определяет выражение в терминах теку-
 
      щего языка программирования, которое анализируется при дос-
 
      тижении точки приостанова. Если  выражение  имеет  значение
 
      "истина" (TRUE), точка приостанова срабатывает и выполняет-
 
      ся командная последовательность DO. Если  значение  выраже-
 
      ния - "ложь" (FALSE), то точка приостанова не  срабатывает,
 
      и командная последовательность не выполняется.
 
           На приводимом примере  демонстрируются  возможности  и
 
      гибкость командной последовательности DO в точке приостано-
 
      ва:
 
      DBG>SET BREAK %LINE 16 DO (EXAMINE I; EXAMINE R; STEP)
 
      DBG>GO
 
      ROUTINE START AT TOY    !Начало подпрограммы TOY 
 
      BREAK AT TOY\%LINE 16   !приостанов на строке 16 


                                - 63 -
 
                          00152-01 34 07-1
 
 
      TOY\I: 1                !Просмотр I (первая команда
 
                              !последовательности DO) 
 
      TOY\R: 0.0000000E+00    !Просмотр R (вторая команда
 
      START AT TOY\%LINE 16   !последовательности DO) 
 
      STEPPED TO TOY\%LINE 17 !Переход к следующей строке
 
                              !(один шаг; третья команда
 
                              !последовательности DO) 
 
      DBG>SET BREAK %LINE 16 DO (EXAMINE I;EXAMINE R;-
 
      GO %LINE 15)
 
                              !Данная команда вызывает выполнение
 
                              !бесконечного цикла при приведении
 
                              !в действие точки приостанова в
 
                              !строке 16 
 
      DBG>GO %LINE 15         !Начало выполнения 
 
      START AT TOY\%LINE 15
 
      BREAK AT TOY\%LINE 16  !Приведена в действие точка
 
                             !приостанова 
 
      TOY\I: 1               !Просмотр I (команда EXAMINE I) 
 
      TOY\R: 0.0000000E+00   !Просмотр R (команда EXAMINE R) 
 
      START AT TOY\%LINE 15  !Переход к строке 15
 
                             !(команда GO %LINE 15) 
 
      BREAK AT TOY\%LINE 16  !Приведена в действие точка
 
                             !приостанова 
 
      TOY\I: 1               !Команда EXAMINE I 
 
      TOY\R: 0.0000000E+00   !Команда EXAMINE R 
 
      START AT TOY\%LINE 15  !Команда GO %LINE 15
 
      BREAK AT TOY\%LINE 16  !Приведена в действие точка
 
                             !приостанова 
 
      TOY\I: 1               !и т.д.
 
      TOY\R: 0.0000000E+00


                                - 64 -
 
                          00152-01 34 07-1
 
 
      START AT TOY\%LINE 15
 
      BREAK AT TOY\%LINE 16
 
      CTRL/Y                 !Цикл прерван с помощью управляющих
 
      INTERRUPT              !символов CTRL/Y 
 
      (прерывание)
 
      $
 
 
 
           3.2.2. Точки приостанова по исключительной ситуации
 
 
           Событие, возникающее в пределах контекста выполняющей-
 
      ся программы,  может  потребовать  выполнения  программного
 
      обеспечения за пределами  этой  программы.  Наличие  такого
 
      события называется исключительной ситуацией.  Условия  воз-
 
      никновения исключительной  ситуации  имеют  разную  степень
 
      серьезности и  по  разному  воздействуют  на  выполняющуюся
 
      программу.  Примерами   условий   исключительных   ситуаций
 
      являются:
 
           - арифметическое переполнение  или  потеря  значимости
 
      (исчезновение значащих единиц);
 
           - нарушение доступа к памяти;
 
           - недействительный (неправильный) код операции;
 
           - деление на нуль.
 
           Пользователь может задать отладчику рассмотрение  иск-
 
      лючительных ситуаций,  возникающих  в  своей  программе,  в
 
      качестве  точек  приостанова  путем  выдачи  команды:   SET
 
      BREAK/EXCEPTION. Такой же эффект дает команда SET EXCEPTION
 
      BREAK.
 
           В результате данной команды, когда программа пользова-
 
      теля генерирует условие исключительной  ситуации,  отладчик
 
      приостанавливает выполнение программы, сообщает  о  наличии
 


                                - 65 -
 
                          00152-01 34 07-1
 
 
      исключительной ситуации и запрашивает ввод от пользователя.
 
           Таким  образом,  когда  приводится  в  действие  точка
 
      приостанова по исключительной ситуации, пользователь  имеет
 
      возможность  выдачи  команд  отладчика.  Если  пользователь
 
      хочет продолжить выполнение программы, то он может  указать
 
      одну из следующих команд:
 
           - команду GO без параметра адресное_выражение. В  этом
 
      случае отладчик воспринимает и повторно сообщает об  исклю-
 
      чительной  ситуации,  позволяя  таким  образом  выполняться
 
      любым описанным пользователем  обработчикам  исключительных
 
      ситуаций;
 
           - команду GO с параметром адресное_выражение.  В  этом
 
      случае отладчик разрешает продолжить выполнение программы с
 
      указанной ячейки, запрещая таким образом выполнение описан-
 
      ных пользователем обработчиков исключительных ситуаций.
 
           Следует отметить, что нельзя выдавать команду STEP для
 
      возобновления  выполнения  программы  после  приведения   в
 
      действие точки приостанова. В этом контексте  команда  STEP
 
      является недействительной и, будучи выдана, вызывает выдачу
 
      предупредительного сообщения.
 
           Если пользователь не определяет точку  приостанова  по
 
      исключительной   ситуации    с    помощью    команды    SET
 
      BREAK/EXCEPTION или отменяет такую точку с помощью  команды
 
      CANCEL BREAK/EXCEPTION, то условия исключительной ситуации,
 
      генерируемые его программой, обрабатываются следующим обра-
 
      зом:
 
           1) отладчик воспринимает и повторно сообщает об исклю-
 
      чительной ситуации;
 
           2) если пользователь определил обработчик исключитель-
 
      ной ситуации в свой программе, то он выполняется;


                                - 66 -
 
                          00152-01 34 07-1
 
 
           3) если пользователь не определил обработчик  исключи-
 
      тельной ситуации или если определенный обработчик  повторно
 
      сообщает об исключительной ситуации, то выдается диагности-
 
      ческое сообщение и управление передается отладчику, который
 
      после этого воспроизводит подсказку (DBG>).
 
           Следует отметить, что обработчик исключительной ситуа-
 
      ции выполняется вплоть до  появления  одного  из  следующих
 
      условий:
 
           - обработчик "обрабатывает" условие, обеспечивая  воз-
 
      можность продолжения выполнения программы;
 
           - обработчик  повторно  сообщает   об   исключительной
 
      ситуации;
 
           - обработчик встречает  точку  приостанова  или  точку
 
      просмотра;
 
           - обработчик генерирует свою собственную  исключитель-
 
      ную ситуацию;
 
           - обработчик выполняет выход,  заканчивая  (прекращая)
 
      таким образом выполнение программы.
 
           При возникновении исключительной ситуации при  отладке
 
      можно воспользоваться  следующими  лексическими  функциями,
 
      которые определяют (классифицируют)  точки  приостанова  по
 
      исключительной ситуации:
 
           1) %EXC_FACILITY ;
 
           2) %EXC_NAME ;
 
           3) %EXC_NUM ;
 
           4) %EXC_SEVERITY .
 
           Функция %EXC_FACILITY  возвращает  средство  генерации
 
      текущей исключительной ситуации. Например:
 
      DBG>EVALUATE %EXC_FACILITY
 
      "SYSTEM"


                                - 67 -
 
                          00152-01 34 07-1
 
 
      DBG>SET BREAK/EXCEPTION WHEN(%EXC_FACILITY="SYSTEM")
 
           Функция %EXC_NAME возвращает имя текущей  исключитель-
 
      ной ситуации. Например:
 
      DBG>EVALUATE %EXC_NAME
 
      "FLTDIV_F"
 
      DBG>SET BREAK/EXCEPTION WHEN (%EXC_NAME="FLTDIV_F")
 
           Функция %EXC_NUM возвращает номер текущей исключитель-
 
      ной ситуации. Например:
 
      DBG>EVALUATE %EXC_NUM
 
      12
 
      DBG>EVALUATE/CONDITION_VALUE %EXC_NUM
 
      %SYSTEM-F-ACCVIO, ACCESS VIOLATION AT PC VIRTUAL ADDRESS
 
      DBG>SET BREAK/EXCEPTION WHEN (%EXC_NUM=12)
 
           Функция %EXC_SEVERITY возвращает код серьезности  иск-
 
      лючительной ситуации. Например:
 
      DBG>EVALUATE %EXC_SEVERITY
 
      "F"
 
      DBG>SET BREAK/EXCEPTION WHEN (%EXC_SEVERITY="F")
 
 
 
           3.2.3. Точки просмотра
 
 
           Пользователь может задать отладчику просмотр об'екта с
 
      целью оповещения об изменении Eго  значения.  Для  этого  в
 
      качестве параметра в команде SET WATCH пользователь  указы-
 
      вает адресное выражение, которое определяет место  нахожде-
 
      ния соответствующего об'екта. Формат данной команды следую-
 
      щий:
 
      SET WATCH [/квалификатор] адресное_выражение-
 
      [,адресное_выражение,...] [WHEN (выражение)]-
 
      [DO (список_команд)]
 


                                - 68 -
 
                          00152-01 34 07-1
 
 
           В результате этой команды отладчик устанавливает точку
 
      просмотра в ячейке памяти,  которая  определяется  адресным
 
      выражением.
 
           Если об'ект имеет сгенерированный компилятором тип, то
 
      отладчик использует длину в байтах, связанную с этим типом,
 
      для определения длины просматриваемого об'екта. Если об'ект
 
      не имеет сгенерированного компилятором  типа,  то  отладчик
 
      просматривает четыре байта виртуальной  памяти,  начиная  с
 
      байта, который определяется адресным выражением.
 
           Команда SET WATCH может иметь квалификаторы  /AFTER:N,
 
      /SILENT, /SOURCE и /TEMPORARY.
 
           Точка просмотра действует, если выражение в  предложе-
 
      нии WHEN (если оно задано) имеет значение "истина"  (TRUE).
 
      При этом выполняется командная последовательность DO  (если
 
      она также задана). Если значение выражения - "ложь"(FALSE),
 
      то точка просмотра не действует, и командная последователь-
 
      ность DO не выполняется.
 
           Если указана командная последовательность  DO,  но  не
 
      указано предложение WHEN, то отладчик выполняет ее при дос-
 
      тижении заданной точки просмотра (см. подпункт 3.2.1.1).
 
           Когда команда программы вызывает модификацию  просмат-
 
      риваемого об'екта, отладчик выполняет следующие действия:
 
           1) приостанавливает выполнение программы  после  того,
 
      как закончится выполнение такой команды;
 
           2) проверяет значение счетчика AFTER и, если  оно  еще
 
      не достигло  заданного  значения,  возобновляет  выполнение
 
      программы;
 
           3) анализирует выражение WHEN  (если  оно  указано)  и
 
      возобновляет выполнение программы, если его значение "ложь"
 
      (FALSE) для текущего языка программирования;


                                - 69 -
 
                          00152-01 34 07-1
 
 
           4) выдает на терминал имя или адрес ячейки, на которой
 
      приостановлено выполнение;
 
           5) выполняет командную последовательность DO, если она
 
      задана;
 
           6) идентифицирует команду, которая модифицировала этот
 
      об'ект;
 
           7) сообщает старое значение об'екта;
 
           8) сообщает  новое  (т.е.  модифицированное)  значение
 
      об'екта;
 
           9) выдает подсказку DBG>.
 
           Для воспроизведения действующих в данное  время  точек
 
      просмотра необходимо использовать команду SHOW WATCH.
 
           Для отмены точки просмотра следует использовать коман-
 
      ду CANCEL WATCH в формате:
 
      CANCEL WATCH [/квалификатор] [адресное_выражение-
 
      [,адресное_выражение,...]]
 
           Если      пользователь       определяет       параметр
 
      адресное_выражение, то отменяется точка просмотра в ячейке,
 
      определяемой  этим  адресным  выражением.  В  этом   случае
 
      использование квалификатора команды не допускается.
 
           Если пользователь  определяет  командный  квалификатор
 
      /ALL, то отменяются все  точки  просмотра.  В  этом  случае
 
      нельзя указывать параметр адресное_выражение.
 
           Можно устанавливать точки просмотра на целую  совокуп-
 
      ность данных (т.е.  массив  или  запись).  Точка  просмотра
 
      будет срабатывать, если будет изменяться какой-либо элемент
 
      массива или записи. Поэтому нет необходимости устанавливать
 
      точки просмотра на отдельные элементы массива или компонен-
 
      ты записи. Следует заметить,  однако,  что  нельзя  ставить
 
      одну точку просмотра на различные записи.


                                - 70 -
 
                          00152-01 34 07-1
 
 
           Следующий пример  демонстрирует  использование  команд
 
      SET WATCH, SHOW WATCH и CANCEL WATCH:
 
      DBG>SET WATCH RESULT    !Установка точки просмотра в
 
                              !ячейке RESULT..
 
      DBG>SHOW WATCH              !Воспроизведение точек
 
      WATCHPOINT OF TOTAL\RESULT  !просмотра 
 
                                  !Просматриваются 4 байта,
 
                                  !начиная с ячейки
 
                                  !TOTAL\RESULT 
 
      DBG>GO                      !Оповещение о модификации
 
      START AT TOTAL\START+02     !точки просмотра. Следует
 
      WRITE TO TOTAL\RESULT AT PC TOTAL\G03 !отметить,что
 
      OLD VALUE = 0000000 (старое значение) !TOTAL\G03 иден-
 
      NEW VALUE = 00000A66 (новое значение) !тифицирует ячей-
 
                                  !ку команды, которая вы-
 
                                  !звала модификацию ячейки
 
                                  !RESULT 
 
      DBG>SHOW MODE
 
      MODES: SYMBOLIC, D_FLOAT, NOSCREEN, NOKEYPAD !Значения
 
      INPUT  RADIX: HEXADECIMAL   !воспроизводятся в шест-
 
      OUTPUT RADIX: HEXADECIMAL   !надцатеричной форме 
 
                                  !Адресные выражения по
 
                                  !возможности воспроизво-
 
                                  !дятся в символической
 
                                  !форме 
 
      DBG>SHOW WATCH              !Точка просмотра по-преж-
 
      WATCHPOINT AT TOTAL\RESULT FOR 4.BYTES. !нему действует 
 
      DBG>CANCEL WATCH RESULT     !отмена точки просмотра 
 
      DBG>SHOW WATCH              !Воспроизведение текущих
 
      %DEBUG-I-NOWATCHES, NO WATCHPOINTS ARE SET !точек прос-


                                - 71 -
 
                          00152-01 34 07-1
 
 
                                                 !мотра 
 
                         (никакие точки просмотра не установлены)
 
      DBG>SET WATCH ARR           !Установка точки просмотра
 
                                  !на массив ARR 
 
      DBG>GO                      !Точка просмотра срабатывает,
 
      WATCH OF SUBR\ARR AT SUBR\%LINE 12+8 !когда изменяется ка-
 
            OLD VALUE:            !кой-либо элемент массива 
 
            (1):       7          !В данном случае изменился
 
            (2):       12         !третий элемент 
 
            (3):       3
 
            (4):       0
 
            NEW VALUE:
 
            (1):       7
 
            (2):       12
 
            (3):       28
 
            (4):       0
 
      BREAK AT SUBR\%LINE 14
 
 
 
           3.2.3.1. Ограничения на точки просмотра
 
 
           Механизм реализации точек просмотра основан  на  уста-
 
      новке защиты записи для страницы памяти, в  которой  содер-
 
      жится точка просмотра. Следовательно, при попытке  выполне-
 
      ния операции записи на этой странице возникает исключитель-
 
      ная ситуация, которая обрабатывается отладчиком. Он времен-
 
      но снимает защиту страницы для завершения команды  и  затем
 
      определяет, была ли просматриваемая величина  модифицирова-
 
      на.
 
           Нельзя устанавливать точки  просмотра  на  переменные,
 
      расположенные в стеке, потому что возникнут проблемы записи
 


                                - 72 -
 
                          00152-01 34 07-1
 
 
      в стек, т.к. он будет защищен.
 
 
 
           3.3. Контроль за выполнением программы
 
 
           В данном подразделе  описывается,  как  контролировать
 
      выполнение программы путем отслеживания  последовательности
 
      управления программы и воспроизведения  текущего  состояния
 
      вызовов процедур.
 
 
 
           3.3.1. Точки отслеживания
 
 
           Установкой точек отслеживания пользователь может конт-
 
      ролировать последовательность  выполнения  команд  в  своей
 
      программе и, таким образом, проверять непредвиденные  пере-
 
      дачи управления. Более того, точки отслеживания  не  преры-
 
      вают и никаким образом не нарушают процесс выполнения прог-
 
      раммы.
 
           Когда приводится в действие точка отслеживания, отлад-
 
      чик выполняет следующие действия:
 
           1) приостанавливает выполнение программы;
 
           2) проверяет значение счетчика AFTER и, если  оно  еще
 
      не достигло  заданного  значения,  возобновляет  выполнение
 
      программы;
 
           3) вычисляет значение выражения WHEN (если оно  указа-
 
      но) и возобновляет выполнение программы, если его  значение
 
      "ложь" (FALSE) для текущего языка программирования;
 
           4) выдает на терминал имя или адрес ячейки, на которой
 
      приостановлено выполнение;
 
           5) выполняет командную последовательность DO, если она
 
      задана;
 
           6) сообщает о том, что в процессе выполнения программы


                                - 73 -
 
                          00152-01 34 07-1
 
 
      достигнута ячейка отслеживания;
 
           7) возобновляет выполнение программы с точки временной
 
      приостановки.
 
           Для установки точки отслеживания следует  использовать
 
      команду SET TRACE в формате:
 
      SET TRACE [/квалификатор] [адресное_выражение-
 
      [,адресное_выражение,...]] [WHEN (выражение)]-
 
      [DO(список команд)]
 
           Точка отслеживания действует таким образом, что и точ-
 
      ка приостанова, но с той  разницей,  что  здесь  выполнение
 
      возобновляется   сразу   же    после    достижения    точки
 
      OTслеживания. Синтаксис команд SET TRASE и SET BREAK одина-
 
      ков, а также одинаковы используемые квалификаторы и их зна-
 
      чения.
 
           Если пользователь  определяет  командный  квалификатор
 
      /CALL или /BRANCH, то отладчик устанавливает точки отслежи-
 
      вания  во  всех  инструкциях,  которые   являются   членами
 
      семейства инструкций CALL или BRANCH  соответственно  (под-
 
      пункт 3.3.1.1). В этом случае  параметр  адресное_выражение
 
      не должен определяться. Для отслеживания  всех  выполняемых
 
      команд служит команда SET TRACE/INSTRUCTION.
 
           Для просмотра действующих точек  отслеживания  следует
 
      использовать команду SHOW TRACE.
 
           Для отмены одной  или  нескольких  точек  отслеживания
 
      следует использовать команду CANCEL TRACE в формате:
 
      CANCEL TRACE [/квалификатор] [адресное_выражение-
 
                   [адресное_выражение,...]]
 
           Если      пользователь       определяет       параметр
 
      адресное_выражение, то отладчик отменяет точку отслеживания
 
      в ячейке, которая определяется этим адресным выражением.  В


                                - 74 -
 
                          00152-01 34 07-1
 
 
      этом случае квалификатор команды не должен указываться.
 
           Если пользователь  определяет  командный  квалификатор
 
      /CALL или /BRANCH, то отладчик отменяет точки  отслеживания
 
      во всех инструкциях,  которые  являются  членами  семейства
 
      инструкций CALL или BRANCH соответственно. В этом случае не
 
      должен определяться параметр адресное_выражение.
 
           Пример демонстрирует использование команд  SET  TRACE,
 
      SHOW TRACE и CANCEL TRACE:
 
      DBG>SHOW TRACE    !просмотр действующих точек отслеживания 
 
      DEBUG-I-NOTRACES, NO TRACEPOINTS ARE SET, NO OPCODE TRACING
 
                      (точки отслеживания не установлены, код
 
                       операций не отслеживается)
 
      DBG>SET TRACE %LINE 30  !Установка точки отслеживания в
 
                              !строке 30 
 
      DBG>SET BREAK %LINE 60  !Установка точки приостанова в
 
                              !строке 60 
 
      DBG>SHOW TRACE                      !Воспроизведение дейст-
 
      TRACEPOINT AT MEANSUB$MAIN\%LINE 30 !вующих точек отслежи-
 
                                          !вания 
 
      DBG>GO                        !Начало выполнения программы 
 
      ROUTINE START AT MEANSUB$MAIN  !Начало программы 
 
      TRACE AT MEANSUB$MAIN\%LINE 30 !Достигнута точка отслежи-
 
                                     !вания 
 
      BREAK AT MEANSUB$MAIN\%LINE 60 !Достигнута точка приоста-
 
                                     !нова 
 
      DBG>SET TRACE %LINE 40         !Установка другой точки от-
 
                                     !слеживания 
 
      DBG>SHOW TRACE                      !Воспроизведение дейст-
 
      TRACEPOINT AT MEANSUB$MAIN\%LINE 40 !вующих точек отслежи-
 
      TRACEPOINT AT MEANSUB$MAIN\%LINE 30 !вания 


                                - 75 -
 
                          00152-01 34 07-1
 
 
      DBG>GO %LINE 20                !Возобновление выполнения
 
      START AT MEANSUB$MAIN\%LINE 20 !со строки 20 
 
      TRACE AT MEANSUB$MAIN\&LINE 30 !Достигнута точка отслежива-
 
                                     !ния 
 
      TRACE AT MEANSUB$MAIN\%LINE 40 !Достигнута вторая точка
 
                                     !отслеживания 
 
      BREAK AT MEANSUB$MAIN\%LINE 60 !Достигнута точка приоста-
 
                                     !нова 
 
      DBG>CANCEL TRACE %LINE 40      !Отмена одной точки отслежи-
 
                                     !вания 
 
      DBG>SHOW TRACE                      !Воспроизведение дейст-
 
      TRACEPOINT AT MEANSUB$MAIN\%LINE 30 !вующих точек отслежи-
 
                                          !ния 
 
      DBG>CANCEL TRACE/ALL      !Отмена всех точек отслеживания 
 
      DBG>SHOW TRACE !Воспроизведение действующих точек отслежи-
 
                     !вания 
 
      %DEBUG-I-NOTRACES,NO TRACEPOINTS ARE SET,NO OPCODE TRACING
 
      (точки отслеживания не установлены, код операций не отсле-
 
      живается).
 
 
 
           3.3.1.1. Отслеживание кодов операций
 
 
           Отслеживание  кодов  операций  является  отслеживанием
 
      всех инструкций (команд) или семейств инструкций.
 
           При выдаче команды SET TRACE/INSTRUCTION отслеживаются
 
      все команды программы.
 
           При  использовании  команды  SET  TRACE/CALL  отладчик
 
      устанавливает точку отслеживания  на  каждой  из  следующих
 
      инструкций: CALLS, CALLG, BSBW, BSBB, JSB, RSB и RET.
 
           При использовании команды  SET  TRACE/BRANCH  отладчик
 


                                - 76 -
 
                          00152-01 34 07-1
 
 
      устанавливает точку отслеживания  на  каждой  из  следующих
 
      команд:
 
                ACBB       BBS        BLEQ
 
                ACBL       BBSS       BLEQU
 
                ACBQ       BBSSI      BNEQ
 
                ACBD       BEQL       BRB
 
                ACBG       BGEQ       BRW
 
                ACBH       BGEQU      BVC
 
                AOBLEQ     BGTR       BVS
 
                AOBLSS     BGTRU      CASEB
 
                BBC        BLBC       CASEL
 
                BBCC       BLBS       CASEW
 
                BBCCI      BLSS       JMP
 
                BBCS       BLSSU      SOBGEQ
 
                                      SOBGTR
 
           Следует заметить, что можно отслеживать целое семейст-
 
      во    кодов     операций.     Например,     команда     SET
 
      TRACE/INSTRUCTION=(ADDL3,MULL3)  отслеживает  все   команды
 
      ADDL3 и MULL3.
 
           Для просмотра действующих в данное время точек  отсле-
 
      живания следует использовать команду SHOW TRACE.
 
           Для отмены точек отслеживания на инструкциях CALL  или
 
      BRANCH следует использовать команду CANCEL  TRACE  с  соот-
 
      ветствующим квалификатором:
 
      DBG>CANCEL TRACE/CALL
 
      или
 
      DBG>CANCEL TRACE/BRANCH  .
 
           Следует отметить, что процесс отслеживания кода опера-
 
      ций заметно замедляет выполнение программы.
 
           Пример  демонстрирует   использование   квалификаторов


                                - 77 -
 
                          00152-01 34 07-1
 
 
      /CALL и /BRANCH в командах SET TRACE, SHOW TRACE  и  CANCEL
 
      TRACE:
 
      DBG>SET TRACE/CALL         !Отслеживание инструкций CALL
 
      DBG>SHOW TRACE             !Воспроизведение действующих
 
                                 !точек отслеживания 
 
      TRACING /CALL INSTRUCTION: CALLS,CALLG, BSBW, BSBB, JSB,
 
      RSB AND RET
 
      DBG>GO %LINE 20            !Начало выполнения программы 
 
      START AT MEANSUB$MAIN\%LINE 20
 
      TRACE AT PC MEANSUB$MAIN\%LINE 30 +9: CALLS \#1,
 
      L^BAS$INIT_GOSUB
 
      TRACE AT PC 24566:  JSB    @B^4(AP)
 
      TRACE AT PC MEANSUB$MAIN\%LINE 200 +7: CALLS \#1,
 
      L^BAS$PRINT
 
      TRACE AT PC 24918: CALLS  #4,W^24987
 
      TRACE AT PC 25003: JSB  L^8352
 
      TRACE AT PC 8407: JSB  L^94721
 
      TRACE AT PC 94877: RSB
 
      TRACE AT PC 8492: RSB
 
      TRACE AT PC 25190: JSB  L^34295
 
      TRACE AT PC 34333: RSB
 
               .
 
               .
 
               .
 
      DBG>SHOW TRACE             !Воспроизведение действующих
 
                                 !точек отслеживания 
 
      TRACING /CALL INSTRUCTION: CALLS, CALLG, BSBW, BSBB,
 
      JSB, RSB AND RET
 
      DBG>SET TRACE/BRANCH  !Отслеживание всех инструкций BRANCH 
 
      DBG>SHOW TRACE        !Воспроизведение действующих точек


                                - 78 -
                                     
                          00152-01 34 07-1
 
 
                            !отслеживания 
 
      TRACING /CALL INSTRUCTION: CALLS, CALLG, BSBW, BSBB, JSB,
 
      RSB AND RET
 
      (отслеживание инструкций /CALL)
 
      TRACING /BRANH INSTRUCTIONS: BNEQ, BEQL, BGTR, BLEQ, BGEQ,
 
      BLSS, BGTRU,
 
              BLEQU, BVC, BVS, BGEQU, BLSSU, BRB, BRW, JMP, BBS,
 
      BBC, BBSS, BBCS
 
              BBSC, BBCC, BBSSI, BBCCI, BLBS, BLBC, ACBB, ACBW,
 
      ACBL, ACBF, ACBD,
 
              ACBG, ACBH, AOBLEQ, AOBLSS, SOBGEQ, SOBGTR, CASEB,
 
      CASEW AND CASEL
 
      (отслеживание инструкций /BRANCH)
 
 
 
      DBG>GO %LINE 20                !Возобновление выполнения
 
      START AT MEANSUB$MAIN\%LINE 20 !программы со строки 20 
 
      TRACE AT PC MEANSUB$MAIN\%LINE 30 + 9: CALLS \#1,
 
      L^BAS$INIT_GOSUB
 
      ROUTINE TRACE AT PC BAS$INIT_GOSUB: JMP L^24510
 
      TRACE AT PC 24522: BBC #11,B^-26(R0),24559
 
      TRACE AT PC 24566: JSB @B^4(AP)
 
      TRACE AT PC MEANSUB$MAIN\%LINE 200 +7:
 
      CALLS \#1,L^BAS$PRINT
 
      ROUTINE TRACE AT PC BAS$PRINT: JMP L^24896
 
      TRACE AT PC 24906: BNEQ 24913
 
      TRACE AT PC 24911: BRB 24916
 
      TRACE AT PC 24918: CALLS #4,W^24987
 
      TRACE AT PC 25003: JSB L^8352
 
      TRACE AT PC 8359: BGTR 8366
 
      TRACE AT PC 8364: BGEQ 8377


                                - 79 -
 
                          00152-01 34 07-1
 
 
      TRACE AT PC 8391: BEQL 8407
 
      TRACE AT PC 8407: JSB L^94721
 
      TRACE AT PC 94728: BLBS L^103336,94740
 
      TRACE AT PC 94752: BBCS R2,L^104364,94762
 
      TRACE AT PC 94772: BEQL 94790
 
      TRACE AT PC 94804: BEQL 94817
 
      TRACE AT PC 94815: BRB 94829
 
      TRACE AT PC 94860: BLBC B^4(SP),94869
 
      TRACE AT PC 94877: RSB
 
      TRACE AT PC 8413:CASEL R0,#1,#2
 
                                      8431,
 
                                      8431,
 
                                      8458
 
      TRACE AT PC 8437: BNEQ 8444
 
                .
 
                .
 
                .
 
      DBG>CANCEL TRACE/ALL  !Отмена всех точек отслеживания 
 
      DBG>SHOW TRACE        !Воспроизведение действующих точек
 
                            !отслеживания 
 
      %DEBUG-I-NOTRACES, NO TRACEPOINTS ARE SET, NO OPCODE
 
      TRACING
 
      (никакие точки отслеживания не установлены, код операций
 
      не отслеживается)
 


                                - 80 -
 
                          00152-01 34 07-1
 
 
           3.3.2. Команда SHOW CALLS
 
 
           Когда процедура А  вызывает  процедуру  В  (с  помощью
 
      инструкции CALL), система МОС ВП сохраняет информацию отно-
 
      сительно состояния программы процедуры А во время  передачи
 
      управления процедуре В. Эта информация записывается в стеке
 
      в кадр вызова для процедуры В.  Таким  образом,  выполнение
 
      инструкции CALL приводит  к  построению  кадра  вызова  для
 
      вызываемой подпрограммы. Этот кадр вызова содержит информа-
 
      цию относительно вызывающей подпрограммы.
 
           Если процедура В вызывает процедуру С, то система  мос
 
      вп создает кадр вызова для процедуры  С.  Кадр  вызова  для
 
      процедуры С создается в верхней части кадра вызова для про-
 
      цедуры В. Другими словами, кадр вызова для самой  последней
 
      вызываемой процедуры находится в верхней части стека.
 
           Когда подпрограмма  возвращается  к  источнику  своего
 
      вызова, кадр вызова для этой подпрограммы удаляется из сте-
 
      ка. Таким образом, когда процедура С заканчивается и управ-
 
      ление возвращается к процедуре В, кадр вызова для процедуры
 
      С выводится из стека.
 
           Команда SHOW CALLS обеспечивает  получение  информации
 
      относительно текущей последовательности действующих вызовов
 
      процедур или относительно текущего числа  кадров  вызова  в
 
      стеке.  Например,  если  программа  пользователя   содержит
 
      рекурсивную (повторяющуюся  или  с  возможностью  повторных
 
      вызовов) подпрограмму, пользователь может применить команду
 
      SHOW CALLS для просмотра цепочки рекурсии.
 
           Формат данной команды:
 
      SHOW CALLS [N]  .
 
           Необязательный параметр N определяет счет числа  вызо-
 


                                - 81 -
 
                          00152-01 34 07-1
 
 
      вов или число кадров вызова, которые должны быть  воспроиз-
 
      ведены, и может быть десятичным  целым  числом  в  диапазо-
 
      не 0-32767. Если пользователь не определяет этот  параметр,
 
      то  воспроизводится  информация  относительно  всех  кадров
 
      вызова. Если счет числа вызовов, представляемый  параметром
 
      N, превышает текущее число кадров вызова, то воспроизводит-
 
      ся информация относительно всех кадров  вызова.  Если  счет
 
      числа вызовов равен нулю, то команда принимается, но  ника-
 
      кая информация не воспроизводится. В противном случае восп-
 
      роизводится информация о том числе кадров  вызова,  которое
 
      определяется параметром N.
 
           Для каждого кадра вызова отладчик  воспроизводит  одну
 
      строку информации. Первая воспроизводимая  строка  содержит
 
      информацию относительно верхнего кадра вызова (т.е.  предс-
 
      тавляет самую  последнюю  вызванную  процедуру);  следующая
 
      строка содержит информацию относительно предыдущей по  вре-
 
      мени вызова процедуре и т.д.
 
           Каждая     строка     информации,      воспроизводимая
 
      отладчиком,содержит следующие элементы:
 
           - имя модуля, в котором содержится вызванная  подпрог-
 
      рамма. Если модуль установлен, то отладчик размещает  звез-
 
      дочку слева от имени модуля;
 
           - имя вызванной подпрограммы;
 
           - номер строки вызова (только для тех языков  програм-
 
      мирования, в которых используются номера строк);
 
           - значение счетчика команд рс в вызывающей подпрограм-
 
      ме во время передачи  управления  вызываемой  подпрограмме.
 
      Следует  отметить,  что  эта  величина  представляет  собой
 
      командную ячейку, которая следует  за  инструкцией  вызова.
 
      Величина счетчика рс выражается двумя способами: как  абсо-


                                - 82 -
 
                          00152-01 34 07-1
 
 
      лютный виртуальный адрес и как  виртуальный  адрес  относи-
 
      тельно виртуального адреса имени данной подпрограммы.
 
           Надо сказать, что если даже программа пользователя  не
 
      содержит вызовов процедур, отладчик воспроизводит  активный
 
      вызов при выдаче команды SHOW CALLS. Это связано с тем, что
 
      программа пользователя имеет кадр стека, созданный для  нее
 
      во время первого запуска.
 
           TAKим образом, если отладчик отвечает при выдаче поль-
 
      зователем команды SHOW CALLS, что активные вызовы  отсутст-
 
      вуют, то это  означает,  что  либо  программа  пользователя
 
      закончилась, либо содержимое стека испорчено.
 
           Пример иллюстрирует использование команды SHOW CALLS:
 
      DBG>STEP
 
      START AT SUB2\%LINE 15
 
      STEPPED TO SUB2\%LINE 16
 
      DBG>SHOW CALLS           !Воспроизведение активных
 
                               !вызовов процедур
 
      MODULE NAME   ROUTINE NAME   LINE   REL PC     ABS PC
 
 
 
        SUB2           SUB2                 00000002   0000085A
 
      * SUB1           SUB1            5    00000014   00000854
 
      * MAIN           MAIN           10    0000002C   0000082C
 
                                  !Процедура SUB2 выполняется
 
                                  !в данный момент. Она
 
                                  !была вызвана процедурой SUB1,
 
                                  !а процедура SUB1 была вызвана
 
                                  !программой MAIN
 
      DBG>GO                      !Продолжение выполнения
 
                                  !программы
 
      START AT 19351


                                - 83 -
 
                          00152-01 34 07-1
 
 
      %DEBUG-I-EXITSTATUS, IS '%SYSTEM-S-NORMAL, NORMAL
 
                              SUCCESSFUL COMPLETION'
 
                             (нормальное успешное окончание)
 
      DBG>SHOW CALLS
 
      %DEBUG-W-NOCALLS, NO ACTIVE CALL FRAMES
 
                          (кадры активных вызовов отсутствуют)
 
                                  !Программа закончена
 
 
 
           3.4. Взаимосвязанные функции квалификаторов
 
 
           Большинство квалификаторов,  которые  воздействуют  на
 
      команды SET BREAK, SET TRACE, SET STEP, SET  WATCH  и  STEP
 
      имеют схожие функции.  Они  могут  быть  разделены  на  две
 
      основные категории: квалификаторы, которые указывают ячейку
 
      программы, и квалификаторы, которые воздействуют на выводи-
 
      мую отладчиком информацию.
 
 
 
           3.4.1. Квалификаторы, определяющие ячейку программы
 
 
           Первая группа квалификаторов, которые являются  общими
 
      для команд SET BREAK, SET TRACE и STEP, следующая:
 
           - /BRANCH ;
 
           - /CALL ;
 
           - /EXCEPTION ;
 
           - /INSTRUCTION ;
 
           - /INSTRUCTION=код_операции ;
 
           - /LINE ;
 
           - /RETURN адрес .
 
           Когда эти квалификаторы используются с  командами  SET
 
      BREAK и SET TRACE они подсказывают отладчику, где  произво-
 
      дить останов, и поэтому занимают место адресного выражения.


                                - 84 -
 
                          00152-01 34 07-1
 
 
      Например,  команда  SET  BREAK/INSTRUCTION=ADDL3  прерывает
 
      программу на каждой инструкции ADDL3.
 
           Когда эти квалификаторы используются с командой  STEP,
 
      они подсказывают отладчику размер шага (например, к следую-
 
      щей инструкции ADDL3).
 
           Указанные семь квалификаторов образуют взаимоисключаю-
 
      щую группу. Например, если использовать  команду  SET  STEP
 
      CALL, но позже указать команду SET STEP LINE, то  установка
 
      LINE заменяет установку CALL.
 
 
 
           3.4.2. Квалификаторы вывода информации
 
 
           Вторая группа квалификаторов, которые являются  общими
 
      для команд SET BREAK, SET TRACE, SET WATCH и STEP,  следую-
 
      щая:
 
           - /SILENT ;
 
           - /NOSILENT ;
 
           - /SOURCE ;
 
           - /NOSOURCE .
 
           Квалификатор /SILENT подавляет вывод информации,  если
 
      имеется точка приостанова,  точка  отслеживания  или  точка
 
      просмотра. Данное свойство особенно полезно с оператором DO
 
      в команде SET BREAK, SET TRACE  или  SET  WATCH.  Например,
 
      пользователь должен установить оператор DO на  команде  SET
 
      TRACE для счета количества прохождений данной ячейки  прог-
 
      раммой пользователя. Пользователь может установить квалифи-
 
      катор /SILENT и, таким образом, он не будет смотреть  сооб-
 
      щение об отслеживании каждый раз, когда  встречается  точка
 
      отслеживания:
 


                                - 85 -
 
                          00152-01 34 07-1
 
 
      DBG>DEFINE/VALUE COUNT = 0
 
      DBG>SET TRA/SIL %LINE 10 DO(DEF/VAL COUNT=COUNT+1)
 
           Квалификатор /SOURSE управляет  исходным  кодом.  Если
 
      пользователь указывает команду SET STEP SOURSE, то отладчик
 
      воспроизводит исходный код на каждом шаге, в точке приоста-
 
      нова, точке отслеживания и точке просмотра.
 
           Однако пользователь может отменять установку  шага  по
 
      умолчанию, указывая квалификатор.
 
           Например, если пользователь хочет увидеть исходный код
 
      в определенной точке приостанова, но по умолчанию действует
 
      NOSOURSE, то можно использовать команду SET BREAK/SOURSE.
 
 
 
           3.5. Обработчики выхода
 
 
           Обработчики выхода представляют собой процедуры, кото-
 
      рые вызываются в тех случаях, когда образ запрашивает  сис-
 
      темное служебное  средство  $EXIT.  Программа  пользователя
 
      может затребовать один или несколько  обработчиков  выхода.
 
      Отладчик всегда применяет свой собственный обработчик выхо-
 
      да.
 
           В данном подразделе описывается последовательность,  в
 
      соответствии  с  которой  выполняются  обработчики  выхода.
 
      Здесь же описываются методы отладки этих обработчиков.
 
 
 
           3.5.1. Последовательность   выполнения    обработчиков
 
      выхода
 
 
           При окончании выполнения программы обработчики  выхода
 
      выполняются в порядке обратного  магазинного  списка,  т.е.
 
      самый последний  описанный  обработчик  выхода  выполняется
 
      первым, затем выполняется предыдущий обработчик выхо-


                                - 86 -
 
                          00152-01 34 07-1
 
 
      да и т.д..
 
           Обработчик выхода отладчика первым вводится в  стек  и
 
      последним выводится из него. Следовательно,  при  окончании
 
      программы обработчик  выхода  отладчика  выполняется  после
 
      отработки всех заявленных пользователем обработчиков  выхо-
 
      да.
 
 
 
           3.5.2. Отладка обработчиков выхода
 
 
           Для отладки  обработчиков  выхода  необходимо  сначала
 
      установить в нем точку приостанова. Затем  следует  обеспе-
 
      чить выполнение этого обработчика выхода путем включения  в
 
      программу команды, которая вызывает обработчик выхода,  или
 
      путем разрешения окончания программы. (При окончании  прог-
 
      раммы система начинает  выполнение  обработчиков  выхода  в
 
      порядке обратного магазинного списка.) когда  будет  выпол-
 
      няться обработчик выхода, приведется в действие  соответст-
 
      вующая точка приостанова и управление перейдет к отладчику,
 
      который выдаст подсказку  DBG>.  После  этого  пользователь
 
      может вводить команды отладчика.
 
 
 
           3.5.3. Просмотр обработчиков выхода
 
 
           Команда SHOW EXIT_HANDLERS  воспроизводит  обработчики
 
      выхода, об'явленные программой  пользователя.  Подпрограммы
 
      обработчиков выхода воспроизводятся в той последовательнос-
 
      ти, в которой они будут вызываться  (а  именно,  последними
 
      вводятся и первыми выводятся). Имя подпрограммы воспроизво-
 
      дится , если возможно,  символически,  в  противном  случае
 
      воспроизводится ее адрес. Обработчики выхода  отладчика  не
 
      воспроизводятся, например:


                                - 87 -
 
                          00152-01 34 07-1
 
 
      DBG>SHOW EXIT_HANDLERS
 
      EXIT HANDLER AT STACKS/CLEANUP.
 
 
 
 
              4. Символические имена и их интерпретация
 
 
 
           В контексте отладки символические  имена  представляют
 
      собой цепочки символов, из которых состоят файлы, программ-
 
      ные модули,  подпрограммы,  ячейки  программы  (программные
 
      ячейки), переменные, массивы или любые  другие  программные
 
      единицы. В данном разделе описывается  то,  что  необходимо
 
      знать  пользователю  относительно  символических  имен  для
 
      успешной отладки своих программ.
 
 
 
           4.1. Символическая отладка
 
 
           Символическая отладка как термин  означает  отладку  с
 
      использованием символических имен вместо виртуальных  адре-
 
      сов для обращения к ячейкам памяти.
 
           Для того, чтобы отладчик мог интерпретировать символи-
 
      ческие имена, информация относительно них (в форме символь-
 
      ных записей) должна присутствовать в выполняемом образе  во
 
      время его выполнения.
 
           Пользователь управляет тем,  какие  символьные  записи
 
      используются во время выполнения, путем выдачи квалификато-
 
      ра /DEBUG с командами компилирования и компоновки.
 
           По умолчанию символьные записи для информации обратно-
 
      го отслеживания доступны во  время  выполнения.  Информация
 
      обратного отслеживания состоит из символьных записей, кото-
 
      рые описывают имена модулей, имена подпрограмм и  присвоен-
 
      ные компилятором номера строк. Информация обратного  отсле-


                                - 88 -
 
                          00152-01 34 07-1
 
 
      живания используется как отладчиком, так и утилитой  обрат-
 
      ного отслеживания. Утилита обратного  отслеживания  исполь-
 
      зует эти символьные записи для воспроизведения стека вызова
 
      при аварийном завершении программы.
 
           На рис. 2 показано воспроизведение обратного  отслежи-
 
      вания стека вызова.
 
 
 
 
                   Информация обратного отслеживания
 
 
 
       %PAS-F-ERRACCFIL, ERROR IN ACCESSING FILE PAS$OUTPUT
 
       %PAS-F-ERROPECRE, ERROR OPENING/CREATING FILE
 
       %RMS-F-FNM, ERROR IN FILE NAME
 
       %TRаCE-F-TRACEBACK, SYMBOLIC STACK DUMP FOLLOWS
 
 
 
       Имя модуля      Имя      Строка Относительный Абсолютный
 
                      подпрог-            счетчик      счетчик
 
                       раммы                          программы
 
 
 
       PAS$IO_BASIC  _PAS$CODE           00000192     00001CED
 
       PAS$IO_BASIC  _PAS$CODE           0000054D     000020A8
 
       PAS$IO_BASIC  _PAS$CODE           0000028B     00001DE6
 
       EIGHTQUEENS   EIGHTQUEENS  59     00000020     000005A1
 
 
                                Рис. 2
 
 
           Для предотвращения включения  символьных  записей  для
 
      информации обратного отслеживания в выполняемый образ зада-
 
      чи  пользователь  может  указать  квалификатор  /NODEBUG  с
 
      командой компилирования  или  квалификатор  /NOTRACEBACK  с
 
      командой компоновки (LINK). Следует, однако, отметить,  что
 


                                - 89 -
 
                          00152-01 34 07-1
 
 
      определение  последнего   квалификатора   запрещает   также
 
      использование отладчика. В общем случае, если  пользователь
 
      намеревается отлаживать свою программу,  то  ему  требуется
 
      включение информации обратного отслеживания  в  выполняемый
 
      образ. С другой стороны, когда программа пользователя  пол-
 
      ностью отлажена, он может предотвратить включение  информа-
 
      ции обратного отслеживания в выполняемый образ для уменьше-
 
      ния размера файла соответствующего образа.
 
           Однако, даже если  требуемые  символьные  записи  при-
 
      сутствуют в выполняемом  образе  во  время  выполнения,  то
 
      отладчик сможет получать к ним доступ только в том  случае,
 
      если они находятся в таблице RST. Для занесения символичес-
 
      ких записей в эту  таблицу  пользователь  должен  применить
 
      команду SET MODULE (см. п. 4.5.2).
 
           Затем, при условии, что  требуемые  символьные  записи
 
      присутствуют в таблице  RST,  может  оказаться  необходимым
 
      также определение программной области (диапазона или облас-
 
      ти действия), в которой будет интерпретироваться конкретное
 
      символическое имя. Например, одинаковые символические  име-
 
      на, но описанные в разных подпрограммах, должны быть  отде-
 
      лены друг от друга. В таком случае следует добавить к имени
 
      имя пути (PATHNAME) или использовать команду SET SCOPE  для
 
      определения его области действия (подраздел 4.4).
 
 
 
           4.2. Используемые  отладчиком  таблицы   символических
 
      имен
 
 
           Таблицы символических имен содержат символьные записи,
 
      которые используются  отладчиком  для  связи  символических
 
      имен с ячейками программы (т.е. с  виртуальными  адресами).
 


                                - 90 -
 
                          00152-01 34 07-1
 
 
      Кроме того, с помощью некоторых символьных записей отладчик
 
      может связывать атрибуты  с  ячейкой  программы  (например,
 
      такие атрибуты, как длина ячейки и ее тип данных).
 
           Отладчик использует три таблицы символических имен:
 
           1) таблицу символических имен отладки (DST);
 
           2) таблицу глобальных символических имен (GST);
 
           3) таблицу текущих символических имен (RST).
 
 
 
           4.2.1. Таблица символических имен отладки
 
 
           Когда программа компоновки создает выполняемый  образ,
 
      она создает также таблицу символических имен отладки (DST),
 
      если   только   пользователь   не    указал    квалификатор
 
      /NOTRACEBACK с командой LINK. Программа компоновки включает
 
      таблицу DST в выполняемый образ.
 
           Если  пользователь  указывает  квалификатор  /DEBUG  с
 
      командой LINK, то программа компоновки включает  в  таблицу
 
      DST все символьные  записи,  которые  имеются  в  об'ектном
 
      модуле (или об'ектных модулях), из которого программа  ком-
 
      поновки создает выполняемый образ. Таким образом, если сим-
 
      вольные записи для локальных символических имен  имеются  в
 
      об'ектном модуле (или модулях) (так как пользователь  опре-
 
      делил квалификатор /DEBUG во время  компилирования),  то  в
 
      таблице DST будут содержаться символьные записи для локаль-
 
      ных символических имен, а также  для  информации  обратного
 
      отслеживания.
 
           Если пользователь не указывает квалификатор  /DEBUG  с
 
      командой LINK, то программа компоновки включает только сим-
 
      вольные записи для информации обратного отслеживания. Таким
 
      образом, даже если символьные записи локальных имен и  при-
 


                                - 91 -
 
                          00152-01 34 07-1
 
 
      сутствуют в об'ектном модуле (или в об'ектных модулях), они
 
      не включаются в выполняемый образ.
 
           Символьная запись таблицы DST состоит обычно из  имени
 
      (символического), его типа, длины, а также его значения или
 
      адреса. Информация о типе может просто определять  имя  как
 
      имя подпрограммы или метки, а может также определять  более
 
      или менее сложный тип  данных.  Аналогично  этому  адресная
 
      информация может быть простым виртуальным адресом или  зна-
 
      чением, но также может определять более или  менее  сложный
 
      способ вычисления адреса символического имени.
 
           После запуска отладчик использует записи в таблице DST
 
      для  создания  таблицы  текущих  символических  имен  (RST)
 
      (п. 4.3.3).
 
 
 
           4.2.2. Таблица глобальных символических имен
 
 
           Когда программа компоновки создает выполняемый  образ,
 
      она создает также  таблицу  глобальных  символических  имен
 
      (GST). Программа компоновки включает таблицу  GST  в  образ
 
      только в том случае, если вместе с командой LINK был указан
 
      квалификатор /DEBUG.
 
           Программа компоновки создает  таблицу  GST  на  основе
 
      своей внутренней таблицы символических имен.  В  результате
 
      этого символьные записи в таблице GST  содержат  не  больше
 
      информации, чем та, которая требуется программе  компоновки
 
      для выполнения своей задачи. Символьные  записи  в  таблице
 
      GST описывают все глобальные имена в образе, такие как име-
 
      на подпрограмм, входные точки процедур и глобальных данных.
 
      Символьные записи для  этих  имен  связывают  символические
 
      имена с виртуальными адресами или величинами, но не  содер-
 


                                - 92 -
 
                          00152-01 34 07-1
 
 
      жат информации относительно типов данных. Информация отно-
 
      Cительно  содержимого  и  формата  этих записей  содержится
 
      в [2].
 
           Отладчик использует таблицу GST только в  том  случае,
 
      если не может найти требуемой  информации  в  таблице  DST.
 
      Если имя представлено и в таблице GST, и в таблице DST,  то
 
      символьная запись в таблице DST обычно содержит более  под-
 
      робную информацию относительно этого имени.
 
 
 
           4.2.3. Таблица текущих символических имен
 
 
           Когда отладчик приводится в действие во время выполне-
 
      ния, он использует имеющиеся в таблицах DST и GST  символь-
 
      ные записи для генерации элементов таблицы текущих символи-
 
      ческих имен (RST).
 
           Таблица RST  обеспечивает  для  отладчика  возможность
 
      произвольного доступа  к  символическим  именам  в  течении
 
      сеанса отладки. Ее назначение состоит в обеспечении  эффек-
 
      тивного доступа к символьным записям, которые содержатся  в
 
      таблицах DST и GST. Когда пользователь приводит символичес-
 
      кое имя в команде отладчика, отладчик просматривает таблицу
 
      RST в поиске информации, которая требуется для  интерпрета-
 
      ции данного имени. Если для этого имени  запись  в  таблице
 
      RST отсутствует, то пользователь  не  может  применить  это
 
      имя.
 
           Когда отладчик инициализируется во время запуска прог-
 
      раммы, он выделяет достаточное количество памяти для  того,
 
      чтобы таблица RST могла  содержать  символьные  записи  для
 
      шести приблизительно самых крупных модулей. Однако  система
 
      МОС ВП не допускает распределения памяти для  таблицы  RST,
 


                                - 93 -
 
                          00152-01 34 07-1
 
 
      если такое распределение приводит к тому, что процесс  пре-
 
      вышает выделенную ему часть виртуального  адресного  прост-
 
      ранства, которая определяется системными параметрами.
 
           При запуске отладчика символьные записи для всех моду-
 
      лей не включаются автоматически в таблицу RST. Если  отлад-
 
      чик приводится в действие с помощью команды RUN, то  в  эту
 
      таблицу включаются символьные записи для того модуля, кото-
 
      рый содержит адрес передачи.  Если  отладчик  приводится  в
 
      действие с помощью команды DEBUG, то в  эту  таблицу  вклю-
 
      чаются символьные записи для  модуля,  содержащего  текущее
 
      значение счетчика программы (PC).
 
           Символьные записи для  всех  остальных  модулей  могут
 
      быть включены в данную таблицу "установкой модуля".
 
           "Установка модуля" есть процесс,  с  помощью  которого
 
      все символьные записи  определенного  модуля  включаются  в
 
      таблицу RST. Установка модуля делает доступными символичес-
 
      кие имена модуля для команд отладчика и  выполняется  двумя
 
      путями:  автоматически,  используя  динамическую  установку
 
      модуля, и "вручную", используя команду SET MODULE.
 
           Динамическая установка модуля разрешена  по  умолчанию
 
      при первоначальном вызове отладчика. При динамической уста-
 
      новке модуля отладчик автоматически  устанавливает  опреде-
 
      ленные модули для пользователя: как только отладчик  выдаст
 
      свой запрос (как только отладчик  прервет  выполнение),  он
 
      автоматически  устанавливает  модуль,  содержащий  значение
 
      счетчика PC, и выдает информационное сообщение. Если модуль
 
      уже установлен, то динамическая установка модуля не  дейст-
 
      вует. Например, предположим, что пользователь "находится" у
 
      вызова подпрограммы SUBR и решает "войти" в нее:
 


                                - 94 -
 
                          00152-01 34 07-1
 
 
      DBG>STEP/INTO
 
      STEPPED TO ROUTINE SUBR
 
      %DEBUG-I-DYNMODSET, SETTING MODULE SUBR
 
           Динамическая установка  модуля,  устанавливая  модуль,
 
      содержащий текущее значение PC,  делает  все  символические
 
      имена этого модуля доступными для команд отладчика.
 
           Если пользователь хочет установить модуль, который  не
 
      был установлен динамически  (для  доступа  к  символическим
 
      именам в  произвольных  модулях),  необходимо  использовать
 
      команду SET MODULE. Например:
 
      DBG>EXAMINE X
 
      %DEBUG-W-NOSYMBOL, SYMBOL 'X' IS NOT IN THE SYMBOL TABLE
 
      DBG>SET MODULE SWAP
 
      DBG>EXAMINE X
 
      SWAP\X: 17
 
           Записи могут быть исключены из таблицы RST  с  помощью
 
      команды CANCEL  MODULE.  Исключение  записей  символических
 
      имен одного или нескольких модулей  освобождает  в  таблице
 
      RST место для записей символических имен других модулей.
 
           Следует отметить, что  динамическая  установка  модуля
 
      облегчает использование отладчика, однако, она может замед-
 
      лить работу отладчика по мере увеличения числа используемых
 
      модулей. Отладчик сам не убирает модули пользователя.  Если
 
      отладка становится усложненной, пользователь может выбороч-
 
      но убрать модули командой CANCEL MODULE или выключить дина-
 
      мическую установку, используя команду SET  MODE  NODYNAMIC.
 
      Повторно разрешить  динамическую  установку  модулей  можно
 
      командой SET MODE DYNAMIC.
 
           Если отладчик не может найти информации, которая  тре-
 
      буется ему для интерпретации  некоторого  имени,  то  имеет


                                - 95 -
 
                          00152-01 34 07-1
 
 
      место одно из условий:
 
           - указание символического имени - неправильно. В  этом
 
      случае пользователь может выполнить его проверку на опечат-
 
      ки и синтаксические ошибки и исправить эти ошибки в  случае
 
      обнаружения;
 
           - обращение неоднозначно. Это означает, что  указанное
 
      символическое имя относится к более чем одному  об'екту.  В
 
      этом случае  пользователь  может  обеспечить  однозначность
 
      путем определения символического имени с  приставкой  имени
 
      пути или путем применения команды SET SCOPE;
 
           - символьные записи  для  модуля,  содержащего  данное
 
      имя, отсутствуют в таблице RST. В таком случае пользователь
 
      может выдать команду SET MODULE  для  включения  символьных
 
      записей для соответствующего модуля в таблицу;
 
           - символьные записи для данного  имени  отсутствуют  в
 
      выполняемом образе. В таком случае  пользователь  не  может
 
      применять это имя в течение сеанса отладки. Для использова-
 
      ния этого символического имени  следует  снова  скомпилиро-
 
      вать, скомпоновать и выполнить соответствующую программу  с
 
      использованием квалификатора /DEBUG (пп. 4.2.1 и 4.2.2).
 
 
 
           4.3. Типы символических имен
 
 
           Символические имена отличаются друг от друга не только
 
      тем, что они представляют, но также и контекстами, в  кото-
 
      рых они могут интерпретироваться.
 
           В данном подразделе описываются:
 
           - имена, которые всегда могут быть интерпретированы  в
 
      сеансе отладки;
 
           - имена, которые могут быть интерпретированы в  сеансе
 


                                - 96 -
 
                          00152-01 34 07-1
 
 
      отладки в том случае,  если  пользователь  определит  их  в
 
      течение этого сеанса;
 
           - имена, интерпретация которых зависит от многих  фак-
 
      торов, таких как указание  квалификатора  /DEBUG  во  время
 
      компилирования и наличия  определенных  символических  имен
 
      модулей в таблице RST.
 
 
 
           4.3.1. Постоянные символические имена отладчика
 
 
           Постоянными символическими именами отладчика  являются
 
      те имена, которые  известны  отладчику  в  любом  контексте
 
      отладки. Таким образом, их можно использовать в любое время
 
      сеанса отладки. Список таких имен отладчика и соответствую-
 
      щих им элементов (об'ектов) следующий:
 
           - %R, сопровождаемое числом от  нуля  до  одиннадцати,
 
      представляет соответствующий общий регистр, например,  %R0,
 
      %R1, %R2, %R3, %R4, %R5,..., %R11;
 
           - %PC представляет счетчик команд;
 
           - %SP представляет указатель стека;
 
           - %AP представляет указатель аргумента;
 
           - %FP представляет указатель кадра;
 
           - %PSL представляет длинное слово состояния  процессо-
 
      ра;
 
           - точка (.) представляет текущий об'ект  или  элемент.
 
      То же самое делает  символическое  имя  %CURLOC.  Их  можно
 
      использовать для обращения к  последней  ячейке  программы,
 
      которая выбиралась последней командой EXAMINE  или  DEPOSIT
 
      (п. 5.2.6);
 
           - тильда (^) представляет  об'ект,  который  логически
 
      предшествует текущему об'екту или  элементу;  то  же  самое
 


                                - 97 -
 
                          00152-01 34 07-1
 
 
      делает имя %PREVLOC;
 
           - обратная  косая  черта  (\)  представляет  величину,
 
      воспроизведенную последними командами EVALUATE, EXAMINE или
 
      DEPOSIT. Пользователь также может применить имя %CURVAL;
 
           - <RET> представляет  следующую  ячейку.  Пользователь
 
      также может применить имя %NEXTLOC.
 
           Имена %CURLOC, %PREVLOC, %CURVAL и %NEXTLOC можно при-
 
      менять в тех случаях, когда нельзя использовать  постоянные
 
      символы для представления об'ектов, так как они могут  быть
 
      неоднозначными, или потому что  нельзя  использовать  <RET>
 
      внутри выражения.
 
           Символ процента (%) можно  опускать  при  обращении  к
 
      регистрам (например, R0 вместо %R0).  Однако,  Eсли  символ
 
      процента не стоит перед именем, то отладчик может интерпре-
 
      тировать это имя как программную переменную, а не как  пос-
 
      тоянное символическое имя отладчика. Отладчик  воспринимает
 
      такие символические имена как свои постоянные, если  только
 
      в программе пользователя не содержится переменных с  такими
 
      же именами.
 
 
 
           4.3.2. Символические   имена,   создаваемые   командой
 
      DEFINE
 
 
           в течение сеанса отладки пользователь может  применять
 
      команду DEFINE для создания новых  символических  имен  или
 
      для изменения значений уже существующих.
 
           Например, если пользователь часто обращается к  трудно
 
      запоминаемой программной ячейке или области, он может опре-
 
      делить символическое имя для представления  этого  места  в
 
      программе. Тогда в остальной части сеанса отладки пользова-
 


                                - 98 -
 
                          00152-01 34 07-1
 
 
      тель сможет обращаться к этому месту в программе с  помощью
 
      представляющего его символического имени.
 
           Имена, созданные с помощью данной  команды,  удаляются
 
      после окончания соответствуюшего сеанса отладки.
 
           В результате использования команды DEFINE  символичес-
 
      кое имя MIN1 может быть определено в течение сеанса отладки
 
      вместо PROGRAM\ROUTINEA\BLOCKB\MINIM+20:
 
      DBG>DEFINE MIN1=PROGRAM\ROUTINEA\BLOCKB\MINIм+20
 
 
 
           4.3.3. Программные символические имена
 
 
           программные  символические  имена  (называемые   также
 
      идентификаторами) представляют собой  символические  имена,
 
      которые применяются при написании программы пользователем.
 
           Программное символическое имя интерпретируется в соот-
 
      ветствии с тем, как и где оно написано и где используется.
 
           Об'явление символического имени  определяет  атрибуты,
 
      постоянно связываемые с этим именем, такие как тип  данных,
 
      количество распределенной  памяти  и  т.д.  соответствующее
 
      символическое имя интерпретируется с помощью  этих  атрибу-
 
      тов.
 
           Программные символические  имена  разделяются  на  две
 
      категории:
 
           1) имена данных, которые определяют данные,  обрабаты-
 
      ваемые операторами программы;
 
           2) метки программных единиц и программных ячеек, кото-
 
      рые идентифицируют или присваивают имена программам, проце-
 
      дурам, строкам или операторам.
 
           В данном пункте описаны синтаксические и семантические
 
      различия между программными символическими именами. С точки
 


                                - 99 -
 
                          00152-01 34 07-1
 
 
      зрения синтаксиса символические имена имеют область  дейст-
 
      вия от простых  символов  или  имен  до  сложных  элементов
 
      (об'ектов), комбинируемых из нескольких имен, которые  раз-
 
      деляются различными разделительными символами.
 
           В подпунктах 4.3.3.1  -  4.3.3.4  приводятся  основные
 
      типы программных символических имен для  демонстрации  спо-
 
      собностей отладчика в области интерпретации полного  диапа-
 
      зона конкретного языкового символического синтаксиса.
 
           Отладчик интерпретирует программные символические име-
 
      на в синтаксисе исходного языка. В общем случае  это  озна-
 
      чает, что если символическое  имя  является  действительным
 
      элементом исходного языка, то отладчик может  интерпретиро-
 
      вать его.
 
 
 
           4.3.3.1. Простые символические имена
 
 
           Отладчик интерпретирует простые символические имена  в
 
      соответствии с синтаксическими  правилами  исходного  языка
 
      программирования.
 
           Простое символическое имя является программным  симво-
 
      лическим именем, которое не содержит символических  префик-
 
      сов или суффиксов, более подробно  квалифицирующих  элемент
 
      данных, представленный этим символическим именем.
 
           Оно может относиться к отдельному элементу данных  или
 
      к целому диапазону элементов данных.
 
           Простое символическое имя может  быть  именем  данных,
 
      которое представляет,  например,  числовую  константу  (X),
 
      массив (ARR) или цепочку символов (A5$).
 
           Если символическое имя является допустимым для  исход-
 
      ного языка, то отладчик обычно может интерпретировать  его.
 


                                - 100 -
 
                          00152-01 34 07-1
 
 
      Например, если языком является БЭЙСИК, то отладчик  интерп-
 
      ретирует символическое имя T$ как  действительное  символи-
 
      ческое имя, представляющее цепочку символов.
 
           Однако  в  некоторых  языках  программирования   могут
 
      существовать  символические  имена,  которые  в  синтаксисе
 
      текущего языка прогаммирования как идентификаторы не  расс-
 
      матриваются. Например, в коболе секции  и  параграфы  могут
 
      иметь числовые имена,  такие  как  "12."  компилятор  блисс
 
      генерирует для PLIT имена в форме "P.XXX", хотя  точка  (.)
 
      не является действительным символом  идентификаторов  этого
 
      языка.
 
           Лексическая функция %NAME обязывает отладчик интерпре-
 
      тировать свой аргумент как имя  несмотря  на  то,  является
 
      этот аргумент именем или нет. Данная функция имеет одну  из
 
      форм:
 
           %NAME символьная_строка_идентификатор
 
           %NAME 'произвольная_символьная_строка'
 
           Кавычки нужны только в одном из следующих случаев:
 
           1) если имя содержит  точку  с  запятой  (;)  (которая
 
      обычно завершает команду);
 
           2) если имя содержит строчные буквы (обычно они должны
 
      быть заглавными).
 
           Например:
 
      DBG>SET BREAK %NAME 12
 
      DBG>EXAMINE %NAME 'P.AAA'
 


                                - 101 -
 
                          00152-01 34 07-1
 
 
           4.3.3.2. Индексированные символические имена
 
 
           Отладчик интерпретирует индексированные (или  квалифи-
 
      цированные с помощью индекса) символические имена в синтак-
 
      сисе исходного языкA.
 
           Индексированное символическое имя является символичес-
 
      ким именем, которое используется для обращения  к  элементу
 
      данных в массиве.
 
           Так как массив состоит из упорядоченного  набора  эле-
 
      ментов данных, пользователь может идентифицировать  элемент
 
      массива путем определения имени  этого  массива  и  позиции
 
      соответствующего элемента в  массиве.  Позиция  элемента  в
 
      массиве указывается одним или несколькими индексами. Напри-
 
      мер, (I+2) представляет собой индекс в индексированном сим-
 
      волическом имени ARR(I+2).
 
           Синтаксис индексированного символического имени  зави-
 
      сит от текущего  языка  программирования.  Если,  например,
 
      пользователь хочет просмотреть  первый  элемент  в  массиве
 
      ARR, а  текущий  язык  ФОРТРАН,  то  нужно  выдать  команду
 
      EXAMINE ARR (1). Однако подобная команда для языка  ПАСКАЛЬ
 
      выглядела бы так: EXAMINE ARR [1].
 
           Число индексов, используемых для идентификации элемен-
 
      та данных в массиве, определяет размерность соответствующе-
 
      го массива. Таким образом, третий член одномерного  массива
 
      с именем  ARR  определяется  индексированным  символическим
 
      именем ARR(3), а член массива, расположенный в третьем ряду
 
      и во второй колонке двухмерного массива с именем тав, иден-
 
      тифицируется индексированным символическим именем тав(3,2).
 
           Можно, однако, задать или проверить часть (подмножест-
 
      во) массива, а не только один его  элемент.  Это  позволяет
 


                                - 102 -
 
                          00152-01 34 07-1
 
 
      увидеть элементы данного массива как  целый  массив.  Части
 
      массива задаются тем же путем, что и обычные  индексирован-
 
      ные  символические  имена.  Например,   символическое   имя
 
      ARR(1,2:4,6) есть допустимая часть массива для языка  форт-
 
      ран. Эту часть массива можно было бы составить из отдельных
 
      элементов:
 
      ARR(1,4), ARR(1,5), ARR(1,6), ARR(2,4), ARR(2,5), ARR(2,6).
 
 
 
           4.3.3.3. Структурные символические имена
 
 
           Отладчик интерпретирует символические  имена,  которые
 
      определяют элементы данных в соответствии с синтаксическими
 
      правилами исходного языка программирования.
 
           Совокупность данных, которая состоит из элементов дан-
 
      ных  различных  типов,  называется  структурой  данных  или
 
      записью. Записи содержат  элементы  данных,  которые  могут
 
      содержать  подэлементы,  которые  могут,  в  свою  очередь,
 
      содержать подподэлементы и т.д.
 
           В качестве примера  приводится  об'явление  (на  языке
 
      ПАСКАЛЬ) записи PERSON:
 
      TYPE PERSON = RECORD
 
                     NAME : PACKED ARRAY[1..20] OF CHAR;
 
                     AGE  : INTEGER;
 
                     SEX  : (MALE,FEMALE);
 
                     SALARY : INTEGER;
 
                     END;
 
 
 
      VAR COURTNEY : PERSON;
 
           В большинсте языков для обращения к полю записи  поль-
 
      зователь должен применить  структурное  символическое  имя,
 


                                - 103 -
 
                          00152-01 34 07-1
 
 
      содержащее имя требуемого поля и имена всех  других  полей,
 
      содержащих это поле.
 
           Например, для обращения к полю AGE в указанной  записи
 
      PERSON   используется   структурное    символическое    имя
 
      COURTNEY.AGE .
 
           Точка (.) является разделителем, который  используется
 
      для разделения имен полей и записей.
 
           Следует отметить, что в тех  языках  программирования,
 
      которые допускают использование массивов записей,  символи-
 
      ческие обращения к полям в пределах такой  записи  являются
 
      комбинацией индексированного символического имени и  струк-
 
      турного символического имени.
 
           В общем случае  действительное  символическое  имя  на
 
      исходном языке может быть интерпретировано отладчиком.
 
           Можно так же определить или  просмотреть  совокупность
 
      элементов. В этом случае нет необходимости указывать каждый
 
      элемент отдельно. При выводе содержимого записи будет пока-
 
      зано имя и значение каждого элемента  записи.  Подобным  же
 
      образом при выводе содержимого массива отображается  индекс
 
      и значение каждого элемента массива.
 
 
 
           4.3.3.4. Символические    имена,     квалифицированные
 
      указателем
 
 
           Некоторые языки программирования используют квалифици-
 
      рованные указателем символические  имена  для  обращения  к
 
      элементам данных, которые  не  связываются  компилятором  с
 
      конкретными адресами памяти. Как и при использовании других
 
      символических имен исходного языка, отладчик интерпретирует
 
      такие имена в синтаксисе соответствующего исходного языка.
 


                                - 104 -
 
                          00152-01 34 07-1
 
 
           Например, для задания типа указателя в  языке  паскаль
 
      системы МОС ВП пользователь определяет имя базового (основ-
 
      ного) типа, которому предшествует символ ^. Таким  образом,
 
      если запись PERSON (см.  подпункт  4.3.3.3)  имеет  базовый
 
      тип, то переменная типа указателя P  об'является  следующим
 
      образом:
 
      VAR P : ^PERSON;
 
           Для доступа к соответствующей записи используется ква-
 
      лифицированное указателем символическое имя:
 
      P^
 
           Для доступа к полю,  расположенному  в  пределах  этой
 
      записи, следует включить имя соответствующего поля:
 
      P^ .SALARY
 
 
 
           4.4. Разрешение символического имени на исходном языке
 
 
           Распознавание (или разрешение) символического имени  в
 
      течение сеанса отладки зависит от разрешения этого символи-
 
      ческого имени в исходном языке и контексте отладчика.
 
           В данном подразделе описываются факторы, которые  ока-
 
      зывают влияние на разрешение символического имени в  преде-
 
      лах исходного языка. К таким факторам относятся контекст, в
 
      котором приводится об'явление соответствующего  символичес-
 
      кого имени, а  также  наличие  или  отсутствие  глобального
 
      атрибута в об'явлении этого символического имени.
 


                                - 105 -
 
                          00152-01 34 07-1
 
 
           4.4.1. Программный контекст  об'явлений  символических
 
      имен
 
 
           Об'явление символического имени, содержащееся в  прог-
 
      рамме, связывает символическое имя с об'ектом  (элементом),
 
      а также связывает с этим об'ектом некоторые  атрибуты  (или
 
      свойства), такие как тип, распределение памяти и т.д. Такие
 
      об'явления могут быть  неявными;  однако  материал  данного
 
      руководства не делает  различий  между  неявными  и  явными
 
      об'явлениями.
 
           Область действия  об'явления  представляет  собой  ряд
 
      ячеек программы, в  которых  соответствующее  символическое
 
      имя интерпретируется как представляющее об'ект, связанный с
 
      ним в данном об'явлении.
 
           Одно и то же символическое имя  может  быть  об'явлено
 
      несколько раз. Об'явления такого имени имеют раздельные или
 
      несовмещающиеся области действия и каждое об'явление связы-
 
      вает имя с отдельным об'ектом (если только это  символичес-
 
      кое имя не является глобальным).
 
           Если  об'явление  приводится  в  программной  единице,
 
      которая не содержит других программных единиц, то  областью
 
      действия этого об'явления является данная программная  еди-
 
      ница. Если об'явление  приводится  в  программной  единице,
 
      которая содержит другие (вложенные) программные единицы, то
 
      областью действия об'явления является та программная едини-
 
      ца, в которой оно приводится,  и  все  остальные  вложенные
 
      программные единицы, которые сами  не  содержат  об'явлений
 
      этого же символического имени.
 
           На рис.  3  показаны  вложенные  программные  единицы,
 
      которые содержат несколько об'явлений  символических  имен.
 


                                - 106 -
 
                          00152-01 34 07-1
 
 
      Символическое имя X об'является в двух  программных  едини-
 
      цах. Областью действия символического имени X, об'явленного
 
      в программной единице а, являются программные единицы A,  B
 
      и D, но не C, так как символическое имя X об'явлено также в
 
      программной единице  C.  Областью  действия  символического
 
      имени, об'явленного в C, является C. Областью действия сим-
 
      волического имени Y является B и  C,  а  областью  действия
 
      символического имени Z является программная единица D.
 
 
          Области действия об'явлений символических имен
 
        A: I----------------------------
           I
           I DECLARE X
           I
           I           B: I-----------------
           I              I
           I              I DECLARE Y
           I              I
           I              I           C: I--------
           I              I              I
           I              I              I DECLARE X
           I              I              I
           I              I              I--------
           I              I
           I              I-----------------
           I
           I           D: I-----------
           I              I
           I              I DECLARE Z
           I              I
           I              I-----------
           I
           I----------------------------
 
                                Рис. 3
 
 
 
           4.4.2. Глобальные символические имена
 
 
           Глобальным символическим именем яляется такое символи-
 
      ческое имя, об'явление которого содержит  глобальный  атри-
 
      бут.
 
           Наличие или отсутствие глобального атрибута в об'явле-
 
      нии оказывает влияние на разрешение соответствующего симво-


                                - 107 -
 
                          00152-01 34 07-1
 
 
      лического имени.
 
           Глобальные символические имена делают возможным  обра-
 
      щение к некоторому одному об'екту  со  стороны  программных
 
      единиц, которые не содержат друг друга  (т.е.  не  являются
 
      вложенными программными единицами).  Для  выполнения  этого
 
      каждая программная единица об'являет соответствующее симво-
 
      лическое имя с помощью глобального атрибута, при  этом  нет
 
      необходимости, чтобы все остальные атрибуты были идентичны.
 
           Таким образом, глобальное символическое имя связывает-
 
      ся несколькими об'явлениями с одним об'ектом. Это  противо-
 
      положно по смыслу нескольким об'явлениям одного  локального
 
      символического имени, при которых каждое об'явление  связы-
 
      вает такое символическое имя с разными об'ектами.
 
           Следовательно, область действия об'явления глобального
 
      символического имени  не  отличается  от  области  действия
 
      об'явления  неглобального  символического   имени;   однако
 
      об'ект (или элемент), определяемый таким символическим име-
 
      нем, может интерпретироваться за пределами области действия
 
      его об'явления в любой  отдельной  программной  единице  (а
 
      именно, в  тех  программных  единицах,  которые  также  его
 
      об'являют).
 
           На рис. 4 показан пример об'явления глобального симво-
 
      лического имени X в двух невложенных программных  единицах.
 
      Обе эти программные единицы  также  выполняют  обращения  к
 
      символическому имени X. Так как символическое имя X  об'яв-
 
      ляется с помощью глобального атрибута в двух этих программ-
 
      ных единицах, обращения к символическому имени X в любой из
 
      этих программных единиц являются обращениями к одной ячейке
 
      памяти, т.е. к об'екту, представленному символическим  име-
 
      нем X.


                                - 108 -
 
                          00152-01 34 07-1
 
 
 
                   Глобальное символическое имя X
 
                   I--------------------------
                   I
                   I DECLARE X GLOBAL
                   I
                   I        ...X...
                   I
       Программная I     I--------------
                   I     I
         единица   I     I ...X...
                   I     I
            A      I     I--------------
                   I
                   I--------------------------
 
                   I--------------------------
                   I
                   I     I--------------
                   I     I
       Программная I     I DECLARE X GLOBAL
                   I     I
         единица   I     I ...X...
                   I     I
            B      I     I--------------
                   I
                   I--------------------------
 
                                Рис. 4
 
 
 
           4.5. Разрешение символического имени отладчиком
 
 
           В исходном языке  программирования  символическое  имя
 
      интерпретируется как представление  об'екта,  связанного  с
 
      ним в соответствующем об'явлении, внутри  области  действия
 
      которого приводится  это  символическое  имя  (см.  подраз-
 
      дел 4.4).
 
           Однако при отладке, когда может оказаться  необходимым
 
      произвольный доступ к символическим именам  в  любом  месте
 
      программы, пользователь применяет имена путей для  различия
 
      между несколькими об'явлениями одного символического имени.
 
           Имя пути состоит из одной или нескольких  меток  прог-
 
      раммной ячейки, которые служат для определения  этой  прог-
 
      раммной ячейки или диапазона программных ячеек. Таким обра-


                                - 109 -
 
                          00152-01 34 07-1
 
 
      зом, имя пути служит для "нахождения" символического  имени
 
      в пределах области действия об'явления,  которое  связывает
 
      его с  опрашиваемым  об'ектом.  Очевидно,  что  программная
 
      ячейка (или ячейки), определяемая именем пути, должна нахо-
 
      диться в области об'явления символического имени: в против-
 
      ном случае соответствующее символическое имя вообще  нельзя
 
      будет интерпретировать.
 
           Таким образом, при отладке программы, которая содержит
 
      несколько  об'явлений  одного  символического  имени,  если
 
      необходимо дать указания отладчику, что требуется интерпре-
 
      тировать символическое имя как представляющее один из  нес-
 
      кольких возможных об'ектов, пользователь  просто  указывает
 
      имя пути вместе с этим символическим  именем.  После  этого
 
      отладчик интерпретирует данное символическое имя как предс-
 
      тавляющее об'ект, связанный с  ним  в  об'явлении,  область
 
      действия которого включает программную ячейку (или ячейки),
 
      определяемую именем пути.
 
           Если пользователь определяет имя пути в качестве пара-
 
      метра в команде SET SCOPE, то он  фактически  устанавливает
 
      это имя пути в качестве префикса имени пути  по  умолчанию,
 
      который будет использоваться во всех символических  обраще-
 
      ниях, еще не содержащих префикс имени пути (п. 4.5.3).
 
           В команде SET SCOPE пользователь может указать сколько
 
      угодно  параметров  имени  пути;  отладчик  будет  пытаться
 
      интерпретировать символическое имя путем использования пер-
 
      вого указанного параметра. Если это не удается, то отладчик
 
      использует второе имя пути и продолжает  таким  образом  до
 
      тех пор, пока не найдет имя  пути,  которое  идентифицирует
 
      программную ячейку в пределах области  действия  об'явления
 
      соответствующего символического имени. После этого отладчик


                                - 110 -
 
                          00152-01 34 07-1
 
 
      интерпретирует это  символическое  имя  как  представляющее
 
      об'ект, идентифицированный в об'явлении.
 
           Если пользователь не указывает префикс имени пути  при
 
      использовании символического имени в команде отладчика и не
 
      определяет имени пути по умолчанию в команде SET SCOPE,  то
 
      отладчик использует программную ячейку,  указанную  текущим
 
      значеним счетчика команд (PC), в  качестве  префикса  имени
 
      пути по умолчанию.
 
           Когда пользователь применяет  символическое  имя  X  в
 
      команде отладчика, он может и не использовать префикс имени
 
      пути. Если пользователь применяет префикс  имени  пути,  то
 
      отладчик интерпретирует X, как если  бы  это  символическое
 
      имя приводилось в программной ячейке (или ячейках), опреде-
 
      ленной этим именем пути. Отладчик выдает сообщение об ошиб-
 
      ке, если отсутствует об'явление имени Х,  область  действия
 
      которого содержит программную ячейку (ячейки), определенную
 
      именем пути. Если пользователь не применяет  префикс  имени
 
      пути, то отладчик пытается  интерпретировать  символическое
 
      имя х путем использования имени (или имен) пути по  умолча-
 
      нию, либо указанного в команде SET SCOPE,  либо,  если  имя
 
      пути вообще не указывалось пользователем, указанного  прог-
 
      раммной  ячейкой,  содержащей  текущее  значение   счетчика
 
      команд (PC).
 
           Предположим для примера,  что  пользователь  ввел  две
 
      команды:
 
      DBG>SET SCOPE A\B,C
 
      DBG>EXAMINE X        .
 
           В команде EXAMINE пользователь не указал префикс имени
 
      пути. В этом случае отладчик  использует  A\B\  в  качестве
 
      префикса имени пути и пытается найти об'явление символичес-


                                - 111 -
 
                          00152-01 34 07-1
 
 
      кого имени X, область действия которого включает  программ-
 
      ную ячейку, определяемую именем пути  A\B\.  Если  отладчик
 
      находит  об'явление  такого  символического  имени  X,   он
 
      использует его для интерпретации символического имени  X  в
 
      команде EXAMINE. Если он не находит об'явления  символичес-
 
      кого имени X, то он повторяет эту процедуру  с  использова-
 
      нием C\ в качестве префикса имени пути.
 
           Если отладчик не может найти об'явление символического
 
      имени X, область  действия  которого  включает  программные
 
      ячейки, определяемые именем пути по умолчанию, то он выпол-
 
      няет поиск об'явления символического имени X по всей табли-
 
      це RST. Если отладчик находит такое об'явление,  он  разре-
 
      шает символическое имя X с его помощью. Если отладчик нахо-
 
      дит несколько об'явлений  символического  имени  X,  то  он
 
      выдает сообщение об ошибке для  отражения  того,  что  было
 
      выполнено неоднозначное обращение.
 
           Если отладчик  не  находит  об'явления  символического
 
      имени X в таблице RST, то он выполняет поиск в таблице гло-
 
      бальных символических имен (GST). Если об'явление  символи-
 
      ческого имени X отсутствует и в этой таблице,  то  выдается
 
      сообщение, указывающее, что  соответствующее  символическое
 
      имя не может быть найдено (см. п. 4.2.3).
 
           Для полного  использования  возможностей  отладчика  в
 
      области распознавания различий среди нескольких  об'явлений
 
      одного символического имени пользователь должен быть знаком
 
      со спецификацией имени пути.
 


                                - 112 -
 
                          00152-01 34 07-1
 
 
           4.5.1. Спецификация имени пути
 
 
           Имя пути представляет собой цепочку меток  программных
 
      ячеек (т.е. ячеек программы), которая идентифицирует ячейку
 
      программы или диапазон программных ячеек. Имя пути  исполь-
 
      зуется в двух контекстах:
 
           1) в качестве префикса символического имени в  команде
 
      отладчика;
 
           2) в качестве параметра в команде SET SCOPE.
 
           Метки в имени пути приводятся в виде  последовательной
 
      цепочки, так что каждая метка указывает программную  едини-
 
      цу, которая содержит другую программную единицу, определяе-
 
      мую любой другой меткой с правой стороны от  первой.  Таким
 
      образом, если PROG  является  меткой,  приводимой  в  имени
 
      пути, то метки с левой от нее стороны определяют  "содержа-
 
      щие" программные единицы, а метки с правой стороны от  дан-
 
      ной метки определяют "содержащиеся" программные единицы.
 
           Символ обратной косой черты (\) используется  как  для
 
      разделения элементов имени пути друг от друга,  так  и  для
 
      отделения всего имени пути от символического имени, которо-
 
      му предшествует это имя пути. Следует  отметить,  что  если
 
      имя пути определяется в качестве параметра  в  команде  SET
 
      SCOPE, то оно не сопровождается символическим именем;  поэ-
 
      тому самый правый элемент имени пути не сопровождается нак-
 
      лонной чертой (\). С другой стороны,  если  одно  имя  пути
 
      используется в качестве префикса определенного  символичес-
 
      кого имени в команде, то самый правый  элемент  имени  пути
 
      сопровождается обратной наклонной чертой (\) для его  отде-
 
      ления от соответствующего символического имени.
 
           Типы меток, которые  используются  в  имени  пути,  до
 


                                - 113 -
 
                          00152-01 34 07-1
 
 
      некоторой степени изменяются в зависимости от используемого
 
      языка программирования; однако  в  общем  случае  имя  пути
 
      всегда включает имя модуля, а также  включает  обычно  один
 
      или несколько следующих элементов:
 
           - имя (или имена) подпрограммы (подпрограмм);
 
           - имя (или имена) блока (блоков);
 
           - номер вызова;
 
           - номер строки;
 
           - числовую метку.
 
           Подпрограмма является отдельно вызываемой  программной
 
      единицей, т.е. такой программной  единицей,  которая  может
 
      быть приведена в действие с помощью команды вызова  (CALL).
 
      Блок является программной единицей,  которая  приводится  в
 
      действие с помощью  обычной  вызывающей  последовательности
 
      (INLINE), блок отдельно не вызывается.  Подпрограмма  может
 
      содержать один или несколько блоков или других подпрограмм.
 
      Блок тоже может содержать одну  или  несколько  подпрограмм
 
      или других блоков. Это означает, что может иметь место вло-
 
      жение блоков и подпрограмм.
 
           Типичное имя пути, состоящее из имен модуля,  блока  и
 
      подпрограммы, например, следующее:
 
      INV\PARTS\AUTO\  .
 
           В языках программирования, которые  используют  номера
 
      строк, элемент имени пути %LINE определяет строку исходного
 
      кода. Например, -  имя  пути,  которое  использует  элемент
 
      %LINE:
 
      MEDIAN\%LINE 330\  .
 
           В языках, которые обеспечивают  возможность  рекурсии,
 
      номер вызова используется в имени пути для обеспечения раз-
 
      личий между несколькими вызовами одной программной  единицы


                                - 114 -
 
                          00152-01 34 07-1
 
 
      (и, таким образом, между несколькими  генерациями  символи-
 
      ческих имен). Номер  вызова  всегда  связывается  с  именем
 
      подпрограммы и никогда не связывается с номером блока (име-
 
      нем блока); один или несколько пробелов должны отделять имя
 
      подпрограммы от номера вызова  (подпункт  4.5.1.3).  Пример
 
      имени пути, которое определяет номер вызова:
 
      MOD\ROUT 1\BLK\  .
 
           На рис. 5  показана  программа,  содержащая  вложенные
 
      подпрограммы и блоки с об'явлениями символического имени X.
 
      Примеры подпункта 4.5.1.1 связаны с рис. 5. В этих примерах
 
      имена путей используются в качестве префиксов символическо-
 
      го имени X в команде EXAMINE  и  в  качестве  параметров  в
 
      команде SET SCOPE.
 
 
                        Имена путей и диапазон
 
               A: I----------------------------
                  I
                  I DECLARE X
                  I
                  I            B: I-------------
                  I               I
                  I               I      C: I--------
                  I               I         I
                  I               I         I DECLARE X
                  I               I         I
                  I               I         I--------
                  I               I
                  I               I-------------
                  I
                  I               I-----------
                  I               I
                  I               I DECLARE X
                  I               I
                  I               I-----------
                  I
                  I----------------------------
 
                                Рис. 5
 


                                - 115 -
 
                          00152-01 34 07-1
 
 
           4.5.1.1. Примеры имен пути
 
 
           Пример 1.
 
      DBG>EXAMINE A\X
 
           Префикс имени пути A\ определяет диапазон  программных
 
      ячеек,  соответствующий  программной  единице  A.  Отладчик
 
      пытается найти об'явление символического имени  X,  область
 
      действия которого включает А. Так как такое об'явление сим-
 
      волического имени Х приводится в А, отладчик интерпретирует
 
      это символическое имя как представляющее об'ект,  об'явлен-
 
      ный в А. После этого отладчик рассматривает величину симво-
 
      лического имени Х.
 
           Область действия об'явления символического имени Х в А
 
      состоит из тех  ячеек  в  программной  единице  А,  которые
 
      отсутствуют в других блоках, а также из ячеек В. Блок  С  и
 
      блок без имени не находятся в области  действия  об'явления
 
      символического имени Х в  А,  так  как  они  сами  содержат
 
      об'явления символического имени Х.
 
           Пример 2.
 
      DBG>EXAMINE A\B\C\X
 
           Префикс имени пути  A\B\C  идентифицирует  программную
 
      единицу C. Отладчик выполняет поиск об'явления  символичес-
 
      кого имени Х, область  действия  которого  включает  С.  Он
 
      находит такое об'явление в программной единице С и  интерп-
 
      ретирует символическое имя  Х  как  представляющее  об'ект,
 
      об'явленный в С. После этого отладчик рассматривает величи-
 
      ну символического имени Х.
 
           Следует  помнить  о  том,   что   символическое   имя,
 
      переоб'явленное в программной единице,  интерпретируется  в
 
      соответствии с об'явлением в этой программной единице, а не
 


                                - 116 -
 
                          00152-01 34 07-1
 
 
      в соответствии с об'явлением во внешней программной  едини-
 
      це. Поэтому символическое имя Х  в  программной  единице  С
 
      имеет другое значение (в соответствии с об'явленным), неже-
 
      ли символическое имя Х, об'явленное в  программной  единице
 
      А.
 
           Пример 3.
 
      DBG>EXAMINE A\%LINE 110\X
 
           Имя пути A\%LINE 110\ идентифицирует программную ячей-
 
      ку в пределах блока без имени, т.к. номер строки 110 содер-
 
      жится в этом блоке.  Отладчик  выполняет  поиск  об'явления
 
      символического имени Х, диапазон которого  включает  строку
 
      номер 110. Он находит такое об'явление в блоке без имени  и
 
      интерпретирует  символическое  имя  Х  как   представляющее
 
      об'ект, об'явленный в  этом  блоке.  После  этого  отладчик
 
      рассматривает величину символического имени Х.
 
           Следует отметить, что только с помощью элемента  имени
 
      пути %LINE можно идентифицировать программные ячейки в бло-
 
      ке без имени. В данном примере без  использования  элемента
 
      имени пути %LINE невозможно обратиться к об'екту, представ-
 
      ленному символическим именем Х,  об'явленным  в  блоке  без
 
      имени.
 
           Пример 4.
 
      DBG>SET SCOPE A\B
 
      DBG>EXAMINE X
 
           Так как в команде EXAMINE не используется префикс име-
 
      ни пути, то к символическому имени  Х  добавляется  префикс
 
      имени пути по  умолчанию  A\B\.  Отладчик  выполняет  поиск
 
      об'явления символического имени Х, область действия которо-
 
      го  включает  в  (диапазон  ячеек,  определяемый  префиксом
 
      A\B\). Он находит такое об'явление в программной единице  а


                                - 117 -
 
                          00152-01 34 07-1
 
 
      и интерпретирует символическое  имя  Х  как  представляющее
 
      об'ект, об'явленный в А. После этого отладчик рассматривает
 
      величину символического имени Х.
 
 
 
           4.5.1.2. Полное и неполное имя пути
 
 
           В программах, которые имеют  глубокое  вложение  прог-
 
      раммных единиц, наименование каждой содержащей  программной
 
      единицы может  оказаться  обременительным.  Для  облегчения
 
      определения имен  путей  отладчик  поддерживает  сокращение
 
      имен пути.
 
           Полным именем пути называется имя пути, которое упоми-
 
      нает каждый элемент имени пути,  т.е.  все  подпрограммы  и
 
      блоки, а также метки и номера  строк  (если  они  имеются).
 
      Неполным или сокращенным именем пути называется  имя  пути,
 
      которое не упоминает каждый элемент имени пути в специфика-
 
      ции.
 
           Когда отладчик встречает имя пути, он в первую очередь
 
      определяет, является данное имя пути полным  или  сокращен-
 
      ным. Если оно является полным, то отладчик  использует  его
 
      для разрешения соответствующего  символического  обращения.
 
      Если оно сокращенное, отладчик определяет, является ли  оно
 
      сокращением полного имени пути и, если это так, однозначное
 
      ли это сокращение.
 
           Сокращенное имя пути является сокращением полного име-
 
      ни пути при следующих условиях:
 
           1) элементы имени пути в сокращенном имени пути приво-
 
      дятся в полном имени пути в таком же порядке;
 
           2) самый правый элемент в сокращенном имени пути соот-
 
      ветствует самому правому элементу в полном имени пути.
 


                                - 118 -
 
                          00152-01 34 07-1
 
 
           Например, следующее сокращенное имя пути:
 
       RUG>%LINE 784\
 
      Является сокращением полного имени пути:
 
       MAT\CLRI\RUG\%LINE 784\  ,
 
      Так как элементы RUG\ и LINE 784\ в сокращенном имени  пути
 
      приводятся в таком же порядке, как и в полном имени пути, а
 
      самый правый элемент (%LINE 784\) в полном имени пути соот-
 
      ветствует самому правому элементу в сокращенном имени пути.
 
           Сокращенное имя пути является однозначным  (недвусмыс-
 
      ленным) в том случае, если имеется не более одного  полного
 
      имени пути, от которого оно получено.
 
           Предположим, например, что  две  разные  подпрограммы,
 
      имеющие имена SUB, об'являются в программных единицах  PROG
 
      и QUAR соответственно. Неполное (сокращенное) имя пути  SUB
 
      является двусмысленным,  так  как  есть  два  полных  имени
 
      (PROG\SUB и QUAR\SUB), для которых  оно  является  сокраще-
 
      нием.
 
           Сокращенное имя пути приемлемо для отладчика только  в
 
      том случае, если оно  является  сокращением  одного  (и  не
 
      больше чем одного) полного имени пути.
 
           Уникальные  (т.е.  единственные)  символические  имена
 
      всегда могут указываться без квалификации имени пути.
 
           Глобальные  символические  имена  могут   определяться
 
      путем приведения перед ними символа \. Например,  форма  \X
 
      указывает, что Х является глобальным символическим именем.
 


                                - 119 -
 
                          00152-01 34 07-1
 
 
           4.5.1.3. Номера вызовов
 
 
           Подпрограммы являются отдельно вызываемыми программны-
 
      ми единицами. Это означает, что они приводятся в действие с
 
      помощью вызовов, а не в результате последовательного выпол-
 
      нения кода. Таким образом, в течение  выполнения  программы
 
      могут иметь место несколько одновременных вызовов  подпрог-
 
      рамм или вызовы могут вообще отсутствовать.
 
           Если символическое  имя,  представляющее  динамический
 
      об'ект, об'явлено в подпрограмме или блоке в пределах подп-
 
      рограммы, то об'ект, представленный этим символическим име-
 
      нем, заново генерируется при каждом вызове  соответствующей
 
      подпрограммы. При каждом вызове  подпрограммы  имеет  место
 
      соответствующая генерация такого  об'екта.  Номера  вызовов
 
      используются в  именах  путей  для  определения  конкретных
 
      вызовов подпрограммы (и, таким образом, конкретных  генера-
 
      ций об'екта).
 
           Номера  вызовов  представляют  собой   неотрицательные
 
      десятичные целые числа, вводимые в  имя  пути  после  имени
 
      самой правой подпрограммы в полном  имени  пути.  Нуль  (0)
 
      указывает самый последний вызов самой внутренней  (наиболее
 
      глубоко  вложенной)  подпрограммы.  Единица  (1)  указывает
 
      предшествующий этому вызов и т.д.
 
           Например, если модуль MOD содержит подпрограмму  ROUT,
 
      в которой содержится блок BLK, то имя пути,  идентифицирую-
 
      щее генерацию BLK в  результате  самого  последнего  вызова
 
      подпрограммы ROUT, выглядит следующим образом:
 
      MOD\ROUT 0\BLK  .
 
           Имя  пути,  которое  идентифицирует  генерацию  BLK  в
 
      результате предшествующего этому вызову вызова подпрограммы
 


                                - 120 -
 
                          00152-01 34 07-1
 
 
      ROUT, выглядит следующим образом:
 
      MOD\ROUT 1\BLK  .
 
           Каждое полное имя пути, которое содержит имя  отдельно
 
      вызываемого об'екта, имеет номер вызова. Когда номер вызова
 
      отсутствует в  имени  пути,  содержащем  имя  подпрограммы,
 
      отладчик предполагает самый последний вызов  этой  подпрог-
 
      раммы и обеспечивает номер вызова по умолчанию нуль (0).
 
           Каждое имя пути, содержащее имя более чем одной  подп-
 
      рограммы, определяет вызов самой внутренней подпрограммы. В
 
      имени пути номера вызовов не могут быть  связаны  с  именем
 
      подпрограммы, которое приводится с левой стороны  от  имени
 
      другой подпрограммы.
 
           Использование имени пути с номером вызова для  опреде-
 
      ления конкретной генерации динамического об'екта зависит от
 
      относительных позиций самой внутренней подпрограммы и прог-
 
      раммной  единицы,  содержащей  об'явление  соответствующего
 
      об'екта. Символическое имя, связанное с динамическим об'ек-
 
      том, к которому хочет обратиться пользователь,  может  быть
 
      описано одним из способов:
 
           1) в самой внутренней подпрограмме;
 
           2) в блоке, содержащемся в самой  внутренней  подпрог-
 
      рамме;
 
           3) в программной единице, которая содержит самую внут-
 
      реннюю подпрограмму.
 
           Эти три  возможности  соответствуют  трем  программным
 
      ситуациям:
 
           1) если символическое имя об'явлено в самой внутренней
 
      подпрограмме, то отладчик рассматривает генерацию  об'екта,
 
      соответствующую  вызову  подпрограммы  (при  его  наличии),
 
      определяемым именем пути.  Данная  ситуация  иллюстрируется


                                - 121 -
 
                          00152-01 34 07-1
 
 
      рис. 6;
 
 
                      Об'явление символического имени
 
                     в самой внутренней подпрограмме
 
                  I-----------------------------------
                  I
                  I Самая внутренняя подпрограмма
                  I
                  I  DECLARE X
                  I
                  I  I----------------------
                  I  I
                  I  I Ячейка или ячейки,
                  I  I
                  I  I идентифицированные
                  I  I
                  I  I именем пути
                  I  I
                  I  I----------------------
                  I
                  I-----------------------------------
 
                                Рис. 6
 
           2) если символическое имя об'явлено в  блоке,  который
 
      содержится в самой внутренней подпрограмме, и если выполне-
 
      ние программы достигает этого блока, то отладчик рассматри-
 
      вает генерацию об'екта, соответствующую  активации  данного
 
      блока. Однако, если выполнение программы не достигает  бло-
 
      ка, содержащего соответствующее об'явление (как будет, нап-
 
      ример, в случае, если пользователь установит точку приоста-
 
      нова в ячейке подпрограммы до той ячейки, которая фиксирует
 
      начало этого блока),  то  генерации  символического  имени,
 
      определенного именем пути, не происходит и отладчик  выдает
 
      сообщение об ошибке, отражающее эту ситуацию. Данная  прог-
 
      раммная ситуация иллюстрируется рис. 7;
 


                                - 122 -
 
                          00152-01 34 07-1
 
 
 
           Об'явление символического имени во вложенном блоке
 
                  I--------------------------------
                  I
                  I Самая внутренняя подпрограмма
                  I
                  I   I------------------------------
                  I   I
                  I   I Блок
                  I   I
                  I   I   DECLARE X
                  I   I
                  I   I   I-----------------------
                  I   I   I
                  I   I   I Ячейка или ячейки,
                  I   I   I
                  I   I   I идентифицированные
                  I   I   I
                  I   I   I именем пути
                  I   I   I
                  I   I   I-----------------------
                  I   I
                  I   I------------------------------
                  I
                  I--------------------------------
 
                                Рис. 7
 
           3) если символическое имя об'явлено в программной еди-
 
      нице, которая содержит самую  внутреннюю  подпрограмму,  то
 
      некоторый вызов программной единицы  обеспечивает  контекст
 
      для вызова самой внутренней подпрограммы, определяемой име-
 
      нем пути. Отладчик рассматривает генерацию  об'екта,  соот-
 
      ветствующую такому вызову программной единицы. Данная прог-
 
      раммная ситуация показана на рис. 8.
 


                                - 123 -
 
                          00152-01 34 07-1
 
 
 
               Об'явление в содержащей программной единице
 
                I---------------------------------------
                I
                I Программная единица
                I
                I   DECLARE X
                I
                I       I---------------------------------
                I       I
                I       I Самая внутренняя подпрограмма
                I       I
                I       I     I-----------------------
                I       I     I
                I       I     I Ячейка или ячейки,
                I       I     I
                I       I     I идентифицированные
                I       I     I
                I       I     I именем пути
                I       I     I
                I       I     I-----------------------
                I       I
                I       I---------------------------------
                I
                I---------------------------------------
 
                                Рис. 8
 
           Следует отметить, что  когда  пользователь  определяет
 
      номер вызова, он должен оставить один или несколько  пробе-
 
      лов (или символов табуляции) между таким номером и отдельно
 
      вызываемой подпрограммой.
 
 
 
           4.5.2. Команды SHOW MODULE, SET MODULE и CANCEL MODULE
 
 
           Команда SHOW MODULE обеспечивает воспроизведение  сле-
 
      дующей информации,  касающейся  одного  или  более  модулей
 
      программе пользователя:
 
           - имя модуля;
 
           - наличие (или отсутствие) символьных записей для это-
 
      го модуля в таблице RST;
 
           - язык программирования,  на  котором  написан  данный
 
      модуль;
 
           - приблизительное пространство (в байтах), требуемое в


                                - 124 -
 
                          00152-01 34 07-1
 
 
      таблице RST для символических имен данного модуля;
 
           - общее число модулей в программе;
 
           - число неиспользованных байтов в пространстве,  выде-
 
      ленном для таблицы RST.
 
           Команда SHOW MODULE имеет следующий формат:
 
      SHOW MODULE[/SHARE][имя_модуля[,...]]
 
           Квалификатор /SHARE управляет  включением  в  выходную
 
      информацию команды SHOW MODULE разделяемых образов, скомпо-
 
      нованных с программой пользователя, но являющихся  внешними
 
      по отношению к ней. Это в  основном  образы  исполнительной
 
      библиотеки, а также и другие разделяемые образы, вызываемые
 
      программой пользователя. По умолчанию  действует  /NOSHARE,
 
      т.е. выходная информация не содержит сведений о разделяемых
 
      образах.
 
           Для введения символьных записей для одного, нескольких
 
      или всех модулей в таблицу RST следует использовать команду
 
      SET MODULE, формат которой:
 
        SET MODULE [/квалификатор] [имя_модуля[,имя_модуля...]] .
 
           Для включения символьных записей для одного  или  нес-
 
      кольких модулей следует указать имя модуля (или модулей)  в
 
      команде SET MODULE. В этом случае не следует указывать ква-
 
      лификатор команды.
 
           Для включения символьных записей для всех модулей сле-
 
      дует  указать  квалификатор  команды  /ALL  в  команде  SET
 
      MODULE. В этом случае не следует  указывать  имена  модулей
 
      (или модуля).
 
           Следует отметить, что  если  параметр  в  команде  SET
 
      SCOPE указывает программную область  в  модуле,  символьные
 
      записи которого еще не находятся в таблице RST, то отладчик
 
      копирует символьные записи этого модуля в таблицу  RST  при


                                - 125 -
 
                          00152-01 34 07-1
 
 
      выполнении данной команды.
 
           Когда все пространство памяти, распределенное для таб-
 
      лицы RST, занято, а пользователю требуется включить  допол-
 
      нительные символьные записи, он имеет две альтернативы.  Он
 
      может либо выделить больше памяти с помощью команд ALLOCATE
 
      или SET MODULE/ALLOCATE, либо выдать команду CANCEL  MODULE
 
      следующего формата:
 
      CANCEL MODULE [/квалификатор][имя_модуля[,имя_модуля...]].
 
           Для удаления символьных записей одного или  нескольких
 
      модулей следует указать имя  (или  имена)  соответствующего
 
      модуля (модулей) в данной команде. В этом случае не следует
 
      указывать квалификатор команды.
 
           Для удаления символических записей всех  модулей  сле-
 
      дует указать квалификатор команды  /ALL  в  команде  CANCEL
 
      MODULE. В этом случае не следует указывать имя (или  имена)
 
      модуля (модулей).
 
           Пример использования описанных команд:
 
       %DEBUG-I-иNITIAL, LANGUAGE IS BASIC,
 
       MODULE SET TO 'MEANSUB$MAIN'
 
 
 
       DBG>SHOW MODULE
 
       Имя модуля   Символические имена  Язык  Размер
 
       MEANSUB$MAIN     есть             BASIC  172
 
       OTS$LINKAGE      нет              MACRO  176
 
       BAS$STOP         нет              BLISS  284
 
       BAS$MSGDEF       нет              BLISS   68
 
       общее число модулей: 4   оставшийся размер: 60784
 
 
 
       DBG>SET MODULE OTS$LINKAGE
 
 


                                - 126 -
 
                          00152-01 34 07-1
 
 
       DBG>SHOW MODULE
 
       Имя модуля   Символические имена  Язык  Размер
 
       MEANSUB$MAIN     есть             BASIC  172
 
       OTS$LINKAGE      есть             MACRO  100
 
       BAS$STOP         нет              BLISS  284
 
       BAS$MSGDEF       нет              BLISS   68
 
       общее число модулей: 4   оставшийся размер: 60676
 
 
 
       DBG>CANCEL MODULE MEANSUB$MAIN
 
 
 
       DBG>SHOW MODULE
 
       Имя модуля   Символические имена  Язык  Размер
 
       MEANSUB$MAIN     нет              BASIC  172
 
       OTS$LINKAGE      есть             MACRO  100
 
       BAS$STOP         нет              BLISS  284
 
       BAS$MSGDEF       нет              BLISS   68
 
       общее число модулей: 4   оставшийся размер: 60856
 
 
 
       DBG>SET MODULE/ALL
 
 
 
       DBG>SHOW MODULE
 
       Имя модуля   Символические имена  Язык  Размер
 
       MEANSUB$MAIN     есть             BASIC  172
 
       OTS$LINKAGE      есть             MACRO  100
 
       BAS$STOP         есть             BLISS  172
 
       BAS$MSGDEF       есть             BLISS   36
 
       общее число модулей: 4   оставшийся размер: 60452
 
       DBG>SHOW MODULE FOO, MAIN, SUB*
 
       Имя модуля   Символические имена  Язык    Размер
 
       FOO              есть             MACRO    432


                                - 127 -
 
                          00152-01 34 07-1
 
 
       MAIN             нет              FORTRAN  280
 
       SUB1             нет              FORTRAN  164
 
       SUB2             нет              FORTRAN  204
 
       общее число модулей: 4    оставшийся размер: 60720
 
 
 
           4.5.3. Команды SET SCOPE, SHOW SCOPE и CANCEL SCOPE
 
 
           Назначение команды SET SCOPE состоит в указании одного
 
      или нескольких префиксов имени пути для  использования  при
 
      интерпретации символических имен без префиксов имени пути.
 
           Числа 0, 1, 2 и т.д., которые приводятся в имени  пути
 
      в качестве номеров вызовов, могут быть также использованы в
 
      качестве параметров в команде SET SCOPE. При таком  исполь-
 
      зовании эти номера являются числовыми именами путей.
 
           Числовое имя пути 0 указывает, что символические имена
 
      без префиксов имени пути должны  интерпретироваться  в  том
 
      виде, как они приводятся в  действующей  в  текущий  момент
 
      подпрограмме; числовое имя пути 1 указывает,  что  символи-
 
      ческое имя должно интерпретироваться в программной единице,
 
      которая содержит вызов действующей в текущий  момент  подп-
 
      рограммы; числовое имя пути 2 указывает, что  символическое
 
      имя должно интерпретироваться в программной единице,  кото-
 
      рая содержит вызов программной  единицы,  содержащей  вызов
 
      действующей в текущий момент подпрограммы и т.д.
 
           Если пользователь не  выдает  команду  SET  SCOPE,  то
 
      отладчик по умолчанию ведет себя так, как  будто  пользова-
 
      тель выдал команду SET SCOPE 0. Таким образом, по умолчанию
 
      отладчик интерпретирует все символические имена, которые не
 
      имеют префиксов имени пути,  как  будто  они  приводятся  в
 
      действующей в данный момент подпрограмме (определяемой чис-
 


                                - 128 -
 
                          00152-01 34 07-1
 
 
      ловым именем пути 0).
 
           Пользователь может организовать список поиска  области
 
      действия символического имени путем определения  более  чем
 
      одного параметра в команде SET  SCOPE.  При  этом  отладчик
 
      использует первый указанный параметр  в  качестве  префикса
 
      имени пути для интерпретации символического имени без  пре-
 
      фикса имени пути. Если такая интерпретация не дает  требуе-
 
      мого результата, то отладчик использует следующий параметр,
 
      приведенный в команде SET SCOPE, аналогичным образом и про-
 
      должает эти операции вплоть до успешной интерпретации  сим-
 
      волического имени или до окончания параметров, определенных
 
      в команде SET SCOPE.
 
           Список параметров, которые могут быть  использованы  с
 
      командой SET SCOPE, следующий:
 
           1) MODULE\ROUTINE\BLOCK - это допустимое (разрешенное)
 
      имя пути. Имена пути могут быть полными  или  сокращенными.
 
      Следует отметить, что может быть одна или  несколько  подп-
 
      рограмм и блоков;
 
           2) 0, 1, 2, 3 и т.д. - эти  числа  являются  числовыми
 
      именами путей. Числовое имя пути 0 указывает, что  символи-
 
      ческие имена без префиксов имени пути интерпретируются, как
 
      если бы они приводились  в  действующей  в  текущий  момент
 
      подпрограмме; числовое имя пути 1 - как в программной  еди-
 
      нице, которая содержит вызов действующей в  текущий  момент
 
      подпрограммы; числовое имя пути 2 - как в программной  еди-
 
      нице, которая содержит вызов программной единицы,  содержа-
 
      щей другой вызов действующей в текущий момент подпрограммы,
 
      и т.д.;
 
           3) обратная косая черта (\) - эTOT  символ  указывает,
 
      что  символическое  имя  без  префикса  имени  пути  должно


                                - 129 -
 
                          00152-01 34 07-1
 
 
      интерпретироваться в  качестве  глобального  символического
 
      имени.
 
           Пример использования команды SET SCOPE:
 
      DBG>SET SCOPE 1, MODB, \  .
 
           Данная команда  устанавливает  список  поиска  области
 
      действия символических  имен.  В  результате  этой  команды
 
      отладчик пытается интерпретировать  символическое  имя  без
 
      префикса имени пути таким образом, как будто оно удовлетво-
 
      ряет следующим условиям:
 
           1) приводится в программной единице, которая  содержит
 
      вызов действующей в текущий момент подпрограммы;
 
           2) приводится в подпрограмме MODB;
 
           3) является глобальным символическим именем.
 
           Если пользователь хочет проверить  текущие  параметры,
 
      то он должен выдать команду SHOW SCOPE .
 
           Если  пользователь  хочет  изменить  имеющийся  список
 
      поиска области действия, то ему следует выдать команду  SET
 
      SCOPE с указанием требуемых параметров.
 
           Если пользователь хочет отменить  существующий  список
 
      поиска области действия, то следует выдать  команду  CANCEL
 
      SCOPE .
 
           Команда CANCEL SCOPE приводит к таким же  результатам,
 
      как и команда SET SCOPE 0.
 
 
 
           4.5.4. Команда SHOW SYMBOL
 
 
           С помощью команды SHOW SYMBOL можно запросить у отлад-
 
      чика информацию из таблицы символических имен. Можно затре-
 
      бовать информацию об одном символическом имени или обо всех
 
      (используя символ обобщения *).
 


                                - 130 -
 
                          00152-01 34 07-1
 
 
           Пример показывает несостоявшуюся попытку просмотра  X,
 
      т.к. в программе имеются два имени X:
 
      DBG>EXAM X
 
      %DEBUG-W-NOUNIQUE, X IS NOT UNIQUE
 
      DBG>SHOW SYMBOL X
 
      DATA FOO\X
 
      DATA FUM\X
 
      DBG>EXAMINE FOO\X
 
      FOO
 
           Для получения информации о типе и адресах всех имен из
 
      RST нужно задать следующую командную строку:
 
      DBG>SHOW SYMBOL/TYPE/ADDRESS *
 
           Звездочка (*) является символом обобщения.
 
 
 
           4.6. Отладка разделяемых образов
 
 
           Разделяемый образ  является  образом,  который  непос-
 
      редственно невыполним.  Для  выполнения  разделяемый  образ
 
      должен быть задействован  в  операции  компоновки,  которая
 
      создает выполняемый образ; затем  при  работе  выполняемого
 
      образа может выполняться и разделяемый образ.
 
           До этапа отладки одна или несколько подпрограмм, необ-
 
      ходимых пользователю для решения своей задачи, могут  нахо-
 
      диться в каком-либо из следующих классов:
 
           1) скомпилированные, но не скомпонованные подпрограммы
 
      (т.е. один или несколько об'ектных модулей);
 
           2) скомпилированные, скомпонованные, но не установлен-
 
      ные подпрограммы (неустановленный разделяемый образ);
 
           3) скомпилированные,  скомпонованные  и  установленные
 
      подпрограммы (установленный разделяемый образ).
 


                                - 131 -
 
                          00152-01 34 07-1
 
 
           Любая из перечисленных подпрограмм может быть включена
 
      в операцию  компоновки.  Поэтому  при  запуске  полученного
 
      выполняемого образа под управлением отладчика можно в неко-
 
      торой степени отлаживать подпрограммы указанных классов.
 
 
 
           4.6.1. Отладка об'ектных модулей
 
 
           Для  отладки  нескомпонованного  разделяемого   образа
 
      пользователь включает об'ектные модули, которые  составляют
 
      (или, точнее, будут  составлять)  этот  образ,  в  качестве
 
      входных данных для операции компоновки, создающей выполняе-
 
      мый образ. Затем выполняемый образ запускается под управле-
 
      нием отладчика.
 
           При задании квалификатора /DEBUG во время компиляции и
 
      компоновки пользователь имеет  доступ  ко  всей  символьной
 
      информации в модулях разделяемого образа.
 
           Эти модули можно отлаживать тем  же  способом,  что  и
 
      другие модули программы пользователя.
 
 
 
           4.6.2. Отладка неустановленных разделяемых образов
 
 
           Для отладки неустановленного разделяемого  образа  или
 
      неустановленной копии такого образа следует  сначала  вклю-
 
      чить этот разделяемый образ в операцию компоновки, а  затем
 
      запустить  полученный  выполняемый  образ  под  управлением
 
      отладчика.
 
           В результате имя каждого разделяемого образа, включен-
 
      ного при компоновке, становится  доступным  для  отладчика.
 
      Разделяемый образ рассматривается как  особый  вид  модуля,
 
      который может быть установлен командой SET MODULE. Отладчик
 
      добавляет перед  именем  каждого  разделяемого  образа  имя


                                - 132 -
 
                          00152-01 34 07-1
 
 
      SHARE$. В результате можно использовать  это  новое  имя  в
 
      команде EVALUATE/ADDRESS для определения виртуального адре-
 
      са загрузки разделяемого образа.
 
           После выдачи команды SET MODULE, указывающей  конкрет-
 
      ный разделяемый  образ,  отладчик  считывает  символические
 
      имена этого образа и создает из них таблицу текущих  симво-
 
      лических имен. К этим символическим именам можно  обращать-
 
      ся, используя  обычный  синтаксис  имени  пути  (такой  как
 
      SHARE$XXX\SYMNAME). Адресация таких имен отладчиком  -  так
 
      же  символическая.  Следует  отметить,  что   команда   SET
 
      MODULE/ALL не устанавливает разделяемые образы.
 
           Например, предположим, что  исполнительная  библиотека
 
      МОС ВП (VMSRTL.EXE), которая является разделяемым  образом,
 
      включена в операцию компоновки.  Начальный  адрес  загрузки
 
      VMSRTL.EXE во время сеанса отладки можно тогда определить с
 
      помощью команды:
 
      DBG>EVALUATE/ADDRESS SHARE$VMSRTL
 
 
 
           4.6.3. Отладка установленных разделяемых образов
 
 
           Отладка установленной  копии  разделяемого  образа  не
 
      рекомендуется. Во-первых, в этом возможно нет  необходимос-
 
      ти, так как разделяемый образ обычно устанавливается только
 
      после его тестирования и отладки. Во-вторых, так как секции
 
      образа в установленном разделяемом образе  становятся  гло-
 
      бальными секциями и предназначены для совместного использо-
 
      вания многими процессами, они в большинстве  случаев  имеют
 
      защиту доступа для записи. Поэтому  пользователь  не  может
 
      устанавливать точки  приостанова  или  изменять  содержимое
 
      программных ячеек в пределах установленной копии  разделяе-
 


                                - 133 -
 
                          00152-01 34 07-1
 
 
      мого образа.
 
           Если  требуется  отладка  установленного  разделяемого
 
      образа, то пользователь должен создать личную копию  такого
 
      разделяемого образа. Затем путем присвоения логических имен
 
      следует привести в действие личную копию (а не  установлен-
 
      ную) вместе с  выполняемым  образом.  Этим  способом  можно
 
      отлаживать разделяемый образ аналогично тому, как это  было
 
      об'явлено для неустановленных разделяемых образов.
 
           В приводимом примере команда COPY языка DCL  обеспечи-
 
      вает  создание  личной  копии  установленного  разделяемого
 
      образа LBRSHR.EXE. Затем команда этого языка DEFINE  приво-
 
      дит в действие эту копию во  время  приведения  в  действие
 
      образа:
 
      $COPY SYS$LIBRARY:LBRSHR.EXE MYDISK:[MYDIR]
 
      $DEFINE LBRSHR MYDISK:[MYDIR]LBRSHR
 
      $RUN PROG
 
           Примечание. Если таблица DST содержит  адреса,  указы-
 
      вающие данные в разделяемых образах, и пользователь пытает-
 
      ся просмотреть эти данные, то он может получить  неправиль-
 
      ные результаты. Это имеет место из-за того, что адреса неу-
 
      порядоченны. Эта проблема встречается редко и в основном  в
 
      случаях, когда общий блок программы на фортране скомпонован
 
      как разделяемый образ. Чтобы избежать  такой  проблемы  при
 
      необходимости использования  отладчика,  нужно  компоновать
 
      общий блок как обычный об'ектный модуль. Затем после отлад-
 
      ки программы снова скомпоновать разделяемый образ.
 


                                - 134 -
 
                          00152-01 34 07-1
 
 
                   5. Обращения к ячейкам программы
 
 
 
           При  отладке  пользователь  осуществляет  обращения  к
 
      ячейкам программы для останова  выполнения  программы,  для
 
      просмотра и занесения величин, а также для установки  точек
 
      приостанова, точек просмотра и точек отслеживания.
 
           Все обращения к ячейкам программы называются адресными
 
      выражениями. Адресное выражение может быть простым  адресом
 
      или выражением, состоящим из одного или нескольких  простых
 
      адресов, знаков операций и разделителей.
 
           Обычно, когда отладчик интерпретирует адресное выраже-
 
      ние, результатом этой интерпретации являются  ячейка  прог-
 
      раммы и тип, который связан с содержимым этой ячейки.
 
 
 
           5.1. Типы об'ектов отладчика
 
 
           При компиляции  об'ект,  представленный  символическим
 
      именем в исходном  языке,  связывается  компилятором  соот-
 
      ветствующего языка с определенным типом (классом). С  этого
 
      времени об'ект (символическое имя) является элементом этого
 
      зависящего от  языка  (или  сгенерированного  компилятором)
 
      типа (класса). В общем случае отладчик  понимает  зависящие
 
      от языка типы, которые связаны с об'ектами с помощью описа-
 
      ний в исходном языке.
 
           Однако в процессе отладки по причине того, что не  все
 
      обращения являются символическими, об'ект может и не  иметь
 
      генерируемого компилятором типа. В таком случае  соответст-
 
      вующий об'екту тип устанавливается отладчиком по умолчанию.
 
      Тип по умолчанию используется только в  тех  случаях,  пока
 
      об'ект еще не имеет связанного с ним типа.
 


                                - 135 -
 
                          00152-01 34 07-1
 
 
           типы об'ектов отладчика:
 
           - BYTE - определяет тип байтовое целое (длина 1 байт);
 
           - WORD - определяет целое слово (длина 2 байта);
 
           - LONGWORD - определяет целое длинное слово  (длина  4
 
      байта);
 
           - QUADWORD - определяет  целое  квадрослово  (длина  8
 
      байтов). Величины этого типа  являются  целыми  числами  со
 
      знаком в диапазоне от -2**63 до 2**63-1;
 
           - OCTAWORD - определяет целое октаслово (длина 16 бай-
 
      тов). Величина этого типа является целым числом со знаком в
 
      диапазоне от -2**127 до 2**127-1;
 
           - FLOAT - определяет числа с плавающей запятой формата
 
      F (F_FLOATING, длина 4 байта). Величины  этого  типа  имеют
 
      диапазон от 0,29*10**(-38) до 1,7*10**38 и точность пример-
 
      но 7 десятичных цифр;
 
           - D_FLOAT - определяет числа с плавающей запятой  фор-
 
      мата D (D_FLOATING, длина 8 байтов).  Величины  этого  типа
 
      имеют диапазон, который аналогичен предыдущему типу, а точ-
 
      ность приблизительно 16 десятичных цифр;
 
           - G_FLOAT - определяет числа с плавающей запятой  фор-
 
      мата G (G_FLOATING, длина 8 байтов).  Величины  этого  типа
 
      имеют диапазон от 0,56*10**(-308) до 0,9*10**308 и точность
 
      приблизительно 15 десятичных цифр;
 
           - H_FLOAT - определяет числа с плавающей запятой  фор-
 
      мата H (H_FLOATING, длина 16 байтов). Величины  этого  типа
 
      имеют диапазон от 0,84*10**(-4932) до 0,59*10**4932 и  точ-
 
      ность приблизительно 33 десятичные цифры;
 
           - ASCII:N - определяет тип "цепочка (строка)  символов
 
      кода кои-8" (длина N байтов);
 
           - ASCIC - определяет тип "цепочка (строка)  подсчитан-


                                - 136 -
 
                          00152-01 34 07-1
 
 
      ных символов кода КОИ-8";
 
           - ASCID  -  определяет  дескриптор  строки  (описатель
 
      строки символов кода КОИ-8);
 
           - ASCIW - определяет переменную строку кодов КОИ-8;
 
           - ASCIZ   -   определяет   символьную   строку   кодов
 
      КОИ-8,дополненную нулями на конце;
 
           - DATE_TIME - определяет 64-битовое представление даты
 
      и времени, принятое в МОС ВП;
 
           - PACKED:N - определяет тип  "упакованное  десятичное"
 
      (длиной N цифр);
 
           - INSTRUCTION - определяет тип  "инструкция  (команда)
 
      системы МОС ВП" (переменная длина).
 
           Для изменения типа  по  умолчанию  следует  определить
 
      требуемый тип в качестве параметра в команде SET TYPE.
 
           Например, следующая команда изменяет тип по  умолчанию
 
      на шестибайтовую цепочку кода КОИ-8:
 
      DBG>SET TYPE ASCII:6  .
 
           В результате данной  команды  отладчик  интерпретирует
 
      любой об'ект без генерируемого компилятором типа в качестве
 
      шестибайтовой цепочки кода КОИ-8.
 
           Для определения текущего  типа  по  умолчанию  следует
 
      использовать команду SHOW TYPE .
 
           Если пользователь хочет, чтобы  все  об'екты,  даже  с
 
      типами, генерируемыми  компилятором,  интерпретировались  в
 
      одном из типов, он должен определить желаемый тип в качест-
 
      ве параметра в команде SET TYPE/OVERRIDE.
 
           Например, следующая команда сообщает отладчику о необ-
 
      ходимости интерпретации всех об'ектов, даже с генерируемыми
 
      компилятором типами, в качестве команд системы МОС ВП:
 


                                - 137 -
 
                          00152-01 34 07-1
 
 
      DBG>SET TYPE/OVERRIDE INSTRUCTION  .
 
           Для просмотра  того,  что  установка  типа  сработала,
 
      используется командA SHOW TYPE/OVERRIDE.
 
           Для отмены устанавливаемого таким образом обязательно-
 
      го типа следует использовать команду CANCEL TYPE/OVERRIDE .
 
           Если пользователь хочет, чтобы отладчик  интерпретиро-
 
      вал об'ект в одном из требуемых типов, но только на  протя-
 
      жении той команды, в которой указывается этот  об'ект,  ему
 
      следует определить требуемый тип в  качестве  квалификатора
 
      соответствующей команды. Тип, определяемый в качестве  ква-
 
      лификатора команды, является типом, который отменяет  любой
 
      другой тип при выполнении данной команды. Например, следую-
 
      щая команда сообщает отладчику о необходимости  интерпрети-
 
      ровать об'ект RADIUS в качестве байтового целого:
 
      DBG>EXAMINE/BYTE RADIUS  .
 
           В результате данной команды любой соответствующий сге-
 
      нерированный компилятором тип или текущий тип,  установлен-
 
      ный командой SET TYPE/OVERRIDE, отменяется на время  дейст-
 
      вия приведенной команды.
 
           Таким образом,  пользователь  может  управлять  типом,
 
      используемым отладчиком для интерпретации, тремя способами.
 
      Эти способы приведены в порядке возрастания их старшинства:
 
           1) установка типа по умолчанию с помощью  команды  SET
 
      TYPE;
 
           2) установка типа с отменой  старого  типа  с  помощью
 
      команды SET TYPE/оVERRIDE;
 
           3) определение типа с отменой старого  типа  на  время
 
      выполнения команды с помощью  квалификатора  типа  в  соот-
 
      ветствующей команде.
 
           Таким образом, установка типа с отменой  существующего


                                - 138 -
 
                          00152-01 34 07-1
 
 
      типа на время выполнения команды отменяет типы:
 
           - устанавливаемые по умолчанию;
 
           - устанавливаемые компилятором;
 
           - устанавливаемые командой с изменением типа.
 
      Установка типа с отменой существующего типа, отменяет типы,
 
      устанавливаемые по умолчанию или  компилятором;  сгенериро-
 
      ванный компилятором тип отменяет тип по умолчанию;  тип  по
 
      умолчанию, будучи самым младшим (слабым) типом, не отменяет
 
      типы, устанавливаемые другим способом.
 
           Примеры  использования  указанных  типов  в   процессе
 
      отладки приводятся в разделе 6.
 
 
 
           5.1.1. Типы адресных выражений
 
 
           Тип адресного выражения зависит от  текущего  типа  по
 
      умолчанию, от любых действующих в данное время  установлен-
 
      ных командами типов, а также от самого адресного выражения.
 
           Отладчик определяет тип адресного выражения следующими
 
      способами:
 
           1) если адресное выражение обнаружено в команде, кото-
 
      рая содержит квалификатор типа, то с этим адресным  выраже-
 
      нием связывается тип, определяемый данным квалификатором;
 
           2) если адресное выражение обнаружено в команде, кото-
 
      рая не содержит квалификатора типа,  то  с  соответствующим
 
      адресным выражением  связывается  тип,  который  установлен
 
      командой SET TYPE/OVERRIDE;
 
           3) если тип не связывается с адресным выражением любым
 
      из предыдущих способов, то  эта  связь  зависит  от  самого
 
      адресного выражения:
 
           - адресное выражение, которое состоит из одного симво-
 


                                - 139 -
 
                          00152-01 34 07-1
 
 
      лического обращения, имеет тип, определяемый  этим  обраще-
 
      нием в исходном языке (генерируемые компилятором типы);
 
           - символические имена отладчика для текущего  об'екта,
 
      логически предшествующего об'екта и логически  последующего
 
      об'екта определяют тип адресного  выражения,  для  которого
 
      они являются сокращениями;
 
           4) если тип не связывается с  адресным  выражением  ни
 
      одним из предыдущих способов, то соответствующему адресному
 
      выражению присваивается тип по умолчанию.
 
 
 
           5.2. Простые адреса
 
 
           В процессе отладки пользователь может выполнять  обра-
 
      щения к программным ячейкам путем применения символического
 
      обозначения в своей программе, а также других представлений
 
      (обозначений), генерируемых компилятором, и  представлений,
 
      относящихся к самому отладчику. В общем случае такие  формы
 
      представления называются простыми адресами.
 
           В данном подразделе представляются все  формы  простых
 
      адресов и описывается их интерпретация отладчиком.
 
 
 
           5.2.1. Символические обращения
 
 
           Символические обращения являются обращениями  к  прог-
 
      раммным ячейкам,  которые  используют  символические  имена
 
      программы с префиксами имен пути или без них.
 
           Символическое обращение может быть представлено симво-
 
      лическим именем исходного языка или  символическим  именем,
 
      которое создано с помощью команды отладчика DEFINE.
 
           В   примере    символические    обращения    DAT1    и
 
      ROUTINE\BLOCK\DAT1 являются  простыми  адресами  в  команде


                                - 140 -
 
                          00152-01 34 07-1
 
 
      отладчика EXAMINE:
 
      DBG>EXAMINE DAT1
 
      DBG>EXAMINE ROUTINE\BLOCK\DAT1
 
           Обе эти команды  сообщают  отладчику  о  необходимости
 
      воспроизведения величины DAT1 в  соответствующем  ей  типе,
 
      сгенерированном компилятором.
 
 
 
           5.2.2. Номера строк
 
 
           Некоторые языковые компиляторы генерируют номера строк
 
      в течение процесса компилирования для  обеспечения  возмож-
 
      ности обращения компилятора к программным ячейкам.
 
           В течение сеанса отладки пользователь может  применять
 
      эти номера строк для обращения к строкам кода в своей прог-
 
      рамме. Когда отладчик встречает символическое имя %LINE, он
 
      интерпретирует следующее за ним число в качестве генерируе-
 
      мого компилятором номера строки и использует его в качестве
 
      простого адреса для обращения к соответствующей ячейке.
 
           Пример показывает, как символическое имя %LINE  вместе
 
      с номером строки используется в качестве простого адреса:
 
      DBG>SET BREAK %LINE 232  .
 
           Для использования номеров  строк  в  качестве  простых
 
      адресов полезно иметь листинг, в котором помимо всего  про-
 
      чего приводится каждая строка  кода  и  соответствующий  ей
 
      номер строки.
 
           Пользователь может применять также номера строк вместе
 
      с квалификацией имени пути в качестве простых адресов.  Имя
 
      пути предшествует всему обозначению номера  строки,  напри-
 
      мер, MODUL\%LINE 30.
 


                                - 141 -
 
                          00152-01 34 07-1
 
 
           Символическое имя %LINE может быть использовано для
 
      определения блоков  без  имени  (или  анонимных  блоков)
 
      (см. п. 4.5.1).
 
 
 
           5.2.3. Номера операторов
 
 
           В тех языках программирования, которые допускают  воз-
 
      можность использования более  одного  оператора  в  строке,
 
      номера операторов используются для различия между  операто-
 
      рами одной строки.
 
           Номер оператора состоит из номера строки,  за  которым
 
      приводится точка и номер, идентифицирующий  оператор.  Этот
 
      формат выглядит следующим образом:
 
           %LINE XXX.YY  .
 
           В этом  формате  обозначение  XXX  представляет  собой
 
      номер строки, а YY является номером, определяющим оператор.
 
      Номер один представляет первый оператор, который начинается
 
      на соответствующей строке, номер два -  второй  оператор  и
 
      т.д..
 
           Например, в языке бейсик системы МОС ВП второй  опера-
 
      тор на строке 500 выражается следующим образом:
 
      %LINE 500.2  .
 
           Можно использовать также номера операторов с определе-
 
      нием имени пути в качестве простых адресов. Имя пути  пред-
 
      шествует   обозначению    номера    оператора,    например,
 
      MODULE\%LINE 30.3.
 


                                - 142 -
 
                          00152-01 34 07-1
 
 
           5.2.4. Числовые метки
 
 
           В некоторых  языках  программирования  числовые  метки
 
      используются для разметки строк исходного текста программы.
 
      Пользователь может использовать такие метки для обращения к
 
      строкам программы во время сеанса отладки,  указывая  перед
 
      этими метками имя %LABEL:
 
           %LABEL XXX .
 
           В этом  формате  обозначение  XXX  представляет  собой
 
      определенную пользователем числовую метку.
 
           Например, в ФОРТРАНЕ системы  МОС  ВП  числовая  метка
 
      является числом, которое размещается пользователем  в  спе-
 
      циально выделенной колонке его программы в принципиальной с
 
      точки зрения логики программы ячейке. Поэтому  пользователь
 
      может обращаться к этой ячейке. При отладке такой программы
 
      пользователь должен приводить перед обращением  к  числовой
 
      метке символическое имя %LABEL.
 
           На рис.9 показана часть листинга программы на ФОРТРАНЕ
 
      системы МОС ВП. Номера в самой левой колонке являются номе-
 
      рами строк программы; пользователь обращается к ним в тече-
 
      ние сеанса отладки, применяя префикс %LINE. Номера  в  сле-
 
      дующей колонке с правой стороны являются числовыми метками.
 
      Пользователь обращается к ним  в  течение  сеанса  отладки,
 
      используя префикс %LABEL.
 
 


                                - 143 -
 
                          00152-01 34 07-1
 
 
 
 
            Номера строк и числовые метки
 
 
 
              C    программа для вычисления площади круга
 
 
 
      0001         PROGRAM CIRCLE
 
      0002    1    TYPE 5
 
      0003    5    FORMAT (' ENTER RADIUS VALUE')
 
      0004         ACCEPT 10,RADIUS
 
      0005    10   FORMAT (F6.2)
 
      0006              IF (RADIUS .LE.0) GO TO 20
 
      0007         PI = 3.1415927
 
      0008         AREA = PI*RADIUS**2
 
      0009         TYPE 15,AREA
 
      0010    15   FORMAT (' AREA OF CIRCLE EQUALS ',F10.3)
 
      0011              GO TO 30
 
      0012    20        TYPE 25
 
      0013    25        FORMAT (' PLEASE TYPE A POSITIVE NUMBER')
 
      0014              GO TO 1
 
      0015    30           STOP
 
      0016         END
 
 
                                Рис. 9
 
 
           Следующая команда отладчика  останавливает  выполнение
 
      программы на числовой метке 20 в программе (см. рис. 9):
 
      DBG>SET BREAK %LABEL 20  .
 
           Следует отметить, что выполнение программы  останавли-
 
      вается на этой же программной ячейке при  выдаче  следующей
 
      команды:
 


                                - 144 -
 
                          00152-01 34 07-1
 
 
      DBG>SET BREAK %LINE 12  .
 
           Пользователь может применять числовую метку с  опреде-
 
      лением имени пути в  качестве  простого  адреса.  Имя  пути
 
      предшествует   обозначению   числовой   метки.    Например,
 
      CIRCLE\%LABEL 10.
 
 
 
           5.2.5. Числовые литералы
 
 
           Числовой литерал представляет собой любую цепочку сим-
 
      волов исходного языка, которая является  константой,  а  не
 
      символическим именем. Отладчик может интерпретировать  чис-
 
      ловые литералы различными способами.
 
           Если числовые литералы используются в простых адресах,
 
      то отладчик рассматривает их как адреса виртуальной памяти.
 
      С другой стороны, литералы в адресном выражении  трактуются
 
      как смещение от программной  ячейки  (в  таком  случае  они
 
      могут быть положительными или  отрицательными  числами  для
 
      указания направления смещения).
 
           В следующей команде  отладчика  литерал  4  обозначает
 
      четырехбайтовое смещение от адреса памяти,  представленного
 
      символическим именем OPT. Данная команда отладчика  обеспе-
 
      чивает занесение величины X, которая  должна  интерпретиро-
 
      ваться в качестве байтового целого числа (целого числа дли-
 
      ной в байт), в программную  ячейку,  определяемую  адресным
 
      выражением OPT+4:
 
      DBG>DEPOSIT/BYTE OPT+4 = X  .
 
           Числовые литералы часто используются  для  обозначения
 
      адресов виртуальной памяти. Это иллюстрируется примером:
 
      DBG>EXAMINE 5032  .
 
           При оценке адресного выражения, содержащего литерал  с
 


                                - 145 -
 
                          00152-01 34 07-1
 
 
      отличающимся от целого типом (например, литерал типа  вели-
 
      чины с плавающей запятой, битовой цепочки или  комплексного
 
      типа), отладчик пытается преобразовать такой литерал в фор-
 
      му целого в  семантике  исходного  языка  программирования.
 
      Если исходный язык обеспечивает  такое  преобразование,  то
 
      отладчик использует получаемую в результате целую величину;
 
      если такое преобразование не  обеспечивается,  то  отладчик
 
      выдает сообщение об ошибке.
 
           Следует добавить,  что  пользователь  может  применять
 
      любые действительные числовые литералы  исходного  языка  с
 
      операторами основания (системы  счисления).  Эти  операторы
 
      заставляют отладчик интерпретировать входную  информацию  с
 
      указанным основанием:
 
           %BIN - отладчик воспринимает числа в двоичной системе
 
      счисления;
 
           %DEC - числа воспринимаются как десятичные;
 
           %HEX - числа воспринимаются как шестнадцатеричные;
 
           %OCT - числа воспринимаются как восьмеричные.
 
 
 
           5.2.6. Символические имена текущего об'екта
 
 
           Символическими именами текущих об'ектов являются  точ-
 
      ка (.) и постоянное символическое  имя  отладчика  %CURLOC.
 
      Пользователь может применять их для обращения к программной
 
      ячейке,  которая  была  последней  ячейкой,  опрошенной   с
 
      помощью команд EXAMINE или DEPOSIT .
 
           Другими словами, когда выполняется любая из  следующих
 
      двух команд, значение текущего об'екта устанавливается рав-
 
      ным значению адресного выражения в этой команде:
 
           EXAMINE адресное_выражение;
 


                                - 146 -
 
                          00152-01 34 07-1
 
 
           DEPOSIT адресное_выражение = значение .
 
           Кроме того, отладчик интерпретирует значение  текущего
 
      об'екта в соответствии с типом адресного выражения, опреде-
 
      ленного в команде EXAMINE или DEPOSIT,  которые  устанавли-
 
      вают текущий об'ект.
 
           В примере команда EXAMINE RADIUS устанавливает текущий
 
      об'ект. Результатом команды EXAMINE является вывод на дисп-
 
      лей имени текущего об'екта (CIRCLE\RADIUS) и значения теку-
 
      щего об'екта в виде числа с плавающей запятой:
 
      DBG>EXAMINE RADIUS               !Установка символи-
 
      CIRCLE\RADIUS:    0.0000000E+00  !ческого имени теку-
 
                                       !щего об'екта 
 
      DBG>EXAMINE .                    !Текущий об'ект есть
 
      CIRCLE\RADIUS:    0.0000000E+00  !RADIUS. Воспроизве-
 
                                       !дение типа (тип
 
                                       !об'екта RADIUS) 
 
      DBG>DEPOSIT PI = 3.141593        !Установка символи-
 
                                       !ческого имени теку-
 
                                       !щего об'екта 
 
      DBG>EXAMINE %CURLOC
 
      CIRCLE\PI:     3.141593          !Текущим об'ектом явля-
 
                                       !ется число PI 
 
 
 
           5.2.7. Символические имена логического предшественника
 
 
           Символическими  именами  логического   предшественника
 
      являются символическое имя ^  и  постоянное  имя  отладчика
 
      %PREVLOC. Когда символическое имя текущего об'екта относит-
 
      ся к целому агрегату (например, массиву),  можно  использо-
 
      вать  символическое  имя  логического  предшественника  для
 


                                - 147 -
 
                          00152-01 34 07-1
 
 
      обращения к тому об'екту  из  агрегата,  который  логически
 
      предшествует текущему об'екту.
 
           Логический предшественник об'екта может  не  быть  его
 
      физическим предшественником. Это означает,  что  логический
 
      предшественник не обязательно должен занимать область физи-
 
      ческой памяти, который непосредственно предшествует текуще-
 
      му об'екту. Такой случай может  иметь  место,  например,  в
 
      случае, когда текущий об'ект относится к элементу несвязан-
 
      ного массива А(2), логический предшественник которого  А(1)
 
      не записан рядом с А(2) в физической памяти. С другой  сто-
 
      роны, логический предшественник об'екта может быть также  и
 
      его физическим предшественником. Например, в связанном мас-
 
      сиве об'ект А(1) является логическим и физическим предшест-
 
      венником об'екта А(2).
 
           В некоторых случаях  текущий  об'ект  может  не  иметь
 
      логического предшественника. Например, первый элемент  мас-
 
      сива А(1) не имеет логического предшественника, и  следова-
 
      тельно, его физический предшественник логически не связан с
 
      ним.
 
           Как и в отношении текущего об'екта,  отладчик  исполь-
 
      зует тип и символическую информацию, связанную с логическим
 
      предшественником.
 
           На примере показано,  как  использовать  символическое
 
      имя логического  предшественника  для  просмотра  элементов
 
      массива:
 
      DBG>DEPOSIT CHAR(1)='1234567890'  !Установка символи-
 
                                        !ческого имени теку-
 
                                        !щего об'екта 
 
      DBG>DEPOSIT CHAR(2)='ABCDEFGHIJ'  !Установка символи-
 
                                        !ческого имени теку-


                                - 148 -
 
                          00152-01 34 07-1
 
 
                                        !щего об'екта 
 
      DBG>DEPESIT CHAR(3)='АБВГДЕЖЗИК'  !Установка символи-
 
                                        !ческого имени теку-
 
                                        !щего об'екта 
 
      DBG>EXAMINE .                     !Просмотр текущего
 
      MOD\CHAR(3): АБВГДЕЖЗИК           !об'екта, которым
 
                                        !является CHAR(3) 
 
      DBG>EXAMINE ^                     !Логический пред-
 
      MOD\CHAR(2): ABCDEFGHIJ           !шественник является
 
                                        !предыдущим элемен-
 
                                        !том массива
 
                                        !CHAR(2) 
 
      DBG>EXAMINE %PREVLOC              !Логический пред-
 
      MOD\CHAR(1): 1234567890           !шественник является
 
                                        !предыдущим элемен-
 
                                        !том массива
 
                                        !CHAR(1) 
 
 
 
           5.2.8. Символическое имя логического преемника
 
 
           Символическими именами логического преемника  являются
 
      клавиша RETURN (возврат)  и  постоянное  символическое  имя
 
      отладчика %NEXTLOC. Символические имена логического  преем-
 
      ника могут быть использованы в команде EXAMINE для просмот-
 
      ра об'екта, который логически следует за текущим  об'ектом.
 
      Это выполняется путем ввода команды EXAMINE без операнда  и
 
      последующим нажатием клавиши RETURN.
 
           Логический преемник может и не быть физически  следую-
 
      щим. Это означает, что он может не занимать  область  физи-
 
      ческой памяти непосредственно за памятью текущего  об'екта.
 


                                - 149 -
 
                          00152-01 34 07-1
 
 
      Такой случай имеет место, например, при условии, что  теку-
 
      щий об'ект относится к элементу несвязанного массива  A(2),
 
      следующий элемент которого A(3) не размещается  непосредст-
 
      венно за A(2) в физической памяти. С другой стороны,  логи-
 
      чески следующий об'ект (преемник) может быть также и  физи-
 
      чески следующим об'ектом.  Например,  в  связанном  массиве
 
      элемент A(3) является как логически, так и  физически  сле-
 
      дующим об'ектом по отношению к элементу A(2).
 
           В некоторых случаях текущий об'ект может  и  не  иметь
 
      логически следующего за ним  об'екта.  Например,  последний
 
      элемент массива не имеет логически  следующего  об'екта,  а
 
      соответствующий физически следующий об'ект не связан  логи-
 
      чески с текущим.
 
           Как в случае текущего об'екта и логически предшествую-
 
      щего  об'EKTA,  отладчик  использует  тип  и  символическую
 
      информацию, связанную с логическим преемником.
 
           На примере показано, как символическое имя логического
 
      преемника может быть использовано для просмотра  последова-
 
      тельных элементов массива:
 
      DBG>DEPOSIT CHAR(1)='1234567890'
 
      DBG>DEPOSIT CHAR(2)='ABCDEFGHIJ'
 
      DBG>DEPOSIT CHAR(3)='АБВГДЕЖЗИК'
 
      DBG>EXAMINE CHAR(1)             !Установка символи-
 
      MOD\CHAR(1):1234567890          !ческого имени теку-
 
                                      !щего об'екта 
 
      DBG>EXAMINE <ВК>                !Логически следующим
 
      MOD\CHAR(2):ABCDEFGHIJ          !является CHAR(2) 
 
      DBG>EXAMINE %NEXTLOC            !Логически следующим
 
      MOD\CHAR(3):АБВГДЕЖЗИК          !является CHAR(3) 
 


                                - 150 -
 
                          00152-01 34 07-1
 
 
           5.3. Адресные выражения
 
 
           Адресное выражение определяет программную ячейку (воз-
 
      можно с типом).  Оно  может  состоять  из  одного  операнда
 
      (простой адрес) или из нескольких операндов со знаками опе-
 
      раций и разделителями.
 
           Отладчик  вычисляет  значение  адресного  выражения  в
 
      соответствии со своими собственными правилами, которые ана-
 
      логичны правилам, используемым для вычислений  выражений  в
 
      языке программирования. Как выражение, так и адресное выра-
 
      жение могут включать знаки операций и разделители и  вычис-
 
      ляются в соответствии  с  правилами  старшинства.  Но  если
 
      результатом  вычисления  выражения  является  значение,  то
 
      результатом   вычисления   адресного   выражения   является
 
      32-разрядное целое слово, которое представляет  программную
 
      ячейку.
 
           В адресном выражении операнд может быть одним из  сле-
 
      дующих элементов:
 
           - простой адрес;
 
           - унарный знак операции с операндом;
 
           - бинарный знак операции с двумя операндами;
 
           - адресное выражение, заключенное в скобки.
 
 
 
           5.3.1. Операнды
 
 
           Операнды в  адресном  выражении  могут  быть  простыми
 
      адресами (подраздел 5.2) или подвыражениями, причем  подвы-
 
      ражение является выражением внутри  выражения.  Операнды  в
 
      подвыражении могут быть простыми адресами или другими  под-
 
      выражениями.
 
           В примере 1 простой  адрес  %LINE  40  используется  в


                                - 151 -
 
                          00152-01 34 07-1
 
 
      качестве операнда в адресном  выражении,  которое  содержит
 
      также литерал "2" в качестве  операнда,  а  также  включает
 
      знак операции умножения и разделители:
 
      DBG>EXAMINE (%LINE 40)*2  .
 
           Указанная команда выводит на дисплей величину из прог-
 
      раммной ячейки, адрес которой  в  два  раза  больше  адреса
 
      строки 40 программы (%LINE 40).
 
           В примере 2 адресное выражение (X+4)*2 состоит из двух
 
      операндов: подвыражения (X+4) и литерала 2:
 
      DBG>EVALUATE/ADDRESS (X+4)*2  .
 
           Данная команда  вычисляет  виртуальный  адрес  памяти,
 
      определяемый адресным выражением (X+4)*2.
 
           В примере 3 адресное  выражение  ((X-8)*2)+4  содержит
 
      два подвыражения. Большее подвыражение ((X-8)*2) разделяет-
 
      ся как один операнд для знака операции сложения,  а  другим
 
      операндом является литерал 4.  Меньшее  подвыражение  (X-8)
 
      содержится в пределах большего выражения и  является  одним
 
      из операндов для знака операции умножения (другим операндом
 
      является литерал 2):
 
      DBG>DEPOSIT ((X-8)*2)+4 = Q  .
 
           Данная команда обеспечивает  занесение  величины  Q  в
 
      ячейку, представляемую адресным выражением ((X-8)*2)+4.
 
 
 
           5.3.2. Знаки операций
 
 
           Знак операции с  одним  операндом  называется  унарным
 
      знаком операции. Знак операции с двумя операндами (членами)
 
      называется бинарным знаком операции.
 
           Список допустимых знаков операций:
 
           - знак плюс (+) - может быть как унарным, так и бинар-
 


                                - 152 -
 
                          00152-01 34 07-1
 
 
      ным знаком. В качестве унарного знака  операции  знак  плюс
 
      указывает неизмененную величину своего операнда. В качестве
 
      бинарного знака операции знак  плюс  складывает  предыдущий
 
      операнд с последующим операндом;
 
           - знак минус (-) -  может  быть  как  унарным,  так  и
 
      бинарным знаком. В качестве унарного  знака  операции  знак
 
      минус указывает отрицательную величину своего  операнда.  В
 
      качестве бинарного знака операции знак минус вычитает  пос-
 
      ледующий операнд из предыдущего операнда;
 
           - знак умножения (*) -  является  бинарным  знаком.  В
 
      качестве бинарного знака операции знак  умножения  умножает
 
      предыдущий операнд на последующий операнд;
 
           - знак деления  (/)  -  является  бинарным  знаком.  В
 
      качестве бинарного знака операции знак деления обеспечивает
 
      деление предыдущего операнда на последущий операнд;
 
           - знаки "коммерческое при" (@) и  "точка"  (.)  -  оба
 
      являются унарными. В качестве унарных знаков  операции  эти
 
      знаки функционируют как знаки операций  "содержимое".  Знак
 
      операции "содержимое" приводит  к  тому,  что  его  операнд
 
      интерпретируется в качестве виртуального адреса, а  поэтому
 
      запрашивает "содержимое" этого адреса (т.е. величину, нахо-
 
      дящуюся по этому  адресу).  Предположим  для  примера,  что
 
      величина переменной типа указателя PTR составляет  7FF00000
 
      (шестнадцатеричная величина) и является виртуальным адресом
 
      об'екта, который хочет просмотреть пользователь.  Предполо-
 
      жим также, что величина этого об'екта равна 3FF00000 (щест-
 
      надцатеричная). Следующая команда демонстрирует использова-
 
      ние знака операции "содержимое"  для  просмотра  указанного
 
      об'екта:
 


                                - 153 -
 
                          00152-01 34 07-1
 
 
      DBG>EXAMINE/LONG .PTR
 
      7FF00000: 3FF00000     ;
 
           - знак "поле битов" - является унарным.  Может  приме-
 
      няться при обращении к адресному выражению.  Чтобы  набрать
 
      поле битов, нужно иметь битовое смещение (P), битовую длину
 
      (S) и бит знакового расширения (E)  (последний  параметр  -
 
      необязательный). Например, для просмотра адресного  выраже-
 
      ния X_NAME, начинающегося с третьего бита,  имеющего  длину
 
      четыре бита и не имеющего знакового расширения,  необходимо
 
      ввыдать следующую команду:
 
      DBG>EXAMINE X_NAME <3,4,0> .
 
 
 
           5.3.3. Старшинство
 
 
           Правила старшинства определяют  последовательность,  в
 
      которой  выполняются  операции  выражения.  Хотя   отладчик
 
      вычисляет выражения в соответствии со  своими  собственными
 
      правилами старшинства, которые не зависят от языка програм-
 
      мирования, эти правила аналогичны соответствующим  правилам
 
      большинства языков.
 
           Порядок, в котором  выполняются  операции  в  пределах
 
      адресного выражения, определяется факторами, которые приве-
 
      дены в порядке  убывания  старшинства  (первый  приведенный
 
      фактор является самым старшим):
 
           1) использование разделителей (обычно это круглые  или
 
      квадратные скобки) для группирования операндов с конкретны-
 
      ми знаками операций;
 
           2) присвоение относительного приоритета каждому  знаку
 
      операции;
 
           3) приоритет знаков операций с левой стороны в  правую
 


                                - 154 -
 
                          00152-01 34 07-1
 
 
      сторону.
 
           Следующие действительные знаки операций отладчика при-
 
      ведены в порядке убывания старшинства:
 
           1) унарные знаки операций ((.),(@),(+),(-));
 
           2) знаки операций умножения и деления ((*),(/));
 
           3) знаки операций сложения и вычитания ((+),(-)).
 
           Например, при вычислении следующего адресного  выраже-
 
      ния:
 
      5-(T+5)/4
 
      Отладчик сначала складывает операнды, которые  заключены  в
 
      круглые скобки, затем делит полученный результат  на  4,  а
 
      затем вычитает результат этого деления из 5.
 
 
 
           5.3.4. Команда EVALUATE/ADDRESS
 
 
           Отладчик  интерпретирует  операнд  данной  команды   в
 
      качестве независящего от языка  программирования  адресного
 
      выражения, вычисляет  значение  этого  адресного  выражения
 
      путем использования  своих  собственных  правил  вычисления
 
      выражений (которые аналогичны таким же правилам большинства
 
      языков) и воспроизводит величину этого адресного  выражения
 
      в качестве виртуального адреса.
 
           Формат данной команды:
 
      EVALUATE/ADDRESS адресное_выражение[,адресное_выражение...]
 
           Если пользователь определяет квалификатор режима осно-
 
      вания, то отладчик воспроизводит значение  соответствующего
 
      адресного выражения как виртуальный адрес  с  этим  основа-
 
      нием.
 
           Можно вычислять более  одного  адресного  выражения  в
 
      одной рассматриваемой команде EVALUATE ADRESS, разделяя эти
 


                                - 155 -
 
                          00152-01 34 07-1
 
 
      выражения запятыми.
 
           Любое адресное  выражение,  соответствующее  описаниям
 
      данного  раздела,  может  быть  использовано   с   командой
 
      EVALUATE/ADDRESS.
 
           Данная команда весьма удобна для определения виртуаль-
 
      ных адресов символических имен и выражений, которые  содер-
 
      жат или не содержат символические имена, например:
 
      DBG>EVALUATE/ADDRESS RADIUS     !Для определения
 
      1024                            !адреса символи-
 
                                      !ческого имени 
 
      DBG>EVALUATE/ADDRESS 1024 + 40  !Для выполнения ад-
 
      1064                            !ресной арифметики 
 
      DBG>EVALUATE/ADDRESS (RADIUS + 4)/2
 
      514
 
 
 
 
                    6. Просмотр и занесение данных
 
 
 
           В  данном  разделе  описывается  использование  команд
 
      EXAMINE, DEPOSIT и EVALUATE, а также управление режимами  и
 
      типами, используемыми отладчиком.
 
 
 
           6.1. Режимы
 
 
           Команды SET  MODE  и  SET  RADIX  позволяют  управлять
 
      интерпретацией отладчиком той информации, которая  вводится
 
      пользователем в командах отладчика, а  также  воспроизведе-
 
      нием  отладчиком  результатов  выполнения  команд.  Следует
 
      отметить, что  команда  SET  MODE  используется  также  для
 
      управления функциями, не относящимися к интерпретации  дан-
 
      ных или адресов. Здесь приводится краткое изложение команд.


                                - 156 -
 
                          00152-01 34 07-1
 
 
           Команда SET MODE[NO]G_FLOATING  указывает,  что  любые
 
      константы  двойной  точности,  встречающиеся  в  выражении,
 
      должны рассматриваться как константы формата G или D.
 
           Основание системы  счисления  (или  просто  основание)
 
      влияет на интерпретацию числовых литералов и,  при  опреде-
 
      ленных условиях, на воспроизведение данных. Основание можно
 
      задать тремя способами:
 
           1)  командным  квалификатором,  указывающим  основание
 
      системы счисления;
 
           2) командой SET RADIX/OVERRIDE;
 
           3) командой SET RADIX.
 
           Команда SET RADIX/OVERRIDE отменяет  действие  команды
 
      SET RADIX, а обе эти команды могут быть отменены квалифика-
 
      тором основания с командами EXAMINE и EVALUATE.
 
           Ключевыми словами  основания  являются  слова  DECIMAL
 
      (десятичное  основание),   HEXADECIMAL   (шестнадцатеричное
 
      основание), OCTAL (восьмеричное основание) и BINARY (двоич-
 
      ное основание). Они могут быть использованы или  как  пара-
 
      метры в командах SET RADIX/OVERRIDE и  SET  RADIX  или  как
 
      квалификаторы некоторых команд.
 
           Команда SET MODE[NO]SYMBOL оказывает влияние на предс-
 
      тавление информации отладчика: в символьном виде или нет.
 
           Для воспроизведения  текущих  режимов  следует  выдать
 
      команду SHOW MODE .
 


                                - 157 -
 
                          00152-01 34 07-1
 
 
           6.1.1. Режимы основания
 
 
           для интерпретации и воспроизведения  отладчиком  чисел
 
      можно задать одно из четырех оснований: BINARY  (двоичное),
 
      HEXADECIMAL (шестнадцатеричное), DECIMAL  (десятичное)  или
 
      OCTAL (восьмеричное). Для большинства языков программирова-
 
      ния основанием по умолчанию является  DECIMAL.  Однако  для
 
      языков макро  и  блисс  основанием  по  умолчанию  является
 
      HEXADECIMAL.
 
           Основание можно задать одним из трех способов:
 
           1) командным  квалификатором.  Используя  квалификатор
 
      режима основания, можно отменять текущий режим основания на
 
      время выполнения команды. Указываемый режим основания отме-
 
      няет  все  остальные  режимы   основания.   Квалификаторами
 
      являются /BINARY, /DECIMAL, /HEXADECIMAL и  /OCTAL.  Напри-
 
      мер, если действует режим десятичного основания (по умолча-
 
      нию), а необходимо  получить  значение  программной  ячейки
 
      STATSBLK в двоичном виде,  то  указывается  соответствующий
 
      квалификатор:
 
      DBG>EXAMINE/BIN STATSBLK   .
 
      Эта команда выдает STATSBLK  как  двоичное,  независимо  от
 
      существующего режима основания. Квалификатор режима основа-
 
      ния управляет основанием только выходной информации, но  не
 
      входной. Основание  системы  счисления  входной  информации
 
      можно, однако, установить четырьмя операторами:
 
           - %BIN - отладчик будет воспринимать входную  информа-
 
      цию как двоичную;
 
           - %DEC - как десятичную;
 
           - %HEX - как шестнадцатеричную;
 
           - %OCT - как восьмеричную;
 


                                - 158 -
 
                          00152-01 34 07-1
 
 
           2) командой SET RADIX/OVERRIDE. В  качестве  параметра
 
      используются ключевые слова BINARY,  DECIMAL,  HEXADECIMAL,
 
      OCTAL. Например, последовательность команд 
 
      DBG>SET RADIX/OVERRIDE OCT
 
      DBG>EXAMINE STATSBLK
 
      выдает STATSBLK как восьмеричное целое, отвергая имеющую-
 
      ся текущую информацию о STATSBLK. Для отмены основания, от-
 
      вергающего другие, выдается команда CANCEL RADIX/OVERRIDE;
 
           3) командой SET  RADIX.  После  задания  этой  команды
 
      отладчик воспроизводит целые величины  (включая  адреса)  с
 
      указанным основанием. Однако  другие  величины  (такие  как
 
      числа с плавающей запятой) воспроизводятся в своем  обычном
 
      виде. Например, последовательность команд 
 
      DBG>SET RADIX HEX
 
      DBG>EXAMINE 1000
 
      DBG>EXAMINE STATSBLK
 
      выдает целое значение 1000 как шестнадцатеричное целое,
 
      однако переменная STATSBLK будет отображена в соответст-
 
      вии со своим типом.
 
           Когда отладчик вычисляет значение выражения  исходного
 
      языка или адреснго выражения,  он  интерпретирует  числовые
 
      литералы в пределах этого выражения в текущем режиме  осно-
 
      вания для входной информации.
 
           Когда отладчик вычисляет значение адресного  выражения
 
      или выражения исходного языка, он воспроизводит  соответст-
 
      вующий результат в режиме текущего основания, если при этом
 
      не указан квалификатор режима основания. В последнем случае
 
      отладчик воспроизводит результат в режиме основания,  опре-
 
      деленном квалификатором команды.
 
           Следует отметить, что когда пользователь вводит  шест-


                                - 159 -
 
                          00152-01 34 07-1
 
 
      надцатеричную величину, которая начинается с буквы, он дол-
 
      жен приводить перед такой величиной нуль (0);  в  противном
 
      случае  отладчик  пытается  интерпретировать  этот  ввод  в
 
      качестве символического имени.
 
           Режим  основания,  заданный  квалификатором,  отменяет
 
      режимы основания, установленные  двумя  другими  способами.
 
      Подобным образом режим основания,  указанный  командой  SET
 
      RADIX/OVERRIDE, отменяет режим основания, заданный командой
 
      SET RADIX.
 
           Хотя команда SET RADIX имеет тот же эффект, что и  SET
 
      MODE, ее (SET RADIX)  использование  более  предпочтительно
 
      при определении основания системы счисления.
 
           Для отмены режимов, установленных командой  SET  MODE,
 
      выдается команда CANCEL MODE. После ее выполнения действуют
 
      режимы по умолчанию.
 
           Пример демонстрирует, как режимы основания используют-
 
      ся в командах EXAMINE, EVALUATE и EVALUATE/ADDRESS:
 
      DBG>SHOW RADIX
 
      INPUT RADIX: DECIMAL
 
      OUTPUT RADIX: DECIMAL
 
      DBG>EVALUATE 10
 
      10                      !"10" является десятичным
 
                              !для ввода и вывода 
 
      DBG>EVALUATE/HEX 10
 
      OA                      !/HEX влияет только на вывод 
 
      DBG>SET RADIX/OUTPUT HEX
 
      DBG>SHOW RADIX
 
      INPUT RADIX: DECIMAL
 
      OUTPUT RADIX: HEX
 
      DBG>EVALUATE 10


                                - 160 -
 
                          00152-01 34 07-1
 
 
      OA                      !Режим основания для ввода остает-
 
                              !ся десятичным. Режим основания
 
                              !для вывода стал шестнадцатерич-
 
                              !ным 
 
      DBG>SHOW MODE
 
      MODES: SYMBOLIC, NOSCREEN, NOKEYPAD  !Воспроизведение
 
      INPUT RADIX: DECIMAL                 !режимов по умолчанию 
 
      OUTPUT RADIX: DECIMAL
 
      DBG>EXAMINE %LINE 14
 
      TOY$MAIN\%LINE 14:CALLG W^128(R11).@L^TOY$MAIN+596
 
                                  !Типом по умолчанию для %LINE
 
                                  !является команда 
 
      DBG>E/HEX
 
      1591: 00 000214FF 0080CBFA  !Шестнадцатеричное воспроизве-
 
                                  !дение команды на %LINE 14 
 
                              .   !Операнды команды с шестнадца-
 
                                  !тиричным основанием 
 
      DBG>E PSL
 
      TOY$MAIN\%PSL:
 
             CMP TP FPD IS CURMOD PRVMOD IPL DV FU IV T N Z V C
 
              0  0   0  0   USER   USER   0  0  0  1  0 0 0 0 0
 
      DBG>E/HEX PSL               !Воспроизведение PSL с шестнад-
 
      TOY$MAIN\%PSL: 0 3 C 000020 !цатеричным основанием 
 
      DBG>SET RADIX HEX           !Установка режима по умолчанию
 
                                  !на шестнадцатеричное 
 
      DBG>EXAMINE STATSBLK
 
      TOY$MAIN\STATSBLK           !Просмотр массива STATSBLK в
 
      (1): 00000004               !шестнадцатеричном виде 
 
      (2): 00000012
 
      (3): 0000009A


                                - 161 -
 
                          00152-01 34 07-1
 
 
      (4): 00000173
 
      (5): 00000C93
 
      DBG>SHOW RADIX              !Воспроизведение текущих режи-
 
      INPUT RADIX: HEXADECIMAL    !мов основания по умолчанию 
 
      OUTPUT RADIX: HEXADECIMAL
 
      DBG>EXAMINE/BIN STATSBLK    !Просмотр STATSBLK в двоичном
 
      CONV_EX$MAIN\STATSBLK       !виде                        
 
      (1): 00000000 00000000 00000000 00000100
 
      (2): 00000000 00000000 00000000 00010010
 
      (3): 00000000 00000000 00000000 10011010
 
      (4): 00000000 00000000 00000001 01110011
 
      (5): 00000000 00000000 00001100 10010011
 
 
 
           6.1.1.1. Операторы основания
 
 
           Используя оператор основания можно задавать интепрета-
 
      цию отладчиком числовых литералов с двоичным (%BIN),  деся-
 
      тичным (%DEC), восьмеричным  (%OCT)  или  шестнадцатеричным
 
      (%HEX) основанием (при условии допустимости числового лите-
 
      рала для данного  режима  основания).  Операторы  основания
 
      полезны в том случае,  когда  необходимо  ввести  несколько
 
      числовых литералов с  разными  основаниями  одной  командой
 
      отладчика.  Используя  операторы  основания,   пользователь
 
      может задавать основания для каждого числового литерала.
 
           Операторы основания полезны также и в том случае, ког-
 
      да требуется преобразовать число из одной системы счисления
 
      в другую. Например, если необходимо посмотреть, как  выгля-
 
      дит десятичное 1000 в шестнадцатеричном виде, можно исполь-
 
      зовать команду:
 


                                - 162 -
 
                          00152-01 34 07-1
 
 
      DBG>EV/HEX %DEC 1000
 
      000003E8
 
           Оператор основания имеет  более  высокое  старшинство,
 
      чем любой  другой  оператор.  Например,  в  выражении  %HEX
 
      20+33 20 рассматривается как целое шестнадцатеричное число,
 
      а 33 как целое десятичное  число  (предполагая,  что  режим
 
      десятичного основания действует  по  умолчанию).  Однако  в
 
      выражении %HEX(20+33) оба числа  20  и  33  трактуются  как
 
      целые шестнадцатеричные.
 
           Операторы основания допускают вложенность. Например, в
 
      выражении %HEX(20+%OCT 10+33) числа 20 и 33 рассматриваются
 
      как шестнадцатеричные, а 10 - как восьмеричное.
 
           Предположим, для  примера,  что  необходимо  поместить
 
      команду СМ 1700  в  ячейку  памяти,  обозначенную  адресным
 
      выражением,  которое  является  шестнадцатеричным  числовым
 
      литералом. Предположим далее, что один операнд этой  коман-
 
      ды - десятичный литерал. Необходимо, чтобы отладчик воспри-
 
      нял эти два литерала с их соответствующими  основаниями.  В
 
      этой ситуации нельзя воспользоваться квалификаторами  осно-
 
      вания, т. к. для команды DEPOSIT они недопустимы. Одним  из
 
      возможных решений является использование операторов основа-
 
      ний: %HEX - для адресного выражения и %DEC -  для  операнда
 
      команды. Для макро СМ 1700 , эту ситуацию можно продемонст-
 
      рировать следующим примером:
 
      DBG>DEPOSIT/INSTRUCTION %HEX 5432='MOVL ^0%DEC 222,R1'
 
           В этой команде отладчик воспринимает  литерал  5432  с
 
      шестнадцатеричным основанием, а литерал 222 - с десятичным.
 


                                - 163 -
 
                          00152-01 34 07-1
 
 
           6.1.2. Символический и несимволический режимы
 
 
           В символическом режиме (режим по  умолчанию)  отладчик
 
      пытается воспроизводить все адреса в символическом виде.  В
 
      несимволическом режиме этого не происходит, что может  уве-
 
      личить скорость отработки команд. Например:
 
      DBG>EVALUATE/ADDRESS X
 
      512
 
      DBG>EXAMINE 512
 
      FOO\X:0
 
      DBG>EXAMINE/NOSYMBOL 512
 
      512:0
 
           Квалификатор /NOSYMBOL воздействует так же и на  отоб-
 
      ражение команд. Например:
 
      DBG>SHOW MODE                        !Воспроизведение режи-
 
      MODES: SYMBOLIC, NOSCREEN, NOKEYPAD   !мов по умолчанию 
 
      INPUT RADIX: DECIMAL
 
      OUTPUT RADIX: DECIMAL
 
      DBG>EXAMINE/INSTRUCTION OUT          !Воспроизведение
 
      DRAW\OUT: CMPB B ^DRAW\COL.#0        !OUT в качестве
 
                                           !команды с
 
                                           !использованием
 
                                           !символического
 
                                           !режима по
 
                                           !умолчанию 
 
                                           !Операнд
 
                                           !DRAW\COL
 
                                           !выражается в
 
                                           !символической
 
                                           !форме 
 


                                - 164 -
 
                          00152-01 34 07-1
 
 
      DBG>EXAMINE/INSTRUCTION/NOSYMBOL OUT !Определение не-
 
      DRAW\OUT: CMPB B^3599,#0             !символического
 
                                           !режима. Теперь
 
                                           !операнд DRAW\OUT
 
                                           !представлен в
 
                                           !числовой форме 
 
 
 
           6.2. Команда EXAMINE
 
 
           Команда EXAMINE следующего  формата  используется  для
 
      воспроизведения величин одного или  нескольких  программных
 
      об'ектов:
 
      EXAMINE [/квалификатор[/квалификатор...]]-
 
              [адресное_выражение[:адресное_выражение]-
 
              [,адресное_выражение[:адресное_выражение]...]]
 
           Если в данной команде пользователь указывает  параметр
 
      одного адресного выражения, то отладчик выводит значение из
 
      ячейки, определенной этим адресным выражением. При этом тип
 
      связан с содержимым этой ячейки.
 
           С помощью одной  команды  EXAMINE  пользователь  может
 
      просматривать несколько об'ектов (список) путем ввода  нес-
 
      кольких адресных выражений, разделяя их запятыми (,).
 
           С помощью  одной  такой  команды  можно  просматривать
 
      целый диапазон об'ектов путем  ввода  адресного  выражения,
 
      которое определяет первый об'ект этого  диапазона,  двоето-
 
      чия (:) и адресного выражения, которое определяет последний
 
      об'ект данного диапазона. Такой диапазон представляет собой
 
      непрерывную последовательность программных об'ектов.
 
           Можно так же просматривать список диапазонов  об'ектов
 
      с помощью одной команды EXAMINE путем разделения этих  диа-
 


                                - 165 -
 
                          00152-01 34 07-1
 
 
      пазонов запятыми.
 
           Когда пользователь просматривает  содержимое  длинного
 
      слова состояния процессора  (PSL),  отладчик  воспроизводит
 
      содержимое этого слова в форматированном виде.
 
           Адресные выражения могут принимать любую из форм, опи-
 
      санных в разделе 5.
 
 
 
           6.2.1. Квалификаторы команды EXAMINE
 
 
           Если пользователь  определяет  командный  квалификатор
 
      (квалификатор команды) типа, то об'ект, указываемый  адрес-
 
      ным выражением, воспроизводится в этом типе.
 
           Имеются следующие командные квалификаторы типа:
 
      /ASCIC            /D_FLOAT           /QUADWORD
 
      /ASCID            /DATE_TIME         /OCTAWORD
 
      /КОИ-8:N          /FLOAT             /PACKED
 
      /ASCIW            /G_FLOAT           /PSL
 
      /ASCIZ            /H_FLOAT           /PSW
 
      /BYTE             /INSTRUCTION       /SOURCE
 
      /CONDITION_VALUE  /LONGWORD          /WORD
 
           Пользователь может указывать также командные  квалифи-
 
      каторы режима основания  (/HEXADECIMAL,  /DECIMAL,  /OCTAL,
 
      /BINARY) и/или квалификаторы символического и несимволичес-
 
      кого режимов (/SYMBOL и /NOSYMBOL) (подраздел 6.1).
 
           Можно определять квалификатор типа, квалификатор режи-
 
      ма основания и квалификатор символического  или  несимволи-
 
      ческого режима в одной команде EXAMINE.
 
           Пример демонстрирует использование этих командных ква-
 
      лификаторов в команде EXAMINE:
 


                                - 166 -
 
                          00152-01 34 07-1
 
 
      DBG>SET LANGUAGE FORTRAN          !Установка языка ФОРТРАН 
 
      DBG>SHOW MODE
 
      MODES:NOSYMBOLIC,NOSCREEN,NOKEYPAD!Воспроизведение режимов
 
      INPUT RADIX: DECIMAL              !по умолчанию 
 
      OUTPUT RADIX: DECIMAL
 
      DBG>SHOW TYPE                     !Воспроизведение типа по
 
      TYPE: LONG INTEGER                !умолчанию (длинное целое
 
      DBG>EXAMINE %LINE 15              !воспроизведение %LINE 15
 
      TOY\%LINE 15: MOVL #1,B^44(R11)   !с режимами и типом
 
                                        !по умолчанию 
 
      DBG>EXAMINE/BYTE .                !Тип является байтовым
 
      TOY\%LINE 15: -48                 !целым 
 
      DBG>EXAMINE/WORD .                !Тип является целым
 
      TOY\%LINE 15 .                    !словом 
 
      DBG>EXAMINE/LONG .                !Тип является длинным
 
      TOY\%LINE 15: 749404624           !целым 
 
      DBG>E/QUAD .                      !Тип является целым
 
      TOY\%LINE 15: +0130653502894178768 !квадрословом 
 
      DBG>E/OCTAWORD .                  !Тип является целым
 
      TOY\%LINE 15: -11275244643179280247008686078241046481
 
                                        !октасловом 
 
      DBG>E/FLOAT .                     !Тип является числом с
 
      TOY\%LINE 15: 1.9117807е-38       !плавающей запятой форма-
 
                                        !та F
 
      DBG>E/D_FLOAT .                   !То же формата D 
 
      TOY\%LINE 15: 1.9117807293306393E-38
 
      DBG>E/G_FLOAT.
 
      TOY\%LINE 15: 1.509506018605227E-300
 
      DBG>E/H_FLOAT                     !То же формата H 
 
      TOY\%LINE 15: 2.351187242166315296772081991217048E-4793


                                - 167 -
 
                          00152-01 34 07-1
 
 
      DBG>EXAMINE/INSTRUCTION           !Тип является
 
      TOY\%LINE 15: MOVL  #1,B^44(R11)  !инструкцией 
 
      DBG>EXAMINE/аSCII .               !Тип является цепочкой
 
      TOY\%LINE 15:   ".."              !кодов КОИ-8 
 
      DBG>EXAMINE/OCTAL .               !Восьмеричный режим
 
      TOY\%LINE 15: 05452600720         !основания. Типом по
 
                                        !умолчанию является
 
                                        !длинное слово 
 
      DBG>EXAMINE/DECIMAL .          !Десятичный режим основания 
 
      TOY\%LINE 15: 749404624        !Тип по умолчанию - длинное
 
                                     !слово 
 
      DBG>EXAMINE/BYTE/HEX .         !Байтовый тип 
 
      TOY\%LINE 15: 0D0              !Шестнадцатеричный режим
 
                                     !основания 
 
      DBG>EXAMINE/BYTE/OCT .         !Байтовый тип 
 
      TOY\%LINE 15: 320              !Восьмеричный режим
 
                                     !основания 
 
      DBG>EXAMINE/INSTRUCTION/BYTE . !Когда указываются
 
      TOY\%LINE 15: -48              !два типа, послед-
 
                                     !ний тип отменяет
 
                                     !первый 
 
 
 
           6.2.2. Просмотр команд программы
 
 
           Команда EXAMINE/INSTRUCTION заставляет отладчик  восп-
 
      роизводить содержимое указанной ячейки как команду  ассемб-
 
      лера.
 
           Следует  отметить,  что  "EXAMINE  .PC"  воспроизведет
 
      команду программы, которая должна выполниться. В этом  слу-
 
      чае квалификатор /INSTRUCTION не требуется, т. к.  отладчик
 


                                - 168 -
 
                          00152-01 34 07-1
 
 
      понимает ".PC" как тип "команда".
 
           Следует так же отметить, что последовательные  команды
 
      EXAMINE  воспроизведут  последующие  команды  программы,  а
 
      EXAMINE^ - предыдущие. Это достигается возвратом к точке, о
 
      которой у отладчика  имеются  сведения,  такие  как  начало
 
      строки, и последующим декодированием от этой точки.
 
           Эти средства могут пригодиться  совместно  с  командой
 
      SET STEP INSTRUCTION.
 
 
 
           6.2.3. Просмотр списков
 
 
           Пользователь может просматривать любое число программ-
 
      ных ячеек с помощью одной команды EXAMINE путем  разделения
 
      параметров в цепочке команды запятыми.  Программные  ячейки
 
      могут приводиться в произвольном порядке. Используемый  при
 
      этом формат:
 
      EXAMINE адресное_выражение, адресное_выражение, ...
 
           Пример показывает, как  можно  просмотреть  список  из
 
      трех переменных с помощью одной команды EXAMINE:
 
      DBG>EXAMINE I,K,R
 
      TOY\I: 0
 
      TOY\K: 0
 
      TOY\R: 0.0000000E+00
 
 
 
           6.2.4. Просмотр диапазонов
 
 
           На  некоторых  языках  программирования   пользователь
 
      может просматривать диапазон  последовательных  программных
 
      ячеек с помощью команды EXAMINE  путем  указания  первой  и
 
      последней программной  ячейки  соответствующего  диапазона.
 
      Формат такой команды:


                                - 169 -
 
                          00152-01 34 07-1
 
 
      EXAMINE адресное_выражение1 : адресное_выражение2
 
           адресное_выражение1 должно иметь  меньший  адрес  вир-
 
      туальной памяти, чем адресное_выражение2: в противном  слу-
 
      чае отладчик выдает сообщение об ошибке.
 
           В результате  данной  команды  отладчик  воспроизводит
 
      об'ект, определяемый адресным_выражением1,  логически  сле-
 
      дующий за  ним  об'ект  и  т.д.  Последним  воспроизводится
 
      об'ект, определяемый адресным_выражением2.
 
           Отладчик связывает тип с адресным_выражением1 в  соот-
 
      ветствии с существующими правилами (см. п. 5.1.1).
 
           Следует отметить, что можно использовать одну  команду
 
      EXAMINE для просмотра более чем одного диапазона  программ-
 
      ных ячеек (другими словами, для просмотра  списка  диапазо-
 
      нов) путем  разделения  этих  диапазонов  запятыми.  Формат
 
      определения списка диапазонов:
 
      EXAMINE адресное_выражение1 : адресное_выражение2,-
 
              адресное_выражение3 : адресное_выражение4,...
 
           Следует отметить, что дефис (-), который является сим-
 
      волом продолжения строки, используется для обеспечения воз-
 
      можности продолжения ввода командной цепочки на новой (сле-
 
      дующей) строке.
 
           Пример демонстрирует просмотр  диапазонов  программных
 
      ячеек:
 
      DBG>EXAMINE R:I
 
      %DEBUG-W-EXARANGE, INVALID RANGE OF ADDRESSES
 
                                  !R имеет больший адрес
 
                                  !по сравнению с адресом I
 
      DBG>EXAMINE I:R             !По умолчанию исполь-
 
      TOY\I: 555                  !зуются символический
 
      TOY\J: 0                    !и десятичный режи-


                                - 170 -
 
                          00152-01 34 07-1
 
 
      TOY\R: 0.0000000E+00        !мы. Логическим по-
 
                                  !следователем I явля-
 
                                  !ется J. Логическим
 
                                  !последователем J яв-
 
                                  !ляется R. I и J име-
 
                                  !ют тип длинного сло-
 
                                  !ва. R имеет тип с
 
                                  !плавающей запятой.
 
      DBG>EXAMINE/BYTE I:R        !Байт является типом,
 
      TOY\I:  43                  !который отменяет
 
      TOY\I+1: 2                  !(заменяет) другие
 
      TOY\I+2: 0                  !типы. Диапазон ячеек
 
      TOY\I+3: 0                  !воспроизводится в
 
      TOY\J:   0                  !форме последователь-
 
      TOY\J+1: 0                  !ности байтов.
 
      TOY\J+2: 0
 
      TOY\J+3: 0
 
      TOY\R:   0
 
      DBG>EXAMINE/BYTE/NOSYMBOL I:R  !Несимволический режим
 
      708: 43                        !приводит к тому, что
 
      709: 2                         !ячейка каждого байта
 
      710: 0                         !воспроизводится в фор-
 
      711: 0                         !ме виртуального адре-
 
      712: 0                         !са, а не как символи-
 
      713: 0                         !лическое имя.
 
      714: 0
 
      715: 0
 
      716: 0
 
                                      

                                - 171 -
 
                          00152-01 34 07-1
 
 
           6.2.5. Просмотр последовательных об'ектов
 
 
           Можно просматривать значения последовательных об'ектов
 
      с помощью клавиши "возврат каретки" или  постоянного  имени
 
      %NEXTLOC. Отладчик использует  тип  и  режим,  связанные  с
 
      текущим об'ектом, для интерпретации  логически  последующих
 
      об'ектов (логических преемников).
 
           Пример демонстрирует просмотр последовательных  об'ек-
 
      тов:
 
      DBG>EXAMINE I                 !Типом по умолчанию является
 
      TOY\I: 555                    !длинное слово.
 
      DBG>EXAMINE <ВК>              !Воспроизведение логического
 
      TOY\J: 0                      !преемника I.
 
      DBG>EXAMINE %NEXTLOC          !Воспроизведение следующего
 
      TOY\R: 0.0000000E+00          !логического преемника J.
 
      TOY>EXAMINE <ВК>              !Воспроизведение следующего
 
      TOY\K: 0                      !логического преемника R.
 
      DBG>EXAMINE VECTOR(1)         !Воспроизведение значения
 
      TOY\VECTOR(1): 0.0000000E+00  !VECTOR(1).
 
      DBG>E <ВК>                    !Воспроизведение логического
 
      TOY\VECTOR(2): 0.0000000E+00  !преемника.
 
 
 
           6.2.6. Просмотр значений регистров
 
 
           ЭВМ СМ 1700 имеет  16  основных  регистров,  часть  из
 
      которых используются для временного хранения адресов и дан-
 
      ных. Указывая интересующий регистр в команде EXAMINE, можно
 
      просматривать его содержимое. Можно также заносить значения
 
      в любой регистр, указывая этот регистр как адресное выраже-
 
      ние в команде DEPOSIT (п. 6.3.5).
 


                                - 172 -
 
                          00152-01 34 07-1
 
 
           Следующие  символические  имена   обозначают   регистр
 
      СМ 1700:
 
           %R1,%R2,...,%R11 - обозначают соответствующие основные
 
      регистры: первый, второй,..., одиннадцатый;
 
           %PC - счетчик команд;
 
           %SP - указатель стека;
 
           %AP - указатель аргумента;
 
           %FP - указатель кадра.
 
           Все перечисленные имена являются  постоянными  именами
 
      отладчика.
 
           Знак процента перед именем  регистра  можно  опускать.
 
      Однако в этом случае отладчик  может  их  воспринимать  как
 
      программные переменные, а не как постоянные имена  отладчи-
 
      ка. Отладчик воспринимает такие имена как  свои  постоянные
 
      только в том случае, когда программа пользователя не содер-
 
      жит переменных с этим же именем.
 
           Пример демонстрирует просмотр регистров СМ 1700:
 
      DBG>SHOW MODE                         !Воспроизведение
 
      MODES: NOSYMBOLIC, NOSCREEN, NOKEYPAD !текущих режимов
 
      INPUT RADIX: DECIMAL                  !по умолчанию
 
      OUTPUT RADIX: DECIMAL
 
      DBG>SHOW TYPE                         !Воспроизведение
 
      TYPE: LONG INTEGER                    !текущего типа
 
      DBG>EXAMINE SP                        !Просмотр значения
 
      SP: 2147278720                        !указателя стека
 
      DBG>DEPOSIT .SP= 33                   !Занесение значения
 
      DBG>EXAMINE .                         !33 в .SP и проверка
 
      2147278720 : 33
 
      DBG>EXAMINE R11                       !Просмотр содержимого
 
      R11: 1024                             !R11


                                - 173 -
 
                          00152-01 34 07-1
 
 
      DBG>DEPOSIT R11= 444                  !Занесение нового
 
                                            !значения в R11
 
      DBG>EXAMINE R11                       !Проверка значения
 
      R11: 444                              !R11
 
 
 
           6.2.7. Длинное слово состояния процессора
 
 
           Длинное слово состояния процессора (PSL)  представляет
 
      собой 32-битовый регистр СМ 1700, содержимое которого вклю-
 
      чает несколько переменных состояния процессора.  Первые  16
 
      битов этого регистра (которые  отдельно  называются  словом
 
      состояния  процессора,  PSW)  содержат  непривилегированную
 
      информацию относительно текущего состояния процессора: зна-
 
      чения этих битов могут находиться под управлением программы
 
      пользователя. Последние 16 битов длинного  слова  состояния
 
      процессора (биты 16-31) содержат привилегированную информа-
 
      цию, которая не должна изменяться  программой  пользователя
 
      (т.е. программа пользователя не должна изменять  соответст-
 
      вующие биты).
 
           Для просмотра  содержимого  длинного  слова  состояния
 
      процессора следует использовать команду EXAMINE PSL.
 
           Отладчик воспроизводит 32 бита длинного слова  состоя-
 
      ния процессора в следующем формате:
 
      PSL: CMP TP FPD IS CURMOD PRVMOD IPL DV FU IV T N Z V C
 
            N  N   N  N   MODE   MODE  LV  N  N  N  N N N N N
 
           В этой форме обозначение "N" может быть нулем или еди-
 
      ницей, MODE (режим) может быть либо KERN (режим ядра), либо
 
      EXEC (исполнительный), либо SUPR (режим супервизора),  либо
 
      USER (режим  пользователя),  а  обозначение  "LV"  (уровень
 
      приоритета прерывания) может быть шестнадцатеричным  числом
 


                                - 174 -
 
                          00152-01 34 07-1
 
 
      от 0 до 1F.
 
           В таком же формате (формате PSL)  можно  воспроизвести
 
      любую ячейку, используя EXAMINE/PSL. Это полезно для  прос-
 
      мотра сохраненных в стеке значений PSL.
 
           Пример показывает, как просмотреть и изменить значение
 
      PSL:
 
      DBG>SHOW MODE
 
      MODES: NOSYMBOLIC, NOSCREEN, NOKEYPAD
 
      INPUT RADIX: DECIMAL
 
      OUTPUT RADIX: DECIMAL
 
      DBG>SHOW TYPE
 
      TYPE: LONG INTEGER
 
      DBG>DEPOSIT/WORD PSL=0            !Очистка PSL
 
      DBG>EXAMINE PSL
 
      PSL: CMP TP FPD IS CURMOD PRVMOD IPL DV FU IV T N Z V C
 
            0  0   0  0   USER   USER   0  0  0  0  0 0 0 0 0
 
 
 
           6.3. Команда DEPOSIT
 
 
           Команда DEPOSIT предназначена для занесения значений в
 
      ячейки программы. В формате этой команды "выражение"  опре-
 
      деляет  значение,   которое   должно   быть   занесено,   а
 
      "адресное_выражение" указывает программную ячейку, в  кото-
 
      рую должно быть занесено это значение:
 
      DEPOSIT [/квалификатор] адресное_выражение =-
 
              выражение [,выражение...]
 
           значение выражения вычисляется в соответствии  с  син-
 
      таксисом исходного языка и в режиме основания по  умолчанию
 
      для включения значения. Значение адресного выражения вычис-
 
      ляется для обеспечения программной  ячейки  соответствующим
 


                                - 175 -
 
                          00152-01 34 07-1
 
 
      типом.
 
           Когда отладчик выполняет команду DEPOSIT, он  приводит
 
      значение, определяемое выражением,  к  типу,  связанному  с
 
      адресным выражением, и заносит это значение в ячейку, опре-
 
      деляемую адресным выражением.
 
           Пользователь может определить  командный  квалификатор
 
      типа в команде DEPOSIT для связи типа с  программной  ячей-
 
      кой, указываемой адресным выражением.
 
 
 
           6.3.1. Занесение числовых данных
 
 
           Пример демонстрирует занесение трех  целых  величин  в
 
      три ячейки памяти. Он показывает так же,  как  использовать
 
      квалификаторы байта, слова  и  длинного  слова  с  командой
 
      DEPOSIT:
 
      DBG>SHOW MODE                !Воспроизведение текущих ре-
 
      MODES:NOSYMBOLIC,NOSCREEN,NOKEYPAD !жимов по умолчанию.
 
      INPUT RADIX: DECIMAL
 
      OUTPUT RADIX: DECIMAL
 
      DBG>DEPOSIT J = 333          !Занести данные в
 
      DBG>DGPOSIT R = 444          !J, R, K.
 
      DBG>DGPOSIT K = 555
 
      DBG>EXAMINE .          !Текущим об'ектом является ячейка,
 
      TOY\K: 555             !в которую было выполнено последнее
 
                             !занесение.
 
      DBG>EXAMINE J          !Величина 333 занесена в ячейку J.
 
      TOY\J: 333
 
      DBG>EXAMINE <ВК >      !Величина 444 занесена в логический
 
      TOY\R: 444.0000        !преемник J, которым является
 
                             !ячейка R. Тип, связанный с R, ис-
 


                                - 176 -
 
                          00152-01 34 07-1
 
 
                             !пользуется при воспроизведении
 
                             !(но не тип по умолчанию).
 
      DBG>EXAMINE <ВК>       !Величина 555 занесена в логический
 
      TOY\K: 555             !преемник R, которым является
 
                             !ячейка K.
 
      DBG>SHOW TYPE          !Воспроизведение типа по умолчанию
 
      TYPE: LONG INTEGER     !(длинное целое).
 
      DBG>EVALU/ADDR .       !Текущая ячейка - 724.
 
      724
 
      DBG>DEPOSIT/BYTE . = 1 !Занесение значения 1 в байт
 
                             !памяти, который имеет адрес
 
                             !724.
 
      DBG>E .                !Так как типом по умолчанию
 
      724: 1280461057        !является длинное целое,
 
                             !просматривается четыре байта.
 
      DBG>е/BYTE .           !Просмотр только одного байта.
 
      724: 1
 
      DBG>DEPOSIT/WORD . = 2 !Занесение значения 2 в первые
 
                             !два байта (т.е. в слово) те-
 
                             !кущего об'екта.
 
      DBG>E/WORD .           !Просмотр слова текущего
 
      724: 2                 !об'екта.
 
      DBG>DEPOSIT/LONG 724 = 9999  !Занесение значения 9999
 
                             !в 4 байта (длинное сло-
 
                             !во), начиная с виртуаль-
 
                             !ного адреса 724.
 
      DBG>E/LONG 724         !Просмотр четырех байтов
 
      724: 9999              !(длинное слово), начиная с
 
                             !виртуального адреса 724.
 


                                - 177 -
 
                          00152-01 34 07-1
 
 
           6.3.2. Занесение строк кода КОИ-8
 
 
           Пользователь может заносить строку кода КОИ-8 в ячейку
 
      программы только в том  случае,  если  эта  ячейка  указана
 
      адресным выражением с соответствующим типом (КОИ-8).
 
           Разделителями строки могут быть  либо  апострофы  ('),
 
      либо кавычки ("), однако используемый разделитель не должен
 
      приводиться внутри самой строки.
 
           Во всех случаях, когда длина заносимой  строки  превы-
 
      шает длину программной  ячейки,  в  которую  заносится  эта
 
      строка, отладчик усекает эту строку до длины  соответствую-
 
      щей программной ячейки. С другой стороны, если длина строки
 
      меньше, чем длина программной ячейки, то отладчик дополняет
 
      пробелами кода КОИ-8 оставшиеся байты памяти с правой  сто-
 
      роны от последнего символа.
 
           В данном пункте описывается занесение строк кода КОИ-8
 
      в программные ячейки, определяемые  адресными  выражениями,
 
      обладающими следующими свойствами:
 
           - адресное выражение имеет тип КОИ-8;
 
           - адресное выражение имеет другой тип;
 
           - адресное выражение не имеет типа.
 
 
 
           6.3.2.1. Занесение с  помощью  адресного  выражения  с
 
      типом кода КОИ-8
 
 
           Для занесения строки кода КОИ-8 в программную  ячейку,
 
      определяемую адресным выражением  с  типом  КОИ-8,  следует
 
      выдать команду DEPOSIT в следующем формате:
 
      DEPOSIT адресное_выражение = "строка_кодов_КОИ-8"  .
 


                                - 178 -
 
                          00152-01 34 07-1
 
 
           6.3.2.2. Занесение с  помощью  адресного  выражения  с
 
      типом, отличным от кода КОИ-8
 
 
           Если программная ячейка определяется адресным  выраже-
 
      нием, тип которого не является типом КОИ-8, то пользователь
 
      может  отменить  этот  тип  путем  применения  команды  SET
 
      TYPE/OVERRIDE ASCII:N. Это особенно удобно при  использова-
 
      нии нескольких команд DEPOSIT.
 
           С командой DEPOSIT можно использовать также квалифика-
 
      тор /ASCII:N для отмены  соответствующего  типа  только  на
 
      время действия этой команды. Это удобно  при  использовании
 
      одной команды DEPOSIT.
 
           Следующий формат команды DEPOSIT демонстрирует исполь-
 
      зование квалификотора /ASCII:N:
 
      DEPOSIT/ASCII:N адресное_выражение = "строка_кодов_КОИ-8_-
 
      длиной N"
 
           Следует отметить, что величина N, используемая в  этом
 
      квалификаторе, обычно должна соответствовать числу  заноси-
 
      мых символов  кода  КОИ-8,  т.е.  определять  длину  строки
 
      КОИ-8.
 
 
 
           6.3.2.3. Занесение в адресное выражение без типа
 
 
           Если ячейка программы  определяется  адресным  выраже-
 
      нием, которое не имеет связанного с ним типа, то  пользова-
 
      тель может связать тип КОИ-8  с  этим  адресным  выражением
 
      командой SET TYPE ASCII:N. После этого  можно  использовать
 
      формат команды DEPOSIT для адресного выражения  типа  КОИ-8
 
      (подпункт 6.3.2.1).
 
           Можно также использовать квалификатор команды /ASCII:N
 
      с командой DEPOSIT для связи типа КОИ-8 с адресным  выраже-


                                - 179 -
 
                          00152-01 34 07-1
 
 
      нием, определяющим программную  ячейку,  в  которую  должна
 
      быть занесена строка.
 
           Следует отметить,  что  пользователь  может  применить
 
      также команду SET  TYPE/OVERRIDE  КОИ-8:N  для  связи  типа
 
      КОИ-8 с адресным выражением без типа.
 
           Пример демонстрирует, как заносить строки кода КОИ-8:
 
      DBG>DEPOSIT I = "GOOD"
 
      %DEBUG-W-INVNUMBER, INVALID NUMERIC STRING 'GOOD'
 
                        (Неправильная цифровая строка
 
                        'GOOD')
 
                            !Отладчик предполагает нали-
 
                            !чие числовых данных, так как I
 
                            !имеет связанный числовой тип.
 
                            !Пользователь должен отменить
 
                            !этот тип.
 
      DBG>DEPOSIT/КОИ-8 I = "GOOD"  !Использование типа КОИ-8 для
 
                                    !отмены другого типа. От-
 
                                    !ладчик заносит строку.
 
      DBG>EXAMINE .                 !Воспроизведение с типом по
 
      TOY\I: 1146048327             !умолчанию.
 
      DBG>EXAMINE/КОИ-8 .           !Определение воспроизведения
 
      TOY\I: "GOOD"                 !в типе КОИ-8.
 
      DBG>SET TYPE/OVERRIDE КОИ-8   !Определение типа КОИ-8 для
 
                                    !отмены другого типа.
 
      DBG>DEPOSIT I =  "GOOD"
 
      DBG>EXAMINE I             !Воспроизведение в типе КОИ-8 с
 
      TOY\I: "GOOD"             !отменой другого типа.
 
      DBG>CANCEL TYPE/OVERRIDE  !Отмена типа КОИ-8, который
 
                                !ранее отвергал другой тип.
 
      DBG>EXAMINE I             !Генерируемый компилятором


                                - 180 -
 
                          00152-01 34 07-1
 
 
      TOY/I: 1146048327         !тип отменяет устанавливае-
 
                                !мый по умолчанию тип КОИ-8.
 
 
 
           6.3.3. Занесение и замена команд СМ 1700
 
 
           Для занесения команд может быть использован  следующий
 
      формат команды DEPOSIT:
 
      DEPOSIT/INSTRUCTION адресное_выражение = "команда_СM_1700"
 
           Команда должна быть заключена либо  в  апострофы  ('),
 
      либо в кавычки ("). Каждый  такой  разделитель  может  быть
 
      использован в том случае, если он  не  приводится  в  самой
 
      командной строке. Начальный и конечный  разделители  должны
 
      быть одинаковыми.
 
           Пользователь должен сообщить отладчику, что выделенная
 
      строка должна интерпретироваться в качестве команды,  а  не
 
      как строка кода КОИ-8.  Это  обеспечивается  либо  командой
 
      DEPOSIT/INSTRUCTION,   либо   выдачей   SET   TYPE/OVERRIDE
 
      INSTRUCTION, после которой следует любое необходимое  число
 
      команд DEPOSIT.
 
           Занесение команд  системы  является  простой  задачей,
 
      если они заносятся в последовательные  ячейки  памяти,  так
 
      как в этом  случае  можно  использовать  символическое  имя
 
      логического преемника для определения адреса занесения сле-
 
      дующей команды. Это демонстрируется на примере 1:
 
      DBG>SET TYPE INSTRUCTION         !Установка типа по умол-
 
                                       !чанию на команду.
 
      DBG>DEPOSIT 730 = "MOVB #77, R1" !Занесение инструкции, на-
 
                                       !чиная с виртуального ад-
 
                                       !реса 730.
 
      DBG>EXAMINE .                    !Просмотр текущего об'ек-
 


                                - 181 -
 
                          00152-01 34 07-1
 
 
      730: MOVB #77,R1                 !та.
 
      DBG>EXAMINE <ВК>                 !Текущий об'ект становится
 
      734: HALT                        !логическим преемником по
 
                                       !отношению к виртуальному
 
                                       !адресу 730.
 
      DBG>DEPOSIT . ="MOVB #66,R2"     !Занесение следующей инст-
 
                                       !рукции.
 
      DBG>EXAMINE .                    !Просмотр текущего об'екта
 
      734: MOVB #66,R2
 
      DBG>EXAMINE <ВК>                 !Текущий об'ект становится
 
      738: HALT                        !логическим преемником по
 
                                       !отношению к виртуальному
 
                                       !адресу 734.
 
      DBG>DEPOSIT . = "MOVB #55, R3"   !Занесение следующей инст-
 
                                       !рукции.
 
      DBG>EXAMINE .                    !Просмотр текущего об'екта
 
      738: MOVB #55,R3
 
           Замена одной или  нескольких  команд  новыми  включает
 
      отслеживание длины этих команд, которая может изменяться  в
 
      зависимости от типа команды и числа операндов.
 
           При замене команд пользователь должен быть уверен, что
 
      новая команда имеет ту же длину в байтах, что и старая.
 
           Если новая команда длиннее старой, то  при  ее  записи
 
      будет испорчена следующая за ней команда.
 
           Если новая команда короче старой, то ее можно  занести
 
      без перезаписи предыдущих и последующих  команд.  Однако  в
 
      этом случае необходимо в байты  памяти  (слева),  свободные
 
      после замены, занести команды NOP ("холостая" операция).
 
           Отладчик не предупреждает пользователя  ни  в  случае,
 
      когда заносимая команда портит следующую за ней, ни в  слу-


                                - 182 -
 
                          00152-01 34 07-1
 
 
      чае, когда необходимо дополнить командами NOP. Поэтому тре-
 
      буется тщательное вычисление длины заменяемой команды.
 
           Пример 2 показывает замену команд равной длины:
 
      DBG>SET STEP INSTRUCTION            !Установка шага по
 
                                          !командам.
 
      DBG>STEP                            !Выполнение шага.
 
      STEPPED TO 1584: PUSHAL (R11)
 
      DBG>STEP                            !Выполнение следующего
 
      STEPPED TO 1586: CALLS #1,L^2224    !шага.
 
      DBG>EXAMINE .PC                     !Заменим эту команду.
 
      1586: CALLS #1,L^2224
 
      DBG>EXAMINE <ВК>
 
      1593: CALLS #0,L^2216               !Следующая команда
 
                                          !начинается с 1593
 
      DBG>DEPOSIT/INSTRUCTION 1586="#2,L^2224" !Заносим новую
 
                                               !команду.
 
      DBG>EXAMINE  .                      !Проверка.
 
      1586: CALLS #2,L^2224               !Новая команда занесена
 
      DBG>EXAMINE <ВК>
 
      1593: CALLS #0,L^2216               !Последующая команда
 
                                          !осталась без изменений
 
 
 
           6.3.4. Занесение величин с различными основаниями
 
 
           Литералы в выражениях на  исходном  языке  интерпрети-
 
      руются отладчиком в режиме текущего основания или с основа-
 
      нием, определяемым  операторами  режима  основания.  Пример
 
      демонстрирует занесение литералов с двоичным, восьмеричным,
 
      десятичным и шестнадцатеричным основанием:
 


                                - 183 -
 
                          00152-01 34 07-1
 
 
      DBG>SHOW MODE                 !Воспроизведение режимов по
 
      MODES: NOSYMBOLIC, NOSCREEN, NOKEYPAD     !умолчанию
 
      INPUT RADIX: DECIMAL
 
      OUTPUT RADIX: DECIMAL
 
      DBG>SHOW TYPE                 !Воспроизведение типа по
 
      TYPE: LONG INTEGER            !умолчанию (длинные целые).
 
      DBG>EXAMINE J                 !Воспроизведение J с режимами
 
      TOY\J: 234567890              !и типом по умолчанию
 
      DBG>DEPOSIT J = %OCT 7777777  !Занесение восьмеричного
 
                                    !значения.
 
      DBG>EXAMINE .                 !Воспроизведение со сгенери-
 
      TOY\J: 2097151                !рованным компилятором ти-
 
                                    !пом и основанием по умолча-
 
                                    !нию (десятичное).
 
      DBG>EXAMINE/OCTAL  .          !Воспроизведение со сгенери-
 
      OY\J: 00007777777             !рованным компилятором ти-
 
                                    !пом и восьмеричным основа-
 
                                    !нием.
 
      DBG>DEPOSIT J = %HEX 7777777  !Занесение шестнадцатеричной
 
                                    !величины.
 
      DBG>EXAMINE .                 !Воспроизведение с типом,
 
      TOY\J: 125269879              !связанным с J, и с основани-
 
                                    !ем по умолчанию (десятичное)
 
      DBG>EXAMINE/HEX  .            !Воспроизведение в шестнадца-
 
      TOY\J: 07777777               !теричной форме.
 


                                - 184 -
 
                          00152-01 34 07-1
 
 
           6.3.5. Занесение значений в регистры
 
 
           Правила  для  связи  с  регистрами  командой   DEPOSIT
 
      являются теми же, что и для команды EXAMINE (п. 6.2.6).
 
           Пример демонстрирует,  как  просматривать  и  заносить
 
      значения в регистры:
 
      DBG>SHOW MODE                       !Воспроизведение теку-
 
      MODES: NOSYMBOLIC,NOSCREEN,NOKEYPAD !щих режимов по умолча-
 
      INPUT RADIX: DECIMAL                !чанию.
 
      OUTPUT RADIX: DECIMAL
 
      DBG>SHOW TYPE                       !Воспроизведение теку-
 
      TYPE: LONG INTEGER                  !щего типа .
 
      DBG>EXAMINE SP                      !Просмотр значения ука-
 
      SP: 2147278720                      !зателя стека.
 
      DBG>DEPOSIT SP=33                   !Занесение значения 33
 
                                          !в регистр SP.
 
      DBG>EXAMINE  .                      !проверка.
 
      SP: 33
 
      DBG>EXAMINE R11                     !Просмотр регистра R11.
 
      R11: 1024
 
      DBG>DEPOSIT R11=444                 !Занесение нового зна-
 
                                          !чения.
 
      DBG>EXAMINE R11                     !Проверка.
 
      R11: 444
 


                                - 185 -
 
                          00152-01 34 07-1
 
 
           6.3.5.1. Занесение значений в длинное слово  состояния
 
      процессора
 
 
           Занесение значения в длинное слово состояния процессо-
 
      ра (PSL) имеет целью запрещение или разрешение определенных
 
      условий состояния процессора. В табл. 2  приведены  условия
 
      состояния процессора, которыми может манипулировать пользо-
 
      ватель.
 
                                                       Таблица 2
 
                     Значения для модификации PSL
 
      ----------------------------------------------------------
           !    !      !
      Номер!Ключ!Значе-!        Описание
           !    !      !
           !    !ние   !
           !    !      !
      ----------------------------------------------------------
           !    !      !
       15  ! нет!  0   !      должно быть нулем
           !    !      !
       14  ! "  !  0   !           то же
           !    !      !
       13  ! "  !  0   !             "
           !    !      !
       12  ! "  !  0   !             "
           !    !      !
       11  ! "  !  0   !             "
           !    !      !
       10  ! "  !  0   !             "
           !    !      !
        9  ! "  !  0   !             "
           !    !      !
        8  ! "  !  0   !             "
           !    !      !
        7  ! DV ! 80   ! разрешение обработки прерывания при
           !    !      !
           !    !      ! возникновении переполнения
           !    !      !
           !    !      ! десятичного числа
           !    !      !
        6  ! FU ! 40   ! разрешение обработки прерывания при
           !    !      !
           !    !      ! потере значимости в числе
           !    !      !
           !    !      ! с плавающей запятой
           !    !      !
        5  ! IV ! 20   ! разрешение обработки прерывания
           !    !      !
           !    !      ! при переполнении целого
           !    !      !


                                - 186 -
 
                          00152-01 34 07-1
 
 
                                             Продолжение табл. 2
      ----------------------------------------------------------
           !    !      !
      Номер!Ключ!Значе-!        Описание
           !    !      !
           !    !ние   !
           !    !      !
      ----------------------------------------------------------
        4  !  T ! 10   ! код условия обработки прерывания
           !    !      !
           !    !      ! при отслеживании
           !    !      !
        3  !  N !  8   ! код условия по отрицательному значению
           !    !      !
        2  !  Z !  4   ! код нулевого условия
           !    !      !
        1  !  V !  2   ! код условия переполнения
           !    !      !
        0  !  C !  1   ! код условия переноса
 
           Для занесения значения в PSL нужно определить изменяе-
 
      мые биты, сложить соответствующие им значения (см. табл. 2)
 
      и полученную сумму  указать  как  "выражение"  в  следующей
 
      команде :
 
      DBG>DEPOSIT/WORD PSL = %HEX (выражение)
 
           Примечание. Если значение заносится  в  старшее  слово
 
      PSL (биты с 16 по 31), то при передаче управления программе
 
      пользователя командой STEP или GO генерируется ошибка.
 
           Пример демонстрирует,  как  просматривать  и  изменять
 
      PSL:
 
      DBG>SHOW MODE                       !Воспроизведение теку-
 
      MODES: NOSYMBOLIC,NOSCREEN,NOKEYPAD !щих режимов по умолча-
 
      INPUT RADIX: DECIMAL                !нию.
 
      OUTPUT RADIX: DECIMAL
 
      DBG>SHOW TYPE                       !Воспроизведение теку-
 
      TYPE: LONG INTEGER                  !щего типа.
 
      DBG>DEPOSIT/WORD PSL= 0             !Запрещение всех усло-
 
                                          !вий в PSL. Другими
 
                                          !словами, очистить биты
 
                                          !с 0 по 15.


                                - 187 -
 
                          00152-01 34 07-1
 
 
      DBG>EXAMINE PSL
 
      PSL: CMP TP FPD IS CURMOD PRVMOD IPL DV FU IV T N Z V C
 
            0  0   0  0   USER   USER   0  0  0  1  0 0 0 0 0
 
                                          !Воспроизведение фор-
 
                                          !матированного PSL.
 
                                          !Все биты сброшены.
 
      DBG>DEPOSIT/WORD PSL=%HEX 80
 
      DBG>EXAMINE PSL                     !Проверка занесенного
 
                                          !значения.
 
      PSL: CMP TP FPD IS CURMOD PRVMOD IPL DV FU IV T N Z V C
 
            0  0   0  0   USER   USER   0  1  0  1  0 0 0 0 0
 
 
 
           6.4. Команда EVALUATE
 
 
           Отладчик интерпретирует операнд команды  EVALUATE  как
 
      выражение на исходном языке, вычисляет его в соответствии с
 
      семантикой исходного языка и полученное значение  воспроиз-
 
      водит в форме литерала исходного языка.
 
           Формат данной команды:
 
      EVALUATE [/квалификатор] выражение [,выражение...]
 
           Детальную информацию об операторах,  поддерживаемых  в
 
      языковых выражениях, для различных языков  программирования
 
      можно получить, набрав на клавиатуре дисплея "HELP языки".
 
           Когда пользователь  указывает  командный  квалификатор
 
      режима основания, отладчик воспроизводит целые  литералы  в
 
      выражении (или в выражениях) в соответствии с текущим осно-
 
      ванием; однако отладчик  воспроизводит  значение  выражения
 
      (или выражений) с основанием, установленным  квалификатором
 
      команды.
 
           При указании оператора основания числовые  литералы  в
 


                                - 188 -
 
                          00152-01 34 07-1
 
 
      выражении (или выражениях) воспринимаются в соответствующей
 
      системе счисления; однако  значение  выражения  (выражений)
 
      воспроизводится с текущим основанием системы счисления.
 
           Если выражение содержит символические имена с  разными
 
      (генерируемыми компилятором) типами, то для вычисления зна-
 
      чения такого выражения отладчик использует правила преобра-
 
      зования типов соответствующего языка.
 
           Можно вычислять  значение  более  одного  выражения  в
 
      одной команде EVALUATE, разделяя выражения запятыми.
 
           Используя команду EVALUATE, можно выполнять  арифмети-
 
      ческие вычисления, которые могут быть и не связаны с  прог-
 
      раммой пользователя. Можно также  выполнять  преобразование
 
      оснований с помощью командных квалификаторов режима основа-
 
      ния или операторов основания.
 
           Пример демонстрирует  использование  команды  EVALUATE
 
      (при этом языком программирования является ФОРТРАН):
 
      DBG>DEPOSIT R = 5.35E3       !R имеет тип с плавающей
 
                                   !запятой.
 
      DBG>EVALUATE R               !Вычисление значения R.
 
         5350.000
 
      DBG>EXAMINE R                !Команда EXAMINE в данном слу-
 
      TOY\R: 5350.000              !чае аналогична предыдущей
 
                                   !команде. Следует отметить,
 
                                   !что воспроизводится символи-
 
                                   !ческий адрес R.
 
      DBG>EVALUATE R*50            !Выполнение арифметических вы-
 
         267500.0                  !числений.
 
      DBG>EVALUATE (R*50)/(540-40) !Выполнение арифметических вы-
 
         535.0000                  !числений.
 
      DBG>DEPOSIT I = 22222        !Занесение значения в I.


                                - 189 -
 
                          00152-01 34 07-1
 
 
      DBG>EVALUATE I               !Следует отметить, что типом I
 
      22222                        !является целое число.
 
      DBG>EVALUATE R/I             !Выражение вычисляется в ре-
 
         0.2407524                 !жиме типа с плавающей запятой
 
      DBG>EVALUATE 2.5*35          !выполнение арифметических вы-
 
         87.50000                  !числений.
 
      DBG>EVALUATE/OCTAL 17/2      !Восьмеричный квалификатор
 
      00000000010                  !воздействует на вывод, а не
 
                                   !на ввод.
 
      DBG>EV %OCT 17/2             !Оператор восьмеричного осно-
 
      00000000007                  !вания воздействует на ввод, а
 
                                   !не на вывод.
 
      DBG>EVALUATE/HEX 17/2        !Шестнадцатеричный квалифика-
 
      00000008                     !тор воздействует на вывод, а
 
                                   !не на ввод.
 
      DBG>EV %HEX 17/2             !Оператор с шестнадцатеричным
 
      DBG>11                       !основанием воздействует на
 
                                   !ввод, а не на вывод.
 
      DBG>EVALUATE/HEX %HEX 17/2   !Ввод и вывод интерпретируются
 
      00000008                     !с шестнадцатеричным основани-
 
                                   !ем.
 


                                - 190 -
 
                          00152-01 34 07-1
 
 
                  7. Воспроизведение исходного кода
 
 
 
           В данном разделе описывается средство,  обеспечивающее
 
      возможность воспроизведения  операторов  программы  на  том
 
      языке, на котором написана соответствующая программа. Такие
 
      операторы программы называются в данном руководстве  исход-
 
      ным кодом.
 
           Отладчик идентифицирует строку исходного кода  (исход-
 
      ную строку) по номеру  строки,  присвоенному  компилятором.
 
      Компилятор присваивает номера строк каждой строке исходного
 
      кода в программе в последовательном порядке  от  первой  до
 
      последней строки. Номера строк приводятся в распечатке ком-
 
      пилятора, которая выдается компилятором, если во время ком-
 
      пилирования задан командный квалификатор /LIST.
 
           Воспроизведение исходных строк не зависит от  выполне-
 
      ния программы; это означает, что пользователь  может  восп-
 
      роизводить исходные строки из любой области своей программы
 
      без воздействия на значение счетчика команд (PC) или  длин-
 
      ного слова состояния процессора (PSL).
 
           Можно воспроизводить исходный код,  задавая  любую  из
 
      следующих форм входного параметра:
 
           - присвоенный компилятором номер строки;
 
           - адресное выражение,  которое  указывает  программную
 
      ячейку, имеющую соответствующий номер строки;
 
           - цепочку  исходного  кода,   которая   идентифицирует
 
      исходную строку тем, что находится в этой строке.
 
           Можно также воспроизводить исходные  строки  вместE  с
 
      другим воспроизведением информации отладчика,  например,  в
 
      результате выполнения команды STEP, приведения  в  действие
 
      точки приостанова или точки просмотра.


                                - 191 -
 
                          00152-01 34 07-1
 
 
           7.1. Размещение исходных файлов
 
 
           Исходным файлом является такой файл, в котором  содер-
 
      жатся операторы на языке программирования. Компилятор обра-
 
      батывает исходные файлы для  генерации  об'ектных  модулей.
 
      Если во время компиляции задан квалификатор /DEBUG, то ком-
 
      пилятор генерирует записи  корреляции  исходных  строк  для
 
      включения в таблицу символических имен отладки (DST).
 
           Записи корреляции исходных строк содержат полную  спе-
 
      цификацию файла (т. е. Имя устройства,  имя  каталога,  имя
 
      файла, тип файла и номер версии файла) для каждого исходно-
 
      го файла, который участвует в создании об'ектного модуля, а
 
      также указывают, какая исходная  запись  в  каком  исходном
 
      файле соответствует конкретному номеру строки  в  об'ектном
 
      модуле. Записи корреляции исходных строк передаются  компо-
 
      новщику и становятся доступными отладчику во время выполне-
 
      ния.
 
           Таким образом, в течение сеанса отладки для того, что-
 
      бы найти для любого об'ектного модуля исходный файл, содер-
 
      жащий строки, которые  требуется  воспроизвести,  отладчику
 
      достаточно обратиться к таблице DST.
 
           Однако, если после компилирования  исходный  файл  был
 
      перемещен в  другой  каталог,  полная  спецификация  такого
 
      исходного файла, приведенная в записи таблицы DST, не будет
 
      правильной, и отладчик не сможет  найти  исходный  файл  по
 
      записи в этой таблице. В таком случае пользователю  следует
 
      направить отладчик к текущему  месту  размещения  исходного
 
      файла с помощью команды SET SOURCE.
 
           Наличие длинных имен файлов в МОС ВП создает  проблему
 
      с командой "об'явить исходный файл" в записи  DST  исходной
 


                                - 192 -
 
                          00152-01 34 07-1
 
 
      корреляции. И запись DST, и  команда  внутри  записи  имеют
 
      поля размером в байт для хранения длины. Однако  специфика-
 
      ция файла может быть длиннее, чем  252  символа,  и  вместе
 
      с 20  байтами  остальной  информации  DST-записи  превышают
 
      информацию, которую можно поместить в поле длины. Для  того
 
      чтобы получить отображение исходного текста, нужно  ограни-
 
      чить спецификацию файла с исходным текстом до 231  символа.
 
      Можно обойти эту проблему, используя  команду  SET  SOURCE.
 
      Например, пользователь определил логическое имя х для раск-
 
      рытия длинной спецификации файла. Тогда исходный текст мож-
 
      но воспроизвести командой SET SOURCE X.
 
 
 
           7.1.1. Команды SET SOURCE, SHOW SOURCE и CANCEL SOURCE
 
 
           Eсли исходный файл был перемещен в другой каталог,  то
 
      следует выдать команду SET SOURCE в следующем формате:
 
      SET SOURCE[/MODULE=имя_модуля] имя_каталога-
 
      [,имя_каталога...]  .
 
           Если пользователь определяет дополнительный  командный
 
      квалификатор /MODULE=имя_модуля, то отладчик  просматривает
 
      указанный каталог (или каталоги) только тогда,  когда  ищет
 
      исходный файл (или файлы) для указанного модуля.
 
           Если пользователь  выдает  данную  команду  без  этого
 
      командного квалификатора, то отладчик просматривает указан-
 
      ный каталог (или каталоги) при поиске исходного файла  (или
 
      файлов) для  любого  модуля,  не  указанного  в  предыдущей
 
      команде SET SOURCE/MODULE=имя_модуля.
 
           Короче говоря,  команда  SET  SOURCE/MODULE  указывает
 
      отладчику, где искать исходные файлы для конкретного  моду-
 
      ля, а команда SET SOURCE - где искать  исходные  файлы  для
 


                                - 193 -
 
                          00152-01 34 07-1
 
 
      модулей, которые  явно  не  были  указаны  в  командах  SET
 
      SOURCE/MODULE.
 
           Параметр имя_каталога может состоять из  одного,  нес-
 
      кольких или всех полей в полной  спецификации  файла,  хотя
 
      обычно это только имя каталога. Ниже приводится формат пол-
 
      ной спецификации файла:
 
      узел::устройство:[каталог]имя_файла.тип_файла;но-
 
      мер_версии  .
 
           При определении любого из этих полей пользователь дол-
 
      жен включать и пунктуацию для соответствующего поля. Напри-
 
      мер, для определения перемещения исходных файлов в  каталог
 
      NEWDIR на диске NEWDISK следует выдать команду:
 
      DBG>SET SOURCE NEWDISK:[NEWDIR]  .
 
           Отладчик обрабатывает параметр имя_каталога путем вве-
 
      дения указанного поля (или полей) в спецификацию  исходного
 
      файла при ее появлении в таблице DST. Таким образом, отлад-
 
      чик создает  новую  спецификацию  файла,  которую  затем  и
 
      используют для нахождения соответствующего исходного файла.
 
           Когда исходный файл  перемещается  в  другой  каталог,
 
      номер версии этого исходного файла может измениться.  Таким
 
      образом, для нахождения правильной версии исходного файла в
 
      том случае, если номер  версии  не  определен  в  параметре
 
      имя_каталога, отладчик вводит символ обобщения (*)  в  поле
 
      номера версии новой спецификации файла. В результате  этого
 
      все версии перемещенного исходного файла ищутся до тех пор,
 
      пока не будет найденa нужная версия. Нужной версией  исход-
 
      ного файла является та версия, которая имеет такую же  дату
 
      и время пересмотра (выпуска), такой же размер файла,  такой
 
      же формат записей и  такую  же  организацию  файла,  как  у
 
      исходного файла во время компиляции.


                                - 194 -
 
                          00152-01 34 07-1
 
 
           В одной команде SET SOURCE можно определить  несколько
 
      параметров имя_каталога, разделив их запятыми. В таком слу-
 
      чае отладчик создает новую спецификацию файла  для  каждого
 
      указанного параметра имя_каталога и использует этот  список
 
      спецификаций файлов для нахождения исходных файлов  об'ект-
 
      ных модулей.  Так  как  параметр  имя_каталога  чаще  всего
 
      является просто именем, то при указании более одного такого
 
      параметра в данной команде пользователь устанавливает  спи-
 
      сок каталогов для поиска исходных файлов.
 
           Команда  SHOW  SOURCE   обеспечивает   воспроизведение
 
      действующего в данный момент списка (или списков) каталогов
 
      для поиска исходных файлов.
 
           Если список каталогов для поиска исходных  файлов  был
 
      организован для всех модулей, то команда SHOW SOURCE выдает
 
      имя каждого указанного каталога,  а  также  указывает,  что
 
      этот список относится ко всем модулям.
 
           Если список каталогов для поиска исходных  файлов  был
 
      организован для одного или нескольких модулей,  то  команда
 
      SHOW SOURCE воспроизводит имя  (имена)  каждого  указанного
 
      каталога, а также имя модуля (или имена модулей), к которо-
 
      му относится список каталогов для поиска исходных файлов.
 
           Если список каталогов для поиска исходных файлов орга-
 
      низован не был, то  команда  SHOW  SOURCE  показывает,  что
 
      такого списка в данное время нет.
 
           Команда CANCEL  SOURCE  отменяет  действие  предыдущих
 
      команд SET SOURCE. Формат команды:
 
      CANCEL SOURCE [/MODULE=имя_модуля]  .
 
           Данная   команда    без    командного    квалификатора
 
      /MODULE=имя_модуля отменяет действие предыдущей команды SET
 
      SOURCE, но не отменяет действия  любой  предыдущей  команды


                                - 195 -
 
                          00152-01 34 07-1
 
 
      SET SOURCE/MODULE=имя_модуля.
 
           Команда   CANCEL   SOURCE/MODULE=имя_модуля   отменяет
 
      действие предыдущей команды SET SOURCE/MODULE=имя_модуля, в
 
      которой определено было такое же имя модуля; она  не  отме-
 
      няет действия предыдущей команды SET SOURCE или команды SET
 
      SOURCE/MODULE=имя_модуля, в которой было определено  другое
 
      имя модуля.
 
           Во всех случаях, когда  список  каталогов  для  поиска
 
      исходных файлов отменен, отладчик снова  предполагает,  что
 
      исходный файл (или файлы), соответствующий указанному моду-
 
      лю (модулям), находится в том же каталоге, в котором он был
 
      во время компиляции.
 
 
 
           7.1.2. Пример
 
 
           Предположим, что пользователь пишет программу на языке
 
      кобол системы МОС ВП с именем файла TEST.COB;8  и  что  эта
 
      программа содержит два модуля (MODA  и  MODB).  Предположим
 
      также, что диском по умолчанию является диск DB4 и что  при
 
      компиляции этой программы по умолчанию происходит установка
 
      на [ME.COBPROG], т.е. на раздел каталога, в котором пользо-
 
      ватель всегда содержит программы  КОБОЛА.  Тогда  во  время
 
      компиляции исходный файл будет иметь следующую полную  спе-
 
      цификацию:
 
      DB4:[ME.COBPROG]TEST.COB;8  .
 
           Предположим, что пользователь компонует свою программу
 
      с программой на языке ФОРТРАН, которая  состоит  из  одного
 
      модуля CHECK, а полная спецификация файла этой программы во
 
      время компиляции выглядит следующим образом:
 


                                - 196 -
 
                          00152-01 34 07-1
 
 
      DB4:[ME.FORPROG]CHECK.FOR;2  .
 
           Когда пользователь выполняет свою  программу  и  хочет
 
      воспроизвести  исходные  строки,   отладчик   просматривает
 
      исходные строки модулей MODA и MODB в файле со специфика-
 
      цией   DB4:[ME.COBPROG]TEST.COB;8,   а   исходные   строки
 
      модуля     CHECK    -    в    файле    со    спецификацией
 
      DB4:[ME.FORPROG]CHECK.FOR;2.
 
           Предположим, что пользователь переместил файл TEST.COB
 
      в новый раздел каталога [ME.TEST].  Теперь  при  выполнении
 
      программы и запросе воспроизвести исходные строки из модуля
 
      MODA   отладчик   просматривает   файл   со   спецификацией
 
      DB4:[ME.COBPROG]TEST.COB;8, но  не  находит  там  исходного
 
      файла.
 
           Для направления отладчика на нужный каталог  пользова-
 
      тель может установить список поиска  исходных  каталогов  с
 
      помощью команды:
 
      DBG>SET SOURCE [ME.TESт],[ME.FORPROG]  .
 
           Отладчик обрабатывает эту  команду  путем  подстановки
 
      имени каталога [ME.TEST] в спецификацию файла времени  ком-
 
      пиляции для исходных файлов, соответствующих модулям  MODA,
 
      MODB и CHECK. В результате  этого  отладчик  будет  успешно
 
      находить исходные файлы для модулей MODA и  MODB  (так  как
 
      они были перемещены в этот каталог), но не найдет файла для
 
      модуля CHECK (так как этот файл не был перемещен из  своего
 
      каталога [ME.FORPROG]). Однако, не найдя исходный файл  для
 
      модуля CHECK в каталоге [ME.TEST], отладчик будет  просмат-
 
      ривать следующий каталог из  списка  каталогов  для  поиска
 
      исходных файлов ([ME.FORPROG]) и в  этом  каталоге  успешно
 
      найдет соответствующий исходный файл.
 
           Другим способом направления отладчика на нужные  ката-


                                - 197 -
 
                          00152-01 34 07-1
 
 
      логи является выдача двух следующих команд:
 
      DBG>SET SOURCE/MODULE=MODA [ME.TEST]
 
      DBG>SET SOURCE/MODULE=MODB [ME.TEST]  .
 
           Отладчик обрабатывает данные команды путем ввода имени
 
      каталога [ME.TEST] в спецификации файла времени  компиляции
 
      исходных  файлов,  соответствующих  модулям  MODA  и  MODB.
 
      Теперь при запросе воспроизведения исходных строк из  моду-
 
      лей MODA и MODB отладчик находит исходный файл по  специфи-
 
      кации DB4:[ME.TEST]TEST.COB.
 
           В данном примере необходимо  выдать  две  команды  SET
 
      SOURCE/MODULE=имя_модуля (а не одну такую команду), так как
 
      в программе содержится другой модуль CHECK,  исходный  файл
 
      которого не был перемещен в каталог [ME.TEST]. В результате
 
      этого отладчик продолжает  просматривать  исходный  каталог
 
      времени компиляции  DB4:[ME.FORPROG]CHECK.FOR;2  при  восп-
 
      роизведении исходных строк для модуля CHECK.
 
 
 
           7.2. Воспроизведение по номеру строки
 
 
           Команда  TYPE  позволяет  пользователю  воспроизводить
 
      одну или несколько исходных строк путем определения  одного
 
      или нескольких  генерируемых  компилятором  номеров  строк,
 
      причем каждый номер строки указывает строку исходного кода.
 
           Формат данной команды:
 
      TYPE [[имя_модуля\]номер_строки[:номер_строки] -
 
      [,имя_модуля\]номер_строки[:номер_строки]...]]  .
 
           Если пользователь  указывает  один  номер  строки,  то
 
      отладчик  воспроизводит  исходную  строку,  соответствующую
 
      этому номеру.
 
           Если пользователь указывает список номеров строк, раз-
 


                                - 198 -
 
                          00152-01 34 07-1
 
 
      деляя их запятыми, то отладчик воспроизводит исходные стро-
 
      ки, соответствующие этому списку номеров строк.
 
           Если пользователь определяет диапазон  номеров  строк,
 
      разделяя начальный и конечный номера строк в этом диапазоне
 
      двоеточием,  то  отладчик  воспроизводит  исходные  строки,
 
      соответствующие этому диапазону номеров строк.
 
           Пользователь может считывать все  операторы  исходного
 
      языка в своей программе путем определения диапазона номеров
 
      строк, начиная с единицы и кончая  номером,  который  равен
 
      или больше самого максимального номера строки в  распечатке
 
      программы пользователя.
 
           После  воспроизведения  исходной  строки  пользователь
 
      может воспроизвести следующую строку путем  выдачи  команды
 
      TYPE без номера строки, т.е. выдав команду  TYPE,  а  затем
 
      нажав клавишу RETURN. После этого можно воспроизвести  сле-
 
      дующую строку и последующие строки  путем  повторения  этой
 
      последовательности, считывая таким  образом  свою  исходную
 
      программу в построчном режиме.
 
           Вместе с номером строки  (или  номерами  строк)  можно
 
      определить имя модуля для указания  того,  что  эта  строка
 
      (или строки) находятся в данном модуле. В этом случае  сле-
 
      дует ввести имя модуля, обратную косую черту  (\)  и  номер
 
      строки (или номера строк) без всяких пробелов  между  этими
 
      элементами.
 
           Если пользователь не определяет имя  модуля  вместе  с
 
      номером строки (или номерами строк), то отладчик использует
 
      текущую установку области действия для определения  исполь-
 
      зуемого модуля. В этом  случае  текущей  областью  действия
 
      является либо первый модуль, указанный в команде SET SCOPE,
 
      либо, если эта команда не  выдавалась,  модуль,  содержащий


                                - 199 -
 
                          00152-01 34 07-1
 
 
      текущий счетчик команд (PC).
 
           Приводимый пример демонстрирует использование  команды
 
      TYPE:
 
      DBG>TYPE 160                  !Воспроизведение исходной
 
      MODULE COBOLTEST              !строки, определяемой но-
 
         160: START_IT_PARA.        !мером строки 160.
 
      DBG>TYPE <ВК>              !Воспроизведение исходной
 
      MODULE COBOLTEST           !строки после последней вос-
 
         161:   MOVE SC1 TO ES0. !произведенной исходной
 
                                 !строки.
 
      DBG>TYPE 160:163           !Воспроизведение диапазона
 
      MODULE COBOLTEST           !исходных строк, соответст-
 
         160: STAPT_IT_PARA      !ствующего диапазону, опреде-
 
         161:   MOVE SC1 TO ES0. !ленному номерами строк.
 
         162:   DISPLAY ES0.
 
         163:   MOVE SC1 TO ES1.
 
      DBG>TYPE COBOLTEST\160,22:24 !Воспроизведение одной
 
      MODULE COBOLTEST             !строки и диапазона строк
 
         160:  START_IT_PARA       !исходного кода в указан-
 
                                   !ном модуле.
 
      MODULE COBOLTEST
 
          22: 02 SC2V2  PIC S99V99 COMP VALUE  22.33.
 
          23: 02 SC2V2N PIC S99V99 COMP VALUE -22.33.
 
          24: 02 CPP2   PIC PP99   COMP VALUE  0.0012
 


                                - 200 -
 
                          00152-01 34 07-1
 
 
           7.3. Воспроизведение по адресному выражению
 
 
           Задав квалификатор /SOURCE в команде EXAMINE,  пользо-
 
      ватель может воспроизвести исходную  строку  (или  строки),
 
      соответствующую ячейке (или ячейкам), указанной  одним  или
 
      несколькими адресными выражениями.
 
           Отладчик вычисляет значение каждого адресного  выраже-
 
      ния для получения виртуального  адреса,  определяет,  какой
 
      присвоенный компилятором номер строки соответствует каждому
 
      виртуальному адресу, а затем воспроизводит исходную  строку
 
      (или строки) в соответствии с указанным номером строки (или
 
      номерами строк).
 
           Соответствующий формат команды EXAMINE:
 
      EXAMINE[/квалификатор[/квалификатор]]-
 
      [адресное_выражение[:адресное_выражение]-
 
      [,адресное_выражение[:адресное_выражение]...]]  .
 
           Такой формат  данной  команды  позволяет  пользователю
 
      задавать следующие варианты параметров:
 
           - один параметр адресное_выражение;
 
           - список параметров адресных_выражений;
 
           - диапазон параметров адресных_выражений;
 
           - список диапазонов параметров адресных_выражений.
 
           В любом  случае  при  указании  квалификатора  /SOURCE
 
      отладчик вычисляет значение  каждого  указанного  адресного
 
      выражения  для  определения  соответствующей  ему  исходной
 
      строки.
 
           Если пользователь указывает одно  адресное  выражение,
 
      то отладчик вычисляет его значение для получения  виртуаль-
 
      ного адреса, определяет, какой номер  строки  соответствует
 
      этому виртуальному адресу, а затем (как и в случае  команды
 


                                - 201 -
 
                          00152-01 34 07-1
 
 
      TYPE) воспроизводит соответствующую этому  номеру  исходную
 
      строку.
 
           Если пользователь указывает несколько адресных выраже-
 
      ний (т.е. список), разделяя их запятыми, то отладчик вычис-
 
      ляет каждое такое адресное выражение, как это было  описано
 
      выше, и  воспроизводит  для  каждого  указанного  адресного
 
      выражения соответствующую исходную строку.
 
           Если пользователь указывает  два  адресных  выражения,
 
      которые разделены двоеточием, то отладчик вычисляет  значе-
 
      ние каждого адресного  выражения  для  получения  диапазона
 
      виртуальных адресов, определяет, какие номера  строк  соот-
 
      ветствуют этому диапазону адресов,  а  затем  воспроизводит
 
      исходные строки, определяемые этими номерами. В этом случае
 
      оба адреса в диапазоне должны соответствовать номерам строк
 
      в пределах одного модуля, а первый из этих  номеров  должен
 
      быть меньше или равен второму.
 
           Пример     демонстрирует     использование     команды
 
      EXAMINE/SOURCE:
 
      DBG>EX/SOURCE %PC
 
      !%DEBUG-W-NOSRCLIN,NO SOURCE LINE FOR ADDRESS 7FFF005C
 
             (По адресу 7FFF005с исходная строка отсутствует)
 
                     !Адресное выражение %PC определяет адрес,
 
                     !по которому находится содержимое счетчи-
 
                     !ка команд PC. Никакая исходная строка
 
                     !этому адресу не соответствует. Для полу-
 
                     !чения требуемого результата необходимо
 
                     !определить знак операции "содержимое",
 
                     !т.е. точку, как это показано в следую-
 
                     !щей команде.
 
      DBG>EX/SOURCE .%PC     !Эта команда воспроизводит ис-


                                - 202 -
 
                          00152-01 34 07-1
 
 
      MODULE COBOLTEST       !ходную строку, соответствующую
 
         162:   DISPLAY ES0. !строке, содержащей счетчик
 
                             !команд PC. Фактически она
 
                             !воспроизводит выполняемую в
 
                             !данное время исходную строку.
 
      DBG>EX/SOU 2150        !Данная команда воспроизводит
 
      MODULE COBOLTEST       !исходную строку, соответствую-
 
       165:   MOVE SC1 TO ES2. !щую виртуальному адресу 2150.
 
      DBG>EX/SOURCE 2150:2200  !Данная команда воспроизводит
 
      MODULE COBOLTEST         !диапазон строк исходного
 
       165:   MOVE SC1 TO ES2. !кода, который соответствует
 
       166:   DISRLAY ES2.     !диапазону указанных вирту-
 
       167:   MOVE SC2V2 TO ES0. !альных адресов.
 
       168:   DISPLAY ES0.
 
       169:   MOVE SC2V2 TO ES1.
 
      DBG>EX/SOURCE 2100:2120,2150:2175  !Данная команда
 
      MODULE COBOLTEST         !воспроизводит список диапа-
 
       161:   MOVE SC1 TO ES0. !зонов исходных строк, соот-
 
       162:   DISRLAY ES0.     !ветствующий списку диапазо-
 
       163:   MOVE SC1 TO ES1. !нов указанных виртуальных
 
      MODULE COBOLTEST         !адресов.
 
       165:   MOVE SC1 TO ES2.
 
       166:   DISRLAY ES2.
 
       167:   MOVE SC2V2 TO ES0.
 


                                - 203 -
 
                          00152-01 34 07-1
 
 
           7.4. Воспроизведение во время выполнения программы
 
 
           В результате выдачи команды SET STEP  SOURCE  (команда
 
      по умолчанию) или команды STEP/SOURCE отладчик  воспроизво-
 
      дит исходные строки при наличии одного из условий:
 
           - пользователь выдает команду STEP  без  квалификатора
 
      /NOSOURCE. В таком случае отладчик  воспроизводит  исходную
 
      строку, следующую  за  последней  строкой  или  выполненной
 
      командой программы;
 
           - действует точка приостанова или точка  отслеживания.
 
      В таком  случае  отладчик  воспроизводит  исходную  строку,
 
      соответствующую ячейке с этой точкой;
 
           - действует точка просмотра. В таком  случае  отладчик
 
      воспроизводит  исходную  строку,  соответствующую  команде,
 
      которая вызвала приведение в действие этой точки просмотра.
 
           В результате выдачи команды SET STEP NOSOURCE отладчик
 
      не воспроизводит исходных строк ни  при  выполнении  команд
 
      STEP, ни при приведении в действие точек приостанова, прос-
 
      мотра или отслеживания.
 
           Когда пользователь указывает квалификаторы /SOURCE или
 
      /NOSOURCE в команде STEP, они отменяют (на  время  действия
 
      данной команды) любой указанный и действующий в данное вре-
 
      мя параметр (в том числе параметр, принятый по  умолчанию).
 
      Однако эти квалификаторы не воздействуют на воспроизведение
 
      отладчиком исходных строк при приведении в  действие  точек
 
      приостанова, отслеживания или просмотра; они оказывают воз-
 
      действие  только  на  воспроизведение  отладчиком  исходных
 
      строк при выполнении команд STEP.
 
           Таким образом, когда действует параметр SOURCE,  опре-
 
      деление командного квалификатора /NOSOURCE в  команде  STEP
 


                                - 204 -
 
                          00152-01 34 07-1
 
 
      подавляет воспроизведение исходной строки  (или  строк)  на
 
      время действия данной команды.  Отладчик  продолжает  восп-
 
      роизводить исходные строки при приведении в действие  точек
 
      приостанова, просмотра или отслеживания, а также при выпол-
 
      нении последующих команд STEP (если только в последнем слу-
 
      чае снова не указан квалификатор /NOSOURCE).
 
           С другой стороны, когда действует  параметр  NOSOURCE,
 
      определение командного квалификатора /SOURCE в команде STEP
 
      вызывает воспроизведение отладчиком  исходной  строки  (или
 
      строк) на время действия данной команды. Отладчик не  восп-
 
      роизводит исходные строки при приведении в  действие  точек
 
      приостанова, просмотра или отслеживания, а также при выпол-
 
      нении последующих команд STEP (если только в последнем слу-
 
      чае снова не указан командный квалификатор /SOURCE).
 
           Однако  можно  указать   квалификаторы   /SOURCE   или
 
      /NOSOURCE в командах SET BREAK, SET TRACE и SET WATCH.  Эти
 
      квалификаторы отменяют установку текущего шага, хотя  соот-
 
      ветствующие точки устанавливаются. Квалификаторы  не  изме-
 
      няют установку шага вообще.
 
           Пример демонстрирует воспроизведение  строк  исходного
 
      кода во время выполнения программы:
 
      DBG>STEP                 !Выполнение строки кода. т.к.
 
                               !по умолчанию действует
 
      STEPPED TO COBOLTEST\START_IT  !Параметр SOURCE, от-
 
        161:  MOVE SC1 TO ES0.       !ладчик воспроизводит
 
                                     !исходную строку.
 
      DBG>SET BREAK %LINE 163  !Установка точки приостанова
 
                               !на строке с номером 163.
 
      DBG>GO
 
      BREAK AT COBOLTEST\START_IT\START_IT_PARA\%LINE 163


                                - 205 -
 
                          00152-01 34 07-1
 
 
         163:   MOVE SC1 TO ES1.  !Начало выполнения с текущей
 
                                  !ячейки. Воспроизведение ис-
 
                                  !ходной строки происходит при
 
                                  !достижении точки приостанова.
 
      DBG>SET BREAK/NOSOURCE %LINE 164 !Установка точки приоста-
 
                                  !нова на строке 164. При этом
 
                                  !указано, чтобы исходные стро-
 
                                  !ки не воспроизводились.
 
      DBG>GO
 
      BREAK AT COBOLTEST\START_IT\START_IT_PARA\%LINE 164
 
                                  !Начало выполнения с текущей
 
                                  !ячейки. Исходный код не
 
                                  !воспроизводится, хотя уста-
 
                                  !новка текущего шага -SOURCE.
 
      DBG>SET BREAK %LINE 165     !Установка точки приостанова
 
                                  !в строке с номером 165.
 
      DBG>SET STEP NOSOURCE       !Указание того, что исходные
 
                                  !строки не должны воспроизво-
 
                                  !диться при выполнении команды
 
                                  !STEP или при приведении в
 
                                  !действие точки приостанова
 
                                  !или точки просмотра.
 
      DBG>GO
 
      BREAK AT COBOLTEST\START_IT\START_IT-PARA\%LINE 165
 
                                      !Начало выполнения с теку-
 
                                      !щей ячейки. Следует отме-
       
                                      !тить, что исходная строка
 
                                      !не воспроизводится при
 
                                      !приведении в действие точ-
 
                                      !ки приостанова, т.к. дей-


                                - 206 -
 
                          00152-01 34 07-1
 
 
                                      !ствует параметр NOSOURCE.
 
      DBG>STEP/SOURCE                !Выполнение строки кода и
 
                                     !воспроизведение исходной
 
      STEPPED TO COBOLTEST\%LINE 166 !строки после выполненной
 
        166:    DISPLAY ES2.         !строки. Параметр NOSOURCE
 
                                     !отвергнут на время дейст-
 
                                     !вия этой команды STEP.
 
      DBG>STEP                       !Выполнение строки кода.
 
                                     !Следует отметить, что ис-
 
      STEPPED TO COBOLTEST\%LINE 167 !ходный код не воспроизво-
 
                                     !диться, так как была
 
                                     !выдана команда
 
                                     !SET STEP NOSOURCE, A
 
                                     !Квалификатор не был
 
                                     !определен в команде
 
                                     !STEP.
 
 
 
           7.5. Воспроизведение результатов поиска цепочки
 
 
           Команда  SEARCH  сообщает  отладчику  о  необходимости
 
      поиска и воспроизведения строки исходного текста программы,
 
      содержащей указанную цепочку символов.
 
           Формат команды:
 
      SEARCH[/квалификатор[/квалификатор]] диапазон цепочка  .
 
           Параметр диапазон ограничивает поиск отладчиком место-
 
      нахождения  цепочки  заданным  участком  исходного  текста.
 
      Такие участки могут быть определены следующим образом:
 
           - имя_модуля - указывает поиск в  определенном  модуле
 
      от строки с номером 0 до конца соответствующего модуля;
 
           - имя_модуля\номер_строки - указывает поиск в  опреде-
 


                                - 207 -
 
                          00152-01 34 07-1
 
 
      ленном модуле от указанного номера строки  до  конца  соот-
 
      ветствующего модуля;
 
           - имя_модуля\номер_строки:номер_строки   -   указывает
 
      поиск в определенном модуле, начиная с номера строки,  ука-
 
      занного с левой стороны  от  двоеточия,  и  кончая  номером
 
      строки, указанным с правой стороны от двоеточия;
 
           - номер_строки - указывает поиск в модуле,  определен-
 
      ном текущей  установкой  области  действия,  от  указанного
 
      номера строки до конца этого модуля;
 
           - номер_строки:номер_строки - указывает поиск в  моду-
 
      ле, определенном текущей установкой  области  действия,  от
 
      номера строки, приведенного с левой стороны  двоеточия,  до
 
      номера строки с правой стороны от двоеточия;
 
           - пустой параметр (т. е. отсутствие  ввода)  указывает
 
      поиск в том же модуле, из которого последний раз  воспроиз-
 
      водилась исходная строка (в результате команды SEARCH, TYPE
 
      или EXAMINE/SOURCE), начиная с первой строки, следующей  за
 
      последней воспроизведенной строкой, и  продолжая  до  конца
 
      соответствующего модуля.
 
           Параметр цепочка определяет  символы  исходного  кода,
 
      поиск которых должен выполняться.  Если  этот  параметр  не
 
      указывается, то отладчик использует последнюю указанную для
 
      поиска цепочку (т. е. параметр цепочка, указанный в послед-
 
      ней команде SEARCH). Если предыдущая  цепочка  отсутствует,
 
      то выдается сообщение об  ошибке.  Параметр  цепочка  может
 
      быть заключен в кавычки, в апострофы или может быть  указан
 
      без разделителей.
 
           Если в  цепочке  содержатся  кавычки,  а  пользователь
 
      хочет выделить эту цепочку также с помощью кавычек, то  для
 
      указания кавычек, которые являются частью цепочки,  следует


                                - 208 -
 
                          00152-01 34 07-1
 
 
      использовать двойные кавычки (""). Аналогично этому, если в
 
      цепочке содержится апостроф, а пользователь хочет  выделить
 
      эту цепочку с помощью апострофов, то для обозначения апост-
 
      рофа, который является частью цепочки, следует использовать
 
      двойной апостроф ('').
 
           Выделенная разделителями цепочка может содержать  про-
 
      белы, символы табуляции или специальные символы.  Определе-
 
      ние цепочки без разделителей более удобно, так как экономит
 
      время, но такая цепочка подвержена некоторым ограничениям:
 
           - цепочка без разделителей не должна  иметь  начальных
 
      или конечных пробелов или символов табуляции;
 
           - цепочка без разделителей не должна содержать в  себе
 
      точку с запятой (;);
 
           - параметр диапазона не должен быть пустым, т. е. дол-
 
      жен быть в явной форме указан диапазон.
 
           Командный квалификатор /ALL сообщает отладчику о необ-
 
      ходимости поиска всех местоположений  цепочки  в  указанном
 
      диапазоне и воспроизведения каждой строки, содержащей такую
 
      цепочку.
 
           Командный  квалификатор  /NEXT  сообщает  отладчику  о
 
      необходимости поиска первого местоположения цепочки в  ука-
 
      занном диапазоне и воспроизведения только той строки, кото-
 
      рая содержит это первое местоположение. Последующие  строки
 
      в указанном диапазоне, содержащие искомую цепочку, не восп-
 
      роизводятся. Этот квалификатор устанавливается  по  умолча-
 
      нию.
 
           Командный квалификатор  /IDENTIFIER  определяет  поиск
 
      местоположения цепочки в указанном диапазоне и ее воспроиз-
 
      ведение только в том случае, если она  с  любой  из  сторон
 
      граничит с символом, который не может быть частью идентифи-


                                - 209 -
 
                          00152-01 34 07-1
 
 
      катора на исходном языке  программирования.  (Идентификатор
 
      является именем, связанным с элементом данных или  програм-
 
      мы.) определение квалификатора  /IDENTIFIER  удобно  в  тех
 
      случаях,когда пользователь  ищет  идентификатор,  но  хочет
 
      устранить выдачу всех посторонних идентификаторов,  имеющих
 
      помимо символов данного идентификатора еще и другие.  Пред-
 
      положим, например, что пользователь хочет воспроизвести все
 
      местоположения идентификатора X, но в его программе имеются
 
      также идентификаторы XT и EXP. Очевидно,  что  пользователю
 
      не требуется воспроизведение каждого  местоположения  XT  и
 
      EXP только потому, что в них содержится символ  X.  Поэтому
 
      следует  указать  командный  квалификатор  /IDENTIFIER  для
 
      того, чтобы отладчик отбрасывал появления XT и EXP.  Отлад-
 
      чик не будет воспроизводить их, так как символ X в XT и EXP
 
      по крайней мере с одной стороны граничит с символом,  кото-
 
      рый может быть частью идентификатора на текущем языке прог-
 
      раммирования.
 
           Командный квалификатор /STRING задает  поиск  и  восп-
 
      роизведение цепочки  в  том  виде,  как  она  указана,  без
 
      интерпретации контекста, окружающего  эту  цепочку,  как  в
 
      случае квалификатора /IDENTIFIER. Этот  квалификатор  уста-
 
      навливается по умолчанию.
 
           Команда  SET  SEARCH  обеспечивает  установку  текущих
 
      параметров  поиска  (SEARCH),  если  квалификатор   команды
 
      SEARCH не определен в  этой  команде.  Формат  команды  SET
 
      SEARCH:
 
      SET SEARCH параметр[,параметр]  .
 
           Параметры поиска определяют, будет ли отладчик  выпол-
 
      нять поиск всех местоположений  (ALL)  цепочки  или  только
 
      следующего (NEXT) местоположения цепочки, а также должен ли


                                - 210 -
 
                          00152-01 34 07-1
 
 
      отладчик воспроизводить любое  появление  цепочки  (STRING)
 
      или только те появления, в которых эта цепочка не ограниче-
 
      на с любой из сторон символом, который  может  быть  частью
 
      идентификатора    в    текущем    языке    программирования
 
      (IDENTIFIER).
 
           Если пользователь не  определяет  параметры  поиска  с
 
      помощью данной команды, то по умолчанию отладчик использует
 
      значения NEXT и STRING.
 
           Пользователь может отменить текущие  параметры  поиска
 
      на время выполнения одной команды SEARCH путем  определения
 
      других параметров в качестве квалификаторов этой команды.
 
           В одной команде SET SEARCH можно определять  несколько
 
      параметров поиска, разделяя их запятыми.
 
           Команда SHOW SEARCH обеспечивает воспроизведение теку-
 
      щих параметров поиска.
 
           На  примере   демонстрируется   использование   команд
 
      SEARCH, SET SEARCH и SHOW SEARCH:
 
      DBG>SHOW SEARCH
 
      SEARCH SETTING: SEARCH FOR NEXT OCCURENCE, AS A STRING
 
      (Установка поиска: поиск следующего появления цепочки)
 
                                !Воспроизведение текущих
 
                                !параметров поиска (т.е. ко-
 
                                !манды SEARCH).
 
      DBG>SEARCH/STRING/ALL 40:50 D
 
      MODULE COBOLTEST
 
          40: 02  D2N   COMP-2 VALUE -234560000000.
 
          41: 02  D     COMP-2 VALUE  222222.33.
 
          42: 02  DN    COMP-2 VALUE -222222.333333.
 
          47: 02  DR0   COMP-2 VALUE  0.1.
 
          48: 02  DR5   COMP-2 VALUE  0.000001.


                                - 211 -
 
                          00152-01 34 07-1
 
 
          49: 02  DR10  COMP-2 VALUE  0.00000000001.
 
          50: 02  DR15  COMP-2 VALUE  0.0000000000000001.
 
                                !Воспроизведение всех исходных
 
                                !строк с номерами от 40 до 50,
 
                                !которые содержат букву D.
 
      DBG>SEARCH/IDENTIFIER/ALL 40:50 D
 
      MODULE COBOLTEST
 
          41: 02 D  COMP-2 VALUE 222222.33.
 
                                !Воспроизведение строки, содер-
 
                                !жащей символ D только в том
 
                                !случае, если D с двух сторон
 
                                !ограничено символом, который
 
                                !не может быть частью идентифи-
 
                                !катора в текущем языке.
 
      DBG>SEARCH/NEXT 40:50 D
 
      MODULE COBOLTEST
 
          40: 02  2DN  COMP-2 VALUE -234560000000.
 
                                !Воспроизведение первого появле-
 
                                !ния символа D в данном диапазо-
 
                                !не строк.
 
      DBG>SEARCH/NEXT
 
      MODULE COBOLTEST
 
          41: 02  D   COMP-2 VALUE 222222.33.
 
                                !Воспроизведение первого появле-
 
                                !ния символа D (предыдущая це-
 
                                !почка поиска) в диапазоне, начи-
 
                                !ная со строки после последней
 
                                !воспроизведенной строки (строка
 
                                !40 в предыдущей команде) и до
 
                                !конца текущего модуля.


                                - 212 -
 
                          00152-01 34 07-1
 
 
      DBG>SEA 80:90
 
      MODULE COBOLTEST
 
          80: 02   LS10  PIC S9(10) LEADING SEPARATE VALUE
 
           -: 1234567890.       !Воспроизведение всех появлений
 
                                !символа D (предыдущая цепочка
 
                                !поиска) в диапазоне 80:90.
 
                                !Следует отметить, что строка
 
                                !продолжается на другую.
 
      DBG>SEA COBOLTEST\170 'D' !Воспроизведение первого появ-
 
      MODULE COBOLTEST          !ления D в модуле COBOLTEST в
 
         170:  DISPLAY ES1.     !диапазоне, начиная со строки
 
                                !170 и до конца модуля.
 
      DBG>SEA COBOLTEST\150  'E'!Воспроизведение первого появле-
 
      MODULE COBOLTEST          !ния выделенной цепочки в модуле
 
         161: MOVE SC1 TO ES0.  !COBOLTEST в диапазоне, начиная
 
                                !со строки 150 и до конца этого
 
                                !модуля.
 
      DBG>SEARCH/NEXT 1 "."     !Воспроизведение первого появле-
 
      MODULE COBOLTEST          !ния выделенной цепочки в модуле
 
         2: PROGRAM-ID. COBOLTEST.  !COBOLTEST в диапазоне, на-
 
                                !чиная со строки 1 и до конца
 
                                !этого модуля.
 
      DBG>SET SEARCH IDENT      !Установка текущего параметра
 
                                !команды SEARCH на IDENTIFIER.
 
      DBG>SHOW SEARCH
 
      SEARCH SETTING: SEARCH FOR NEXT OCCURRENCE, AS AN
 
              IDENTIFIER
 
      (Установка поиска: поиск следующего появления иденти-
 
      фикатора)
 
                                !Воспроизведение текущих парамет-


                                - 213 -
 
                          00152-01 34 07-1
 
 
                                !ров команды SEARCH.
 
      DBG>SET SE AL             !Установка текущего параметра
 
                                !команды SEARCH на ALL.
 
      DBG>SH SEA
 
      SEARCH SETTING: SEARCH FOR ALL OCCURENCES,AS AN IDENTIFIER
 
      (Установка поиска: поиск всех появлений идентификатора)
 
                                !Воспроизведение текущих парамет-
 
                                !ров команды SEARCH.
 
 
 
           7.6. Параметры воспроизведения исходного кода
 
 
           В данном подразделе описываются параметры,  предназна-
 
      ченные для установки границ воспроизведения исходного  кода
 
      и для ограничения  числа  исходных  файлов,  которые  могут
 
      одновременно поддерживаться отладчиком в  открытом  состоя-
 
      нии.
 
 
 
           7.6.1. Параметры границ
 
 
           Команда SET MARGIN определяет  позицию  самого  левого
 
      символа исходной строки, с которой должно начинаться  восп-
 
      роизведение исходной строки (левая граница), а также  пози-
 
      цию самого правого символа, на которой заканчивается  восп-
 
      роизведение исходной строки.
 
           По умолчанию отладчик воспроизводит  исходную  строку,
 
      начиная с позиции 1  исходой  строки.  Позиция  1  исходной
 
      строки фактически является позицией 9 на  экране  терминала
 
      пользователя. Первые 8 позиций символов на эране  терминала
 
      заняты номером строки и их нельзя менять с  помощью  данной
 
      команды.
 
           Увеличение установки левой границы (с ее  величины  по


                                - 214 -
 
                          00152-01 34 07-1
 
 
      умолчанию 1) весьма удобно при глубоком внутреннем размеще-
 
      нии исходного  кода;  устранение  воспроизведения  пробелов
 
      обеспечивает большее место на строке  терминала  для  восп-
 
      роизведения исходного кода.
 
           Уменьшение установки правой границы от ее величины  по
 
      умолчанию (255)  предотвращает  перемещение  длинных  строк
 
      путем их усечения. Так как  такие  длинные  строки  требуют
 
      двух строк для воспроизведения на экране терминала,  устра-
 
      нение перемещения обеспечивает возможность  воспроизведения
 
      на экране большего числа строк исходного кода.
 
           Команда SET MARGIN  оказывает  воздействие  только  на
 
      воспроизведение исходных строк, т.е. на  воспроизведение  в
 
      результате   выполнения   таких   команд,   как   TYPE    и
 
      EXAMINE/SOURCE. Данная команда не оказывает воздействия  на
 
      воспроизведение результатов  выполнения  команд  (например,
 
      таких, как EXAMINE, EVALUATE, SHOW MODE и т.д.), которые не
 
      вызывают воспроизведения исходного кода. Если команда восп-
 
      роизводит исходный код вместе с другой информацией  (напри-
 
      мер, команда  STEP/SOURCE),  то  воспроизведение  исходного
 
      кода подвергается воздействию текущей установки  границ,  а
 
      другая информация воспроизводится без изменения.
 
           Формат команды SET MARGIN:
 
      SET MARGIN RM
 
      SET MARGIN LM:RM
 
      SET MARGIN LM:
 
      SET MARGIN   :RM  .
 
           Если пользователь указывает одно  число,  то  отладчик
 
      устанавливает левую границу (LM) на  1,  а  правую  границу
 
      (RM) в соответствии с указанным числом.
 
           Если пользователь указывает  два  числа,  разделяя  их


                                - 215 -
 
                          00152-01 34 07-1
 
 
      двоеточием, то отладчик устанавливает левую границу в соот-
 
      ветствии с числом, указанным с левой стороны от  двоеточия,
 
      а правую границу в соответствии с числом, указанным с  пра-
 
      вой стороны от двоеточия.
 
           Если пользователь указывает одно число в сопровождении
 
      двоеточия, то отладчик устанавливает левую границу в  соот-
 
      ветствии с указанным числом, оставляя  правую  границу  без
 
      изменения.
 
           Если пользователь указывает двоеточие,  сопровождаемое
 
      отдельным числом, то отладчик устанавливает правую  границу
 
      в соответствии с этим числом, оставляя  левую  границу  без
 
      изменения.
 
           Kоманда SHOW MARGIN  воспроизводит  текущую  установку
 
      границ для воспроизведения исходных строк.
 
           Пример демонстрирует использование команд SET MARGIN и
 
      SHOW MARGIN:
 
      DBG>SHOW MARGIN
 
      LEFT MARGIN: 1, RIGHT MARGIN: 255
 
      (левая граница:1, правая граница:255)
 
                                !Воспроизведение текущей уста-
 
                                !новки границ.
 
      DBG>TYPE 116
 
      MODULE COBOLTEST
 
          116: 02  RA26  PIC A(26) JUST RIGHT VALUE
 
            -:"ABCDEFGHIJKLMNOPQRSTUVWXYZ".
 
                                !Воспроизведение исходной строки
 
                                !116. Следует отметить,что строка
 
                                !перемещается, поэтому для ее
 
                                !воспроизведения требуется две
 
                                !строки терминала.


                                - 216 -
 
                          00152-01 34 07-1
 
 
      DBG>SET MARGIN 50         !Установка левой границы на 1,
 
                                !а правой на 50.
 
      DBG>SHOW MARGIN
 
      LEFT MARGIN: 1, RIGHT MARGIN: 50 !Воспроизведение текущей
 
                                !установки границ.
 
      DBG>TY 116
 
      MODULE COBOLTEST
 
          116: 02  RA26 PIC A(26) JUST RIGHT VALUE
 
                                !При правой границе 50 символы
 
                                !исходной строки 116 с пози-
 
                                !ции выше 50 не воспроизводятся.
 
                                !В результате для воспроизведе-
 
                                !ния строки 116 не требуется
 
                                !двух строк терминала.
 
      DBG>SET MARGIN 10:60      !Установка левой границы на 10,
 
                                !а правой границы на 60.
 
      DBG>TY 116
 
      MODULE COBOLTEST
 
          116: A26  PIC A(26) JUST RIGHT VALUE "ABSDEFGHI
 
                                !Символы исходной строки 116
 
                                !в позициях меньше 10 и больше
 
                                !60 не воспроизводятся.
 
      DBG>SET MARGIN  :100      !Установка правой границы на 100,
 
                                !левая граница остается без
 
                                !изменения.
 
      DBG>SHOW MARGIN
 
      LEFT MARGIN: 10, RIGHT MARGIN: 100
 
                                !Воспроизведение текущей уста-
 
                                !новки границ.
 
      DBG>SET MARGIN 5:         !Установка левой границы на 5 и


                                - 217 -
 
                          00152-01 34 07-1
 
 
                                !Оставление правой границы без
 
                                !изменения.
 
      DBG>SHOW MARGIN
 
      LEFT MARGIN: 5, RIGHT MARGIN: 100
 
                                !Воспроизведение текущей уста-
 
                                !новки границ.
 
 
 
           7.6.2. Параметр максимального числа исходных файлов
 
 
           Команда SET MAX_SOURCE_FILES  определяет  максимальное
 
      число исходных файлов, которые отладчик может  поддерживать
 
      открытыми одновременно в любой момент времени.
 
           Формат данной команды:
 
      SET MAX_SOURCE_FILES N  .
 
           Параметр N представляет собой целое десятичное  число,
 
      величина которого определяет  максимальное  число  исходных
 
      файлов,  которые  отладчик  может  поддерживать   открытыми
 
      одновременно в любой момент времени. Величина N  не  должна
 
      превышать 20. По умолчанию принимается величина 5.
 
           Открытие исходного файла требует использования  канала
 
      ввода-вывода, который является ограниченным ресурсом систе-
 
      мы. Как программа, так и отладчик используют каналы ввода -
 
      вывода. Для гарантии того, что отладчик не  использует  все
 
      имеющиеся в наличии каналы ввода-вывода и,  таким  образом,
 
      не вызывает сбоя программы пользователя (по причине  недос-
 
      тупности канала ввода-вывода),  пользователь  может  выдать
 
      команду SET MAX_SOURCE_FILES для определения  максимального
 
      числа исходных файлов (и, следовательно, максимального чис-
 
      ла каналов ввода-вывода  исходных  файлов),  которые  могут
 
      быть использованы отладчиком одновременно  в  любой  момент
 


                                - 218 -
 
                          00152-01 34 07-1
 
 
      времени.
 
           Следует отметить, что  величина,  определяемая  данной
 
      командой, не ограничивает числа  исходных  файлов,  которые
 
      может  открыть  отладчик:  она  просто  ограничивает  число
 
      одновременно открытых файлов. Таким образом, при достижении
 
      этого предела, отладчик должен закрыть файл для того, чтобы
 
      открыть другой файл.
 
           Следует также отметить, что определение с помощью дан-
 
      ной команды слишком малого числа может привести к  неэффек-
 
      тивному использованию отладчиком исходных файлов.
 
           Команда SHOW MAX_SOURCE_FILES обеспечивает воспроизве-
 
      дение числа исходных  файлов,  которые  открыты  отладчиком
 
      одновременно в любой момент времени (или могут быть  откры-
 
      ты).
 
           Пример   демонстрирует   использование   команд    SET
 
      MAX_SOURCE_FILES и SHOW MAX_SOURCE_FILES:
 
      DBG>SHOW MAX_SOURCE_FILES  !Воспроизведение числа
 
      MAX_SOURCE_FILES: 5        !исходных файлов, которые
 
                                 !отладчик может одновременно
 
                                 !содержать в открытом состоянии
 
                                 !в данное время.
 
      DBG>SET MAX_SOURCE_FILES 8 !Установка числа исходных
 
                                 !файлов, которые могут со-
 
                                 !держаться отладчиком
 
                                 !одновременно открытыми,
 
                                 !на 8.
 
      DBG>SHOW MAX_SOURCE_FILES  !Проверка изменения.
 
      MAX_SOURCE_FILES: 8
 


                                - 219 -
 
                          00152-01 34 07-1
 
 
           7.7. Различия  между  исходным  и   об'ектным   кодом,
 
      обусловленные оптимизацией
 
 
           При отладке исходного кода следует помнить о том,  что
 
      в общем случае нет точного  соответствия  "один  к  одному"
 
      между  этим  исходным  кодом  и  генерируемым  компилятором
 
      об'ектным кодом.
 
           Большинство компиляторов оптимизируют генерируемый ими
 
      об'ектный код для более быстрого выполнения программы. Один
 
      из методов оптимизации об'ектного кода заключается в выпол-
 
      нении операций в последовательности, которая отличается  от
 
      последовательности, определенной в исходном коде.
 
           В  результате  этого  исходный  код,   воспроизводимый
 
      отладчиком, не соответствует в точности  фактически  выпол-
 
      няемому об'ектному коду. Это важно  помнить,  особенно  при
 
      использовании  команд  SET  STEP  SOURCE,   STEP/SOURCE   и
 
      EXAMINE/SOURCE.
 
           Для иллюстрации  приводимый  пример  выделяет  сегмент
 
      исходного кода из программы на фортране МОС ВП в том  виде,
 
      как он выводится в  распечатке  компилятора.  Этот  сегмент
 
      кода устанавливает первым десяти элементам массива а значе-
 
      ние 1/X:
 
      Строка     Исходный код
 
        5         DO 100 I=1,10
 
        6         A(I)=1/X
 
        7     100 CONTINUE
 
           При обработке компилятором исходной программы он опре-
 
      деляет, что обратная величина X должна быть вычислена толь-
 
      ко один раз, а не десять раз, как указывает  исходный  код,
 
      так как в цикле DO величина  X  никогда  не  изменяется.  В
 


                                - 220 -
 
                          00152-01 34 07-1
 
 
      результате  этого  компилятор  генерирует  оптимизированный
 
      об'ектный код, который эквивалентен следующему сегменту:
 
      строка     эквивалент об'ектного кода
 
        5             T=1/X
 
                      DO 100 I=1,10
 
        6             A(I)=T
 
        7        100  CONTINUE
 
           В оптимизированном об'ектном коде величина 1/X  вычис-
 
      ляется только один раз, сохраняется во временной ячейке,  а
 
      затем  присваивается  каждой  A(I).  Теперь  об'ектный  код
 
      выполняется быстрее, но не соответствует в точности  исход-
 
      ному коду.
 
           В данном примере, если  пользователь  выполнит  шаг  к
 
      строке 5 путем выдачи команды  STEP/SOURCE  (или  SET  STEP
 
      SOURCE в сопровождении команды STEP), то отладчик воспроиз-
 
      ведет исходную строку в том виде, в котором она  содержится
 
      в исходном файле, в отличие от оптимизированного эквивален-
 
      та об'ектного кода, который фактически выполняется:
 
      STEPPED TO PROG_\%LINE 5
 
          5:    DO 100 I=1,10
 
           В данной точке, если пользователь выдаст другую коман-
 
      ду команду STEP для выполнения строки 5, отладчик  выполнит
 
      строку 5 оптимизированного об'ектного кода, а не  строку  5
 
      воспроизведеного исходного кода. Таким  образом,  программа
 
      вычисляет обратную величину X и устанавливает  цикл  DO,  а
 
      воспроизведение исходного кода показывает только, что уста-
 
      навливается цикл DO.
 
           Это расхождение неочевидно при рассмотрении  воспроиз-
 
      веденной исходной строки. Более того, если вычисление вели-
 
      чины 1/X приведет к ошибке по причине равенства X нулю,  из


                                - 221 -
 
                          00152-01 34 07-1
 
 
      просмотра исходного воспроизведения  будет  следовать,  что
 
      деление на нуль произошло  в  исходной  строке,  в  которой
 
      вообще отсутствует операция деления.
 
           Такой тип явного несовпадения между исходным  кодом  и
 
      об'ектным кодом нужно иметь в виду при отладке  оптимизиро-
 
      ванных программ. Такие несовпадения могут быть  вызваны  не
 
      только "перемещениями кодов" за пределы циклов, как в  ука-
 
      занном примере, но и многими другими методами  оптимизации.
 
      Оптимизация может приводить к перемещению сегментов  об'кт-
 
      ного кода на весьма  значительные  расстояния  от  исходных
 
      ячеек соответствующего исходного кода.
 
           Если пользователю встретится программный сегмент (сег-
 
      мент программы), где исходный код и об'ектный код  выглядят
 
      несовпадающими, пользователь может  просмотреть  соответст-
 
      вующий    об'ектный    код    путем    применения    команд
 
      EXAMINE/INSTRUCTION  или  STEP/INSTRUCTION.  Параллельно  с
 
      этим пользователь может просмотреть созданную  компилятором
 
      распечатку (листинг) машинного кода. Любым из данных  мето-
 
      дов пользователь должен быть в  состоянии  определить,  что
 
      произошло на уровне об'ектного кода, и таким образом разре-
 
      шить несоответствие между воспроизведением исходной  строки
 
      и поведением своей программы.
 
           В дополнение к этому, большинство языков  программиро-
 
      вания позволяют пользователю определять командный  квалифи-
 
      катор /NOOPTIMIZE во время компилирования. Определение дан-
 
      ного командного квалификатора вызывает  запрет  оптимизации
 
      компилятора, и таким образом  устраняет  расхождения  между
 
      исходным кодом и об'ектным кодом, вызываемые оптимизацией.
 
 
 
 


                                - 222 -
 
                          00152-01 34 07-1
 
 
                     8. Отладка в экранном режиме
 
 
 
           8.1. Общее описание экранного режима
 
 
           Отладчик может выводить информацию одним из двух  спо-
 
      собов. По умолчанию отладчик отображает  данные  построчно.
 
      Такой режим называется неэкранным режимом.
 
           Другой режим - экранный - позволяет делить экран  тер-
 
      минала на части, или области, так что различные типы данных
 
      можно отображать в разных частях экрана. Например, исходный
 
      код программы можно отображать в верхней половине экрана, а
 
      обычный вывод отладчика - в нижней. В общем, экранный режим
 
      позволяет видеть в более удобной форме  больше  информации,
 
      чем построчный неэкранный режим.
 
           Экранный режим наиболее  приспособлен  для  терминалов
 
      типа VT100 или VT200 и терминальных станций СМ 1700. Однако
 
      его можно использовать и на терминалах класса VT52, хотя
 
      они  менее  подходят для форматированных  экранных  кадров,
 
      т. к. Эти терминалы не поддерживают "прокрутку" (SCROLLING)
 
      областей, используемую в экранном режиме.
 
           Программу можно отлаживать в  экранном  режиме,  выдав
 
      команду SET MODE SCREEN. Эту  команду  полезно  включать  в
 
      файл инициализации отладчика.  Для  возврата  в  построчный
 
      режим выдается команда SET MODE NOSCREEN.
 
           Для работы в экранном режиме необходимо ознакомиться с
 
      некоторыми понятиями и терминами экранного режима. Наиболее
 
      важными и основными терминами являются:
 
           1) кадр;
 
           2) окно;
 
           3) экран;
 


                                - 223 -
 
                          00152-01 34 07-1
 
 
           4) афиша.
 
           Кадр - это набор текстовых строк. Текст  может  содер-
 
      жать выходную информацию отладчика, строки  исходной  прог-
 
      раммы, команды ассемблера или содержимое регистров. Пользо-
 
      ватель наблюдает кадр через окно  на  экране.  Однако  кадр
 
      позволяет в действительности иметь больше  информации,  чем
 
      можно увидеть через относительно малое экранное окно.  Наи-
 
      больший размер кадра определяет количество текста,  которое
 
      этот кадр может вместить. При добавлении текста к заполнен-
 
      ному кадру прежние строки текста исчезнут, освободив  место
 
      для нового текста.
 
           Окно - это область на экране терминала, через  которое
 
      пользователь может просматривать  кадр.  Окно  определяется
 
      номером начальной строки  (окна)  и  числом  строк  текста,
 
      которые необходимо  видеть  через  это  окно.  Каждый  кадр
 
      является связанным с экранным окном. Хотя окно обычно мень-
 
      ше кадра, его можно перемещать  по  тексту  кадра  командой
 
      SCROLL. С помощью квалификаторов этой команды  можно  прос-
 
      мотреть весь текст кадра.
 
           Экран - это просто экран терминала. На экране термина-
 
      лов типа VT100 или VT200  помещается  от  24  строк  текста
 
      по 80 символов в каждой до 24 строк по 132 символа, в зави-
 
      симости от модели  терминала.  Экран  терминальной  станции
 
      СМ 1700 может быть больше и по ширине и по высоте. Отладчик
 
      может работать с экраном размером до 100 строк по 255  сим-
 
      волов в каждой строке.
 
           Афиша - это воображаемая "доска об'явлений" на  экране
 
      терминала, на которой прикреплены кадры. Схематически  каж-
 
      дый кадр прикреплен или "приклеен" по порядку  на  афишу  и
 
      размещен в своем окне. Только что переданный на  рассмотре-


                                - 224 -
 
                          00152-01 34 07-1
 
 
      ние кадр ставится в конец списка кадров отладчика, так  как
 
      этот кадр "приклеен" на афишу последним. Таким  же  образом
 
      при создании большого числа кадров последние  из  созданных
 
      кадров могут накрыть или закрыть более ранние кадры. Други-
 
      ми словами, конечный вид афиши - это то,  что  пользователь
 
      видит на экране.
 
 
 
           8.2. Создание экранных кадров
 
 
           8.2.1. Экранные кадры, предопределенные отладчиком
 
 
           По умолчанию  отладчик  обеспечивает  четыре  наиболее
 
      часто используемых  кадра.  Эти  предопределенные  экранные
 
      кадры включают:
 
           1) кадр исходного текста, называемый "SRC";
 
           2) кадр выходной информации или "OUT";
 
           3) кадр команд (инструкций) АССЕМБЛЕРА или "INST";
 
           4) кадр значений регистров или "REG".
 
           Когда установлен какой-либо из поддерживаемых отладчи-
 
      ком языков программирования,  исключая  MAKPO,  и  вводится
 
      экранный режим,  отладчик  отображает  в  верхней  половине
 
      экрана предопределенный кадр SRC, а в нижней  -  кадр  OUT.
 
      Пример на рис.10 показывает исходный текст  на  ФОРТРАНЕ  в
 
      SRC и ответы на различные команды отладчика в OUT. В нижней
 
      части экрана показаны несколько строк входных команд отлад-
 
      чика. Стрелка в левой колонке кадра SRC  указывает  текущее
 
      положение счетчика команд. Расположение  стрелки  корректи-
 
      руется по мере выполнения программы, а кадр SRC пере-


                                - 225 -
 
                          00152-01 34 07-1
 
 
 
                   Пример предопределенных кадров
 
  +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
  I                                                                              I
  I     7: C     ---Квадраты ненулевых элементов поместить в выходной массив     I
  I                                                                              I
  I     8:       K = 0                                                           I
  I                                                                              I
  I     9:       DO 10 I = 1, N                                                  I
  I                                                                              I
  I    10:       IF(INARR(I) .NE. 0) THEN                                        I
  I                                                                              I
  I->  11:           OUTAPR(K) = INARR(I)**2                                     I
  I                                                                              I
  I    12:       ENDIF                                                           I
  I                                                                              I
  I    13:    10 CONTINUE                                                        I
  I                                                                              I
  I    14: C                                                                     I
  I                                                                              I
  I    15: C     ---Распечатать выходные значения. Останов.                      I
  I                                                                              I
  I--OUT---OUTPUT----------------------------------------------------------------I
  I                                                                              I
  ISTEPPED TO FORSQUARE$MAIN\%LINE 9                                             I
  I                                                                              I
  I     9:       DO 10 I = 1, N                                                  I
  I                                                                              I
  IFORSQUARE$MAIN\N:       9                                                     I
  I                                                                              I
  IFORSQUARE$MAIN\K:       0                                                     I
  I                                                                              I
  ISTEPPED TO FORSQUARE$MAIN\%LINE 11                                            I
  I                                                                              I
  I                                                                              II
  I                                                                             II
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I------------------------------------------------------------------------------I
  I                                                                              I
  IDBG> EXAM N, K                                                                I
  I                                                                              I
  IDBG> STEP 2                                                                   I
  I                                                                              I
  IDBG>                                                                          I
  I                                                                              I
  +------------------------------------------------------------------------------I
 
 
                               рис.10
 
 
 
 


                                - 226 -
 
                          00152-01 34 07-1
 
 
      мещается (прокручивается) по мере необходимости таким обра-
 
      зом, чтобы положение указателя счетчика команд (PC) находи-
 
      лось примерно в центре.
 
 
 
           8.2.1.1. Предопределенный кадр SRC
 
 
           Сразу следует заметить, что если установлен язык  мак-
 
      ро, то кадр SRC отмечается как удаленный с экрана: его  нет
 
      на экране. Отладчик не поддерживает кадры исходного  текста
 
      на языке макро (подпункт 8.2.1.3).
 
           Кадр SRC располагается в верхней половине  экрана  (по
 
      умолчанию) и автоматически  показывает  положение  текущего
 
      счетчика команд в исходном тексте  программы  пользователя.
 
      Каждый раз, когда программа пользователя передает  управле-
 
      ние отладчику, этот кадр корректируется выполнением команды
 
      EXAMINE/SOURCE.%SOURCE_SCOPE\%PC.  Таким  образом,   всегда
 
      видно, в каком месте в настоящий момент  выполняется  прог-
 
      рамма, т.к. обеспечена доступность исходных строк программы
 
      для отображения.
 
           %SOURCE_SCORE  -  это  встроенный  указатель   области
 
      действия,  показывающий  нулевую  область  действия,  когда
 
      исходные строки доступны для такой области действия. В про-
 
      тивном случае %SOURCE_SCOPE указывает значение N, где  N  -
 
      первый уровень под стеком  вызова,  где  доступны  исходные
 
      строки. Таким образом, когда исходные строки  доступны  для
 
      выполняющегося в текущий момент модуля,  кадр  SRC  центри-
 
      руется по положению счетчика команд. Если  исходные  строки
 
      недоступны для текущего модуля (если, например,  модуль  не
 
      установлен, или если  подпрограмма  является  библиотечной,
 
      т.е. принадлежит  исполнительной  библиотеке  МОС  ВП),  то
 


                                - 227 -
 
                          00152-01 34 07-1
 
 
      отладчик  пытается  отобразить  исходные  строки  источника
 
      вызова этого модуля (область  действия  1).  Если  исходные
 
      строки опять недоступны  и  на  этом  уровне,  то  отладчик
 
      пытается на следующем (область действия 2), и т.д.
 
           Отображая исходные строки, не связанные с выполняющим-
 
      ся модулем, отладчик выдает соответствующее  информационное
 
      сообщение:
 
      %DEBUG-I-SOURCESCOPE, SOURCE LINES NOT AVAILABLE FOR .0%PC
 
      DISPLAYIPG SOURCE IN A CALLER OF THE CURRENT ROUTINE
 
           пример на рис.11 иллюстрирует это средство.  На  кадре
 
      исходного текста стрелка указывает, что  значение  счетчика
 
      команд стоит на команде вызова подпрограммы  TYPE,  которая
 
      является  процедурой  исполнительной  библиотеки  ФОРТРАНА.
 
      Исходные строки этого  кода  недоступны,  поэтому  отладчик
 
      отображает строки  вызываемого  модуля.  Результат  команды
 
      SHOW CALLS, показанный на кадре выходной информации,  отра-
 
      жает выполняющийся модуль и вызывающую последовательность.
 
 
 
           8.2.1.2. Предопределенный кадр OUT
 
 
           По умолчанию предопределенный кадр  OUT  расположен  в
 
      нижней половине экрана и показывает всю  выходную  информа-
 
      цию, генерируемую отладчиком в ответ  на  вводимые  команды
 
      (см. рис.10, 11). Обычно этот кадр вмещает 100 строк выход-
 
      ной информации отладчика, хотя пользователь может  изменить
 
      это значение, принимаемое по умолчанию. Выходной текст мож-
 
      но прокручивать или командой  SCROLL  или  соответствующими
 
      клавишами малой (цифровой) клавиатуры терминала.


                                - 228 -
 
                          00152-01 34 07-1
 
 
 
                   Пример предопределенного кадра SRC
 
  +--SRC: MODULE TEST---SOURCE-SCROLL--------------------------------------------+
  I                                                                              I
  I%DEBUG-I-SOURCESCOPE, SOURCE LINES NOT AVAILABLE FOR .0\%PC                   I
  I                                                                              I
  IDISPLAYING SOURCE IN A CALLER OF THE CURRENT ROUTINE                          I
  I                                                                              I
  I     3:         CHARACTER*(*) ARRAYX                                          I
  I                                                                              I
  I->   4:         TYPE *, ARRAYX                                                I
  I                                                                              I
  I     5:         RETURN                                                        I
  I                                                                              I
  I     6:         END                                                           I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I--OUT---OUTPUT----------------------------------------------------------------I
  I                                                                              I
  ISTEPPED TO SHARE$FORRTL+810                                                   I
  I                                                                              I
  I MODULE NAME     ROUTINE NAME                LINE       REL PC        ABS PC  I
  I                                                                              I
  I SHARE$FORRTL    SHARE$FORRTL                          0000032A      00000B2A I
  I                                                                              I
  I*TEST            TEST                           4      0000001E      00000436 I
  I                                                                              I
  I*A               A                              3      00000011      00000411 I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I------------------------------------------------------------------------------I
  I                                                                              I
  IDBG> STEP                                                                     I
  I                                                                              I
  IDBG> SHOW CALLS                                                               I
  I                                                                              I
  IDBG>                                                                          I
  I                                                                              I
  +------------------------------------------------------------------------------+
 
 
                               рис.11
 
 
 
 


                                - 229 -
 
                          00152-01 34 07-1
 
 
           8.2.1.3. Предопределенный кадр INST
 
 
           Предопределенный кадр команд ассемблера  INST  отобра-
 
      жается по умолчанию в верхней половине экрана  и  автомати-
 
      чески показывает ячейку в последовательности  команд  прог-
 
      раммы  пользователя,  соответствующую   значению   счетчика
 
      команд PC. Каждый раз, когда программа  пользователя  пере-
 
      дает управление отладчику, кадр INST корректируется  выпол-
 
      нением команды EXAMINе/INSTRUCTION .0\%PC. Другими словами,
 
      этот кадр всегда показывает, где в  настоящий  момент  идет
 
      выполнение программы - пример на рис.12.
 
           Если установлен язык, отличный от МАКРО, то кадр  INST
 
      отмечен как удаленный с экрана: на экране его не  видно.  В
 
      таких случаях для показа кадра INST необходимо использовать
 
      команду DISPLAY.
 
           Если устанавливается язык МАКРО,  кадр  INST  занимает
 
      место кадра SRC (на экране) по умолчанию. Отладчик не  под-
 
      держивает кадр исходного текста для макро.
 
           Числа слева от команд (см. рис.12) - это номера строк.
 
      Стрелка автоматически  устанавливается  на  команду,  соот-
 
      ветствующую значению PC.
 
           Если кадр INST выбирается командой  SELECT/INSTRUCTION
 
      INST, то выходная  информация  команды  EXAMINE/INSTRUCTION
 
      направляется в кадр команд АССЕМБЛЕРА.


                                - 230 -
 
                          00152-01 34 07-1
 
 
 
                   Пример предопределенного кадра INST
 
  +--INST: ROUTINE FORSQUARE$MAIN------------------------------------------------+
  I                                                                              I
  I          : BLEQ    FORSQUARE$MAIN\%LINE 16                                   I
  I                                                                              I
  ILINE    10: MOVL    B^4(R11),R0                                               I
  I                                                                              I
  I          : TSTL    W^-164(R11)[R0]                                           I
  I                                                                              I
  I          : BEQL    FORSQUARE$MAIN\%LINE 13                                   I
  I                                                                              I
  I->NE    11: MOVL    B^12(R11),R1                                              I
  I                                                                              I
  I          : MOVL    B^4(R11),R0                                               I
  I                                                                              I
  I          : MULL3   W^-164(R11)[R0],W^-164(R11)[R0],B^-84(R11)[R1]            I
  I                                                                              I
  ILINE    13: AOBLEQ  B^16(R11),B^4(R11),FORSQUARE$MAIN\%LINE 10                I
  I                                                                              I
  ILINE    16: PUSHAL  L^525                                                     I
  I                                                                              I
  I--OUT---OUTPUT----------------------------------------------------------------I
  I                                                                              I
  ISTEPPED TO FORSQUARE$MAIN\%LINE 9                                             I
  I                                                                              I
  I     9:       DO 10 I = 1, N                                                  I
  I                                                                              I
  IFORSQUARE$MAIN\N:       3                                                     I
  I                                                                              I
  IFORSQUARE$MAIN\K:       0                                                     I
  I                                                                              I
  ISTEPPED TO FORSQUARE$MAIN\%LINE 11                                            I
  I                                                                              I
  IFORSQUARE$MAIN\I:       1                                                     I
  I                                                                              I
  IFORSQUARE$MAIN\K        0                                                     I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I------------------------------------------------------------------------------I
  I                                                                              I
  IDBG> STEP                                                                     I
  I                                                                              I
  IDBG> EXAMINE I,K                                                              I
  I                                                                              I
  IDBG>                                                                          I
  I                                                                              I
  +------------------------------------------------------------------------------+
 
 
                               рис.12
 
 
 
 


                                - 231 -
 
                          00152-01 34 07-1
 
 
           8.2.1.4. Предопределенный кадр REG
 
 
           Предопределенный кадр значений регистров (REG) отобра-
 
      жается в третьей четверти экрана (по умолчанию) и автомати-
 
      чески показывает текущее значение всех машинных  регистров.
 
      Там же показывается несколько верхних значений в стеке и  в
 
      списке текущих аргументов. Значения,  которые  меняются  по
 
      мере прохождения через программу, визуально выделяются  (по
 
      яркости).
 
           Этот кадр отмечен как удаленный с  экрана:  на  экране
 
      его не видно до тех пор,  пока  он  явно  не  будет  вызван
 
      командой DISPLAY REG. Пример кадра REG показан на рис.13.
 
 
 
           8.2.2. Создание новых экранных кадров
 
 
           Помимо четырех предопределенных кадров можно с помощью
 
      команды SET DISPLAY определять собственные экранные  кадры.
 
      Команда SET DISPLAY определяет имя, местоположение  окна  и
 
      содержимое кадра. Имя кадра высвечивается в  верхнем  левом
 
      углу экранного окна. Оно служит и  как  этикетка  на  самом
 
      окне и как имя для будущих ссылок в других командах.
 
           Формат команды SET DISPLAY:
 
           SET DISPLAY [/квалификатор,...]имя_кадра [AT-
 
           спецификация_окна][тип_кадра][,имя_кадра[AT специ-
 
           фикация_окна][тип_кадра[,...]] .
 
           Имя_кадра - это имя определяемого кадра. Если  исполь-
 
      зуется имя существующего кадра, то этот  существующий  кадр
 
      необходимо предварительно удалить. Данный параметр является
 
      обязательным.


                                - 232 -
 
                          00152-01 34 07-1
 
 
 
                   Пример предопределенного кадра REG
 
  +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
  I                                                                              I
  I     4:         OPEN(UNIT=8, FILE='DATAFILE.DAT', STATUS='OLD')               I
  I                                                                              I
  I     5:         READ(8,*)  N, (INARR(I), I=1,N)                               I
  I                                                                              I
  I     6: C                                                                     I
  I                                                                              I
  I     7: C       ---Квадраты ненулевых элементов поместить в выходной массив.  I
  I                                                                              I
  I->   8:         K = 0                                                         I
  I                                                                              I
  I     9:         DO 10 I = 1, N                                                I
  I                                                                              I
  I    10:         IF(INARR(I) .NE. 0) THEN                                      I
  I                                                                              I
  I    11:             K = K + 1                                                 I
  I                                                                              I
  I    12:                 OUTARR(K) = INARR(I)**2                               I
  I                                                                              I
  I--REG-------------------------------------------------------------------------I
  I                                                                              I
  IR0:00000000 R4:00000000 R8: 7FFED052 AP:7FF5EFCC @AP:00000006 @SP:00000000 N:0I
  I                                                                              I
  IR1:00000008 R5:00000000 R9: 7FFED25A FP:7FF5EF80  +4:7FFE6440  +4:08000000 Z:0I
  I                                                                              I
  IR2:00000000 R6:7FF5EC49 R10:7FFEDDD4 SP:7FF5EF80  +8:7FFA8ED3  +8:7FF5EFCC V:0I
  I                                                                              I
  IR3:7FF5EF94 R7:8001E4DD R11:000004A0 PC:0000064D +12:7FFE640C +12:7FF5EFB8 C:0I
  I                                                                              I
  I--OUT---OUTPUT-----------------------------------------------------------------
  I                                                                              I
  ISTEPPED TO FORSQUARE$MAIN\%LINE 8                                             I
  I                                                                              I
  IFORSQUARE$MAIN\I:       4                                                     I
  I                                                                              I
  IFORSQUARE$MAIN\K:       0                                                     I
  I                                                                              I
  IFORSQUARE$MAIN\N:       3                                                     I
  I                                                                              I
  I------------------------------------------------------------------------------I
  I                                                                              I
  IDBG> STEP                                                                     I
  I                                                                              I
  IDBG> EXAMINE I,K,N                                                            I
  I                                                                              I
  IDBG>                                                                          I
  I                                                                              I
  +------------------------------------------------------------------------------+
 
 
                               Рис.13
 
 
 
 


                                - 233 -
 
                          00152-01 34 07-1
 
 
           Спецификация_окна - указывает размер и положение окна,
 
      связываемого с создаваемым кадром (подраздел  8.4.).  Можно
 
      использовать имя  предопределенного  окна,  или  имя  окна,
 
      предварительно определенного командой SET WINDOW, или  ука-
 
      зать спецификацию окна напрямую. Если этот параметр опущен,
 
      кадр будет отображаться или в верхней или в нижней половине
 
      экрана (Н1 или Н2).
 
           Тип_кадра -  отражает  тип  кадра  отладчика,  который
 
      определяет, как сгенерировано содержимое или  текст  кадра.
 
      Кроме кадров значений регистров, содержимое  экранных  кад-
 
      ров - это всегда результат выполнения некоторой  последова-
 
      тельности команд. Однако выходную информацию можно  органи-
 
      зовать двумя способами. Первый  -  это  с  помощью  команды
 
      SELECT назначить конкретный кадр в качестве кадра исходного
 
      текста, выходной информации  или  кадра  команд.  Результат
 
      выполнения команд отладчика направляется затем в этот  выб-
 
      ранный кадр. Эта информация и будет содержимым кадра.  Вто-
 
      рой способ состоит в  определении  списка  команд,  которые
 
      автоматически выполняются всякий раз при получении отладчи-
 
      ком управления от программы пользователя. Выходная информа-
 
      ция этих команд направляется затем в привязанный кадр. Спи-
 
      сок команд в команде SET DISPLAY подобен командной последо-
 
      вательности DO в команде SET BREAK. Этот  список  автомати-
 
      чески выполняется при получении управления при условии, что
 
      кадр не помечен как удаленный с экрана,  список  команд  не
 
      выполняется до тех пор, пока пользователь  не  увидит  этот
 
      кадр. Команда SET  DISPLAY  допускает  следующие  параметры
 
      типа кадров:
 
           DO (список_команд) - указывает автоматически корректи-
 
      руемый кадр выходной информации. Список команд  выполняется


                                - 234 -
 
                          00152-01 34 07-1
 
 
      при получении отладчиком  управления.  Выходная  информация
 
      этих команд является содержимым кадра;
 
           INSTRUCTION - указывает кадр команд ассемблера,  кото-
 
      рый не корректируется  автоматически.  В  этот  кадр  можно
 
      отображать выходную информацию команды EXAMINE/INSTRUCTION,
 
      но сначала его  надо  назначить  текущим  кадром  команд  с
 
      помощью SELECT/INSTRUCTION;
 
           INSTRUCTION (список_команд) - указывает  автоматически
 
      корректируемый кадр команд. В списке команд необходимо ука-
 
      зать команду EXAINE/INSTRUCTION;
 
           NORMAL - определяет обычный кадр выходной  информации.
 
      В него можно помещать обычную выходную информацию  отладчи-
 
      ка, но сначала этот кадр необходимо назначить текущим  кад-
 
      ром выходной информации с помощью команды SELECT/OUTPUT;
 
           REGISTER - указывает автоматически корректируемый кадр
 
      значений регистров;
 
           SOURCE - указывает кадр исходного текста, не корректи-
 
      руемый автоматически. В него можно помещать выходную инфор-
 
      мацию команд TYPE или EXAMINE/SOURCE, но сначала его  нужно
 
      назначить в качестве  текущего  кадра  исходного  текста  с
 
      помощью команды SELECT/SOURCE;
 
           SOURCE (список_команд) - автоматически  корректируемый
 
      кадр исходного текста. В списке команд необходимо указывать
 
      одну команду TYPE или  одну  команду  EXAMINE/SOURCE.  Если
 
      параметр тип_кадра опущен, то по  умолчанию  действует  тип
 
      NORMAL.
 
           Команда SET DISPLAY может иметь четыре  квалификатора:
 
      /HIDE, /MARK_CHANGE, /REMOVE и /SIZE:N. Квалификатор  /HIDE
 
      маскирует ("прячет") указанный кадр под любой другой, зани-
 
      мающий это же место на  экране.  Квалификатор  /MARK_CHANGE


                                - 235 -
 
                          00152-01 34 07-1
 
 
      вызывает визуальное выделение (по яркости) измененных строк
 
      в кадрах типа DO (список_команд). Квалификатор /REMOVE ука-
 
      зывает, что кадр не должен появляться на экране; кадр отме-
 
      чается как удаленный с экрана. Квалификатор  /SIZE:N  уста-
 
      навливает максимальный размер кадра в N строк.  Для  кадров
 
      типа NORMAL или DO этот квалификатор  указывает,  что  кадр
 
      должен хранить N последних выходных  строк.  При  появлении
 
      новых строк наиболее  старые  стираются.  Для  кадров  типа
 
      SOURCE N указывает число исходных  строк,  которые  буфери-
 
      руются одновременно за один раз. По  умолчанию  принимается
 
      N=50.
 
           Для просмотра  всех  действующих  кадров  используется
 
      команда SHOW DISPLAY. Эта команда выдает имена, окна и типы
 
      всех текущих кадров.
 
           Для стирания кадра используется команда CANCEL DISPLAY
 
      в следующем формате:
 
      CANCEL DISPAY [/квалификатор][имя_кадра [,имя_кадра...]] .
 
           Эта команда  стирает  кадр,  предварительно  созданный
 
      командой SET DISPLAY. Команда  стирания  может  иметь  один
 
      квалификатор /ALL. При его  задании  стираются  все  кадры,
 
      созданные командой SET DISPLAY, а так же все экранные кадры
 
      по умолчанию.  При  указании  квалификатора  /ALL  параметр
 
      имя_кадра опускается.  В  команде  без  квалификатора  /ALL
 
      параметры имя_кадра указывают кадры для стирания.
 
           Стертый кадр не восстанавливается. Если стираемый кадр
 
      находится на экране, он исчезает с экрана,  после  чего  на
 
      экране появляется "спрятанный"  (замаскированный)  под  ним
 
      кадр (если такой задан).
 


                                - 236 -
 
                          00152-01 34 07-1
 
 
           8.2.3. Псевдо-имена кадра
 
 
           Каждый экранный кадр имеет единственное имя, такое как
 
      "SRC", с помощью которого можно к этому  кадру  обращаться.
 
      Однако отладчик допускает  так  же  шесть  псевдо-имен  для
 
      ссылки к кадрам относительно их положения в списке  кадров.
 
      Эти имена используются главным образом в определениях  кла-
 
      виш или команд.
 
           Каждый раз при ссылке  к  какому-то  кадру  с  помощью
 
      команд DISPLAY или SET DISRLAY список  существующих  кадров
 
      корректируется и упорядочивается, если это необходимо. Пос-
 
      ледний задействованный кадр всегда ставится в конец  списка
 
      кадров, т.к. он "наклеивался" на афишу последним.
 
           Псевдо-имена в отличии от явных имен  позволяют  обра-
 
      щаться к кадрам по их  относительному  положению  в  списке
 
      кадров. Псевдо-имена, описываемые в данном  пункте,  позво-
 
      ляют выбрать текущий кадр, следующий по  списку,  следующий
 
      кадр выходной информации,  следующий  прокручиваемый  кадр,
 
      следующий кадр исходного текста:
 
           1) %CURDISP - относится к текущему кадру, т.е. послед-
 
      нему просмотренному  с  помощью  команды  DISPLAY  или  SET
 
      DISPLAY;
 
           2) %NEXTDISP - относится к следующему по списку  после
 
      текущего кадру;
 
           3) %NEXTINST - относится к следующему кадру  команд  в
 
      списке после текущего кадра команд. Текущим  кадром  команд
 
      является   кадр,   получающий   информацию    от    команды
 
      EXAMINE/INSTRUCTION;
 
           4) %NEXTOUTPUT - относится к следующему по списку кад-
 
      ру типа NORMAL или DO после текущего кадра выходной  инфор-
 


                                - 237 -
 
                          00152-01 34 07-1
 
 
      мации. Кадр выходной информации получает регулярную  инфор-
 
      мацию с выхода отладчика;
 
           5) %NEXTSCROLL - относится к следующему по списку кад-
 
      ру после текущего прокручиваемого кадра. Текущим  прокручи-
 
      ваемым кадром является кадр по умолчанию для команд  SCROLL
 
      или для клавиш "прокрутки" кадров;
 
           6) %NEXTSOURCE - относится к следующему в списке кадру
 
      типа SOURCE за текущим  кадром  исходного  текста.  Текущим
 
      является кадр,  получающий  информацию  от  команд  TYPE  и
 
      EXAMINE/SOURCE.
 
           Для псевдо-имен список кадров отладчика является  цик-
 
      лическим списком; другими словами, можно переходить от пос-
 
      леднего элемента списка к первому. В результате при  выдаче
 
      какой-либо команды, содержащей псевдо-имя, происходит  цик-
 
      лический просмотр списка кадров  до  нахождения  требуемого
 
      кадра.
 
           Псевдо-имена можно использовать в определениях  клавиш
 
      или команд для удобства выбора, например, текущего или сле-
 
      дующего кадра. Как правило, псевдо-имена используются толь-
 
      ко в таких определениях. Псевдо-имена не относятся  к  кад-
 
      рам, отмеченным как удаленные с экрана.
 
 
 
           8.3. Использование экранных кадров
 
 
           В  этом  подразделе  раскрываются  средства  экранного
 
      режима,  позволяющие  манипулировать  экранными  кадрами  и
 
      менять их положения на экране.
 


                                - 238 -
 
                          00152-01 34 07-1
 
 
           8.3.1. Использование команды DISPLAY
 
 
           Команда DISPLAY является наиболее важной командой  для
 
      манипулирования кадрами, выбора  их  позиций  на  экране  и
 
      модификации их характеристик. Эта команда может иметь  одну
 
      из трех форм:
 
           DISPLAY [/квалификатор,...] имя_кадра [AT специфика-
 
             ция_окна][тип_кадра][,имя_кадра[AT спецификация_-
 
             окна][тип_кадра][,...]]
 
           DISPLAY/GENERATE
 
           DISPLAY/REFRESH
 
           Параметр имя_кадра - это имя экранного кадра,  который
 
      пользователь желает видеть.  Спецификация_окна  -  это  имя
 
      окна, определенное отладчиком  (п.  8.4.1)  или  с  помощью
 
      команды SET WINDOW.
 
           Если   указывается   необязательное   выражение    "АТ
 
      спецификация_окна", то в  этом  случае  данное  окно  можно
 
      изменить. Другими словами, можно менять положение кадра  на
 
      экране: кадр может быть представлен в разных частях экрана,
 
      а также быть больше или меньше.
 
           Для изменения типа кадра необходимо использовать  нео-
 
      бязательный параметр тип_кадра.
 
           Команда может иметь следующие  квалификаторы:  /CLEAR,
 
      /HIDE, /GENERATE, /MARK_CHANGE, /NOMARK_CHANGE,  /REMOVE  и
 
      /SIZE:N. При  использовании  /CLEAR  или  /GENERATE  список
 
      параметров необязателен. Команда DISPLAY допускает  так  же
 
      квалификатор /REFRESH, при этом остальные квалификаторы или
 
      параметры не используются.
 
           Квалификатор /CLEAR приводит  к  стиранию  содержимого
 
      указанного кадра. Квалификатор /HIDE "прячет" кадр под дру-
 


                                - 239 -
 
                          00152-01 34 07-1
 
 
      гие, которые закрывают этот кадр.
 
           Квалификатор /MARK_CHANGE заставляет отладчик визуаль-
 
      но выделять (на экране) при автоматической коррекции  кадра
 
      типа DO  (список_команд)  измененные  строки.  Квалификатор
 
      /NOMARK_CHANGE выключает такое визуальное выделение.
 
           Квалификатор /REMOVE помечает  кадр  как  удаленный  с
 
      экрана. В этом случае кадр  не  видно  на  экране,  но  его
 
      содержимое сохранено и может быть выдано на экран последую-
 
      щей командой DISPLAY.
 
           Квалификатор  /GENERATE   восстанавливает   содержимое
 
      какого-либо автоматически корректируемого экранного  кадра,
 
      указанного пользователем. Если конкретный кадр не задан, то
 
      восстанавливаются все автоматически  корректируемые  кадры.
 
      Такие кадры являются восстановленными всегда, когда  отлад-
 
      чик получает управление от программы пользователя. Следова-
 
      тельно, команда DISPLAY/GENERATE обычно используется тогда,
 
      когда необходимо восстановить кадры после  команд  DEPOSIT,
 
      SET MODULE или других, которые могут повлиять на содержимое
 
      кадра.
 
           Квалификатор /REFRESH  обновляет  экран  терминала  (в
 
      режиме малой клавиатуры эта функция выполняется при нажатии
 
      CTRL/W).  С  этим  квалификатором  любые  другие  параметры
 
      команды DISPLAY не используются.
 
 
 
           8.3.2. Выбор кадров для выходной информации
 
 
           По умолчанию выходная информация отладчика  помещается
 
      в кадр OUT. Однако эту информацию можно направить в  другой
 
      кадр, если необходимо  сгруппировать  отдельную  информацию
 
      или сохранить выходную информацию для дальнейшего использо-
 


                                - 240 -
 
                          00152-01 34 07-1
 
 
      вания. Аналогично можно перенаправить исходный текст, полу-
 
      чаемый командами TYPE и EXAMINE/SOURCE. По умолчанию  такой
 
      выход помещается в кадр SRC, но можно выбрать другой кадр в
 
      качестве кадра SOURCE.
 
           Для выбора желаемого  экранного  кадра  для  получения
 
      обычной выходной информации отладчика, исходного текста или
 
      команд АССЕМБЛЕРА служит команда SELECT. Она позволяет так-
 
      же выбрать текущий прокручиваемый кадр. Команда имеет  фор-
 
      мат:
 
           SELECT [/квалификатор...][имя_кадра]  .
 
           Имя_кадра называет кадр, который необходимо выбрать  в
 
      качестве  текущего  кадра  выходной  информации,  исходного
 
      текста, команд ассемблера или прокручиваемого  кадра.  Если
 
      этот параметр опущен, никакой кадр не выбирается, а текущий
 
      кадр  становится  "неотобранным",  "несортовым".  Становясь
 
      "несортовым", кадр теряет отметку о том,  что  он  является
 
      прокручиваемым кадром, кадром выходной информации, исходно-
 
      го текста или команд АССЕМБЛЕРА. Для переназначения на дру-
 
      гой кадр или для перевыбора прокручиваемого кадра необходи-
 
      ма другая команда SELECT.
 
           Команда  SELECT  может  иметь  четыре   квалификатора:
 
      /INSTRUCTION, /OUTPUT, /SCROLL, /SOURCE.
 
           Квалификатор /INSTRUCTION назначает указанный  кадр  в
 
      качестве  текущего  кадра  команд  АССЕМБЛЕРА.  Выход  всех
 
      команд EXAMINE/INSTRUCTION направляется в этот кадр.
 
           Квалификатор /OUTPUT направляет всю  обычную  выходную
 
      информацию отладчика в указанный кадр.
 
           Квалификатор  /SCROLL  назначает  указанный   кадр   в
 
      качестве текущего прокручиваемого кадра. Этот  кадр  стано-
 
      вится кадром по умолчанию для команд SCROLL, так же  как  и


                                - 241 -
 
                          00152-01 34 07-1
 
 
      для клавиш малой клавиатуры, предназначенных для прокрутки.
 
      Этот квалификатор действует по умолчанию, если никакой дру-
 
      гой квалификатор с командой SELECT не указан.
 
           Квалификатор /SOURCE выбирает заданный кадр в качестве
 
      текущего  кадра  исходного  текста.  Результат   выполнения
 
      команд TYPE и EXAMINE/SOURCE помещается в этот кадр.
 
 
 
           8.3.3. Прокрутка кадров
 
 
           Команда SCROLL перемещает экранное окно по тексту кад-
 
      ра. С помощью этой команды можно просматривать любые участ-
 
      ки кадра, даже если текст кадра  намного  больше  экранного
 
      окна, через которое этот текст просматривают. Команда имеет
 
      вид:
 
           SCROLL/квалификатор[:N][имя_кадра]
 
           Необязательным параметром имя_кадра может быть или имя
 
      предопределенного  кадра  или  имя  кадра,   предварительно
 
      об'явленного командой SET DISPLAY.  Если  параметр  опущен,
 
      прокручивается кадр, который был выбран последней  командой
 
      SELECT/SCROLL или клавишей 3 малой цифровой клавиатуры.
 
           Команда SCROLL может иметь один из шести  квалификато-
 
      ров:  /UP[:N],/DOWN[:N],   /LEFT[:N],   /RIGHT[:N],   /TOP,
 
      /BOTTOM. При задании команды  SCROLL  необходимо  указывать
 
      один из этих первых четырех квалификаторов.  Необязательные
 
      параметры первых четырех квалификаторов указывают количест-
 
      во строк (/UP - вверх, /DOWN - вниз) или столбцов (/LEFT  -
 
      влево, /RIGHT - вправо),  на  которое  необходимо  сместить
 
      (прокрутить) окно  относительно  кадра.  Если  параметр  не
 
      задан для квалификаторов /UP и /DOWN, то кадр прокручивает-
 
      ся примерно на три четверти высоты окна.  Отсутствие  пара-
 


                                - 242 -
 
                          00152-01 34 07-1
 
 
      метра в квалификаторах /LEFT или /RIGHT приводит к смещению
 
      кадра на восемь позиций влево или вправо.
 
           Таким образом, для прокрутки кадра можно  использовать
 
      команды SCROLL/UP и SCROLL/DOWN, а также клавиши  прокрутки
 
      на малой клавиатуре.
 
           Смещение вправо позволяет  просмотреть  концы  слишком
 
      длинных строк кадра. Для  возврата  на  место  используется
 
      команда SCROLL/LEFT.
 
           Команда SCROLL/TOP передвигает окно на начало кадра, а
 
      SCROLL/BOTTOM - на конец кадра.
 
           В режиме малой клавиатуры команды  прокрутки  вводятся
 
      простым нажатием клавиши малой клавиатуры.
 
 
 
           8.3.4. Сохранение кадров
 
 
           Пользователь может сохранить копию созданного экранно-
 
      го кадра с  помощью  команды  SAVE.  Эта  команда  особенно
 
      полезна в том случае, когда  необходимо  запомнить  текущее
 
      содержимое кадра (такого, как автоматически корректируемого
 
      кадра) для использования в дальнейшем.
 
           Команда имеет следующий вид:
 
           SAVE прежний_кадр AS новый_кадр [,прежний_кадр-
 
                AS новый_кадр]
 
           Прежний_кадр -  это  имя  кадра,  содержимое  которого
 
      необходимо сохранить. Аналогичный параметр новый_кадр - это
 
      имя создаваемого кадра с содержимым сохраняемого кадра. Для
 
      просмотра  сохраненной  информации   используется   команда
 
      DISPLAY с именем нового кадра.
 


                                - 243 -
 
                          00152-01 34 07-1
 
 
           8.4. Создание определений окна
 
 
           8.4.1. Использование окон, определенных отладчиком
 
 
           Отладчик обеспечивает большое  число  предопределенных
 
      имен окна. Эти имена следующие (числа в скобках  соответст-
 
      вуют  параметру  (начальная_строка,   количество_строк)   в
 
      команде SET WINDOW):
 
           FS - указывает весь экран или (1,19);
 
           H1 - указывает верхнюю половину экрана или (1,9);
 
           H2 - указывает нижнюю половину экрана или (11,9);
 
           H12 - указывает обе половины экрана или (1,19);
 
           Q1 - указывает верхнюю четверть экрана или (1,4);
 
           Q2 - указывает вторую четверть экрана или (6,4);
 
           Q3 - указывает третью четверть экрана или (11,4);
 
           Q4 - указывает нижнюю четверть экрана или (16,4);
 
           Q12 - указывает верхние две четверти экрана или (1,9);
 
           Q23 - указывает средние две четверти экрана или (6,9);
 
           Q34 - указывает нижние две четверти экрана или (11,9);
 
           Q123  -  указывает   верхние   три   четверти   экрана
 
      или (1,14);
 
           Q234  -   указывает   нижние   три   четверти   экрана
 
      или (6,14);
 
           Q1234  -  указывает   все   четыре   четверти   экрана
 
      или (1,19);
 
           T1 - указывает верхнюю треть экрана или (1,6);
 
           T2 - указывает среднюю треть экрана или (8,6);
 
           T3 - указывает нижнюю треть экрана или (15,5);
 
           T12 - указывает верхние две трети или (1,13);
 
           T23 - указывает нижние две трети или (8,12);
 
           T123 - все трети экрана или (1,19).


                                - 244 -
 
                          00152-01 34 07-1
 
 
           8.4.2. Использование определений собственных окон
 
 
           Хотя предопределенные окна  могут  подойти  почти  для
 
      любой ситуации, существует возможность  с  помощью  команды
 
      SET WINDOW создавать свои собственные определения окон. Эта
 
      команда имеет вид:
 
           SET WINDOW имя_окна AT (начальная_строка, коли-
 
                    чество_строк)  .
 
           Имя_окна - это имя определяемого окна.
 
           Начальная_строка  -  определяет  номер  первой  строки
 
      окна, т.е. верхнюю границу окна.
 
           Количество_строк  -  определяет  количество  текстовых
 
      строк в окне.
 
           Команда SET WINDOW не допускает квалификаторов.
 
           Для просмотра действующих определений окна использует-
 
      ся команда SHOW WINDOW. Эта команда выдает как окна,  опре-
 
      деленные отладчиком, так и окна,  определенные  пользовате-
 
      лем. Формат команды:
 
           SHOW WINDOW .
 
           Для отмены  определения  окна  служит  команда  CANCEL
 
      WINDOW следующего формата:
 
           CANCEL WINDOW [/квалификатор][имя_окна[,имя_окна...]].
 
           Эта  команда  удаляет  любые  определенные  отладчиком
 
      окна, а так же любые окна пользователя.  Параметр  имя_окна
 
      указывает удаляемое окно.  Команда  допускает  только  один
 
      квалификатор /ALL - удаления всех окон; в этом случае имена
 
      окон не указываются.
 


                                - 245 -
 
                          00152-01 34 07-1
 
 
           8.5. Изменение размеров экрана терминала
 
 
           Во время сеанса отладки может возникнуть необходимость
 
      изменить высоту или ширину экрана терминала. Одной из  при-
 
      чин может быть  необходимость  разместить  длинные  строки,
 
      которые "завернутся" на экране, если содержат более 80 сим-
 
      волов. Другой причиной может быть желание при работе с тер-
 
      минальной станцией переформатировать окно относительно дру-
 
      гих окон.
 
           Отладчик получает информацию о высоте и ширине  экрана
 
      при начале сеанса отладки и использует эту  информацию  при
 
      форматировании выходной информации на экран. Следовательно,
 
      если размер экрана меняется до вызова  отладчика  (командой
 
      SET TERMINAL командного языка DCL), то  отладчик  автомати-
 
      чески получает этот размер при инициализации  и  соответст-
 
      венно устанавливает размеры окна.
 
           С другой стороны, если размер экрана меняется во время
 
      сеанса отладки (например, выйдя на язык DCL и выдав  ту  же
 
      команду оператора SET TERMINAL), то отладчик  должен  полу-
 
      чить соответствующую информацию (с помощью команды отладчи-
 
      ка SET TERMINAL).
 
           Для терминалов типа VT100 или VT200 ширину экрана мож-
 
      но менять во время отладки простым переходом в режим  SETUP
 
      и изменением ширины или на 80 или  на  132  символа.  Таким
 
      образом, для этих терминалов типичной  формой  команды  SET
 
      TERMINAL    (при    ее    использовании)    является    SET
 
      TERMINAL/WIDTH:80 или SET TERMINAL/WIDTH:132.
 
           В более общем случае пользователь может менять  размер
 
      экрана, переходя на уровень DCL (командой SPAWN) и указывая
 
      команду оператора SET TERMINAL/PAGE:X/WIDTH:Y.  Этот  метод
 


                                - 246 -
 
                          00152-01 34 07-1
 
 
      особенно полезен для терминальных станций.
 
           Пример на рис.14 показывает, как можно изменить размер
 
      экрана терминальной станции во время сеанса отладки.  Пред-
 
      положим, что  терминальная  станция  использована  в  своем
 
      режиме по умолчанию эмуляции экрана VT100 с размером 24
 
      строки по 80  позиций.  Пользователь  вызвал отладчик и ис-
 
      пользует его в экранном режиме, как изображено на примере.
 
           Затем пользователь хочет увеличить размер экрана, что-
 
      бы использовать преимущество большего  экрана  терминальной
 
      станции. Для этого он использует переход на уровень  DCL  и
 
      команду изменения размера экрана:
 
      DBG>SPAWN SET TERMINAL/PAGE:35/WIDTH:110  .
 
           В результате размер окна стал больше. После возврата в
 
      отладчик необходимо сообщить ему об изменении:
 
      DBG>SET TERMINAL/PAGE:35/WIDTH:110  .
 
           Теперь кадр отладчика занимает весь размер окна  стан-
 
      ции (рис.15), как показано на рис.15.
 
           Следует помнить, что команда отладчика SET TERMINAL не
 
      меняет размер экрана, а меняет только форматирование.  Ква-
 
      лификатор /PAGE, указанный командой  отладчика,  устанавли-
 
      вает число строк на экране, которое используется отладчиком
 
      для "переделывания" предопределенных окон,  таких  как  Q1,
 
      T1, H1 и  т.д.  Квалификатор  /WIDTH  устанавливает  ширину
 
      экрана,  которую  отладчик  использует  для  форматирования
 
      экранной и другой выходной информации. Ни /PAGE, ни  /WIDTH
 
      динамически не изменяют  размер  экранных  кадров.  Поэтому
 
      после указанной  команды  необходимо  использовать  команду
 
      отладчика DISPLAY для просмотра этих кадров через вновь


                                - 247 -
 
                          00152-01 34 07-1
 
 
 
                  Начальный период работы с терминальной
 
                              станцией  (пример)
 
  +------------------------------------------------------------------------------+
  I                                                                              I
  I +--SRC----------------------------+    A                                     I
  I I                                 I    !                                     I
  I I                                 I    !                                     I
  I I                                 I    !                                     I
  I I                                 I    !                                     I
  I I--OUT----------------------------I    !                                     I
  I I                                 I    !                                     I
  I I                                 I  24 строки                               I
  I I                                 I    !                                     I
  I I                                 I    !                                     I
  I I---------------------------------I    !                                     I
  I I                                 I    !                                     I
  I I                                 I    !                                     I
  I +---------------------------------+    V                                     I
  I                                                                              I
  I                                                                              I
  I <--------80 позиций-------------------->                                     I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  +------------------------------------------------------------------------------+
 
 
                               Рис.14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


                                - 248 -
 
                          00152-01 34 07-1
 
 
 
                  Размер экрана после изменения  (пример)
 
  +------------------------------------------------------------------------------+
  I                                                                              I
  I +--SRC----------------------------------------------+    A                   I
  I I                                                   I    !                   I
  I I                                                   I    !                   I
  I I                                                   I    !                   I
  I I                                                   I    !                   I
  I I                                                   I    !                   I
  I I                                                   I    !                   I
  I I                                                   I    !                   I
  I I                                                   I    !                   I
  I I--OUT----------------------------------------------I    !                   I
  I I                                                   I                        I
  I I                                                   I  35 строк              I
  I I                                                   I                        I
  I I                                                   I    !                   I
  I I                                                   I    !                   I
  I I                                                   I    !                   I
  I I                                                   I    !                   I
  I I                                                   I    !                   I
  I I                                                   I    !                   I
  I I---------------------------------------------------I    !                   I
  I I                                                   I    !                   I
  I I                                                   I    !                   I
  I I                                                   I    !                   I
  I +---------------------------------------------------+    V                   I
  I                                                                              I
  I <---------------110 позиций------------------------->                        I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  +------------------------------------------------------------------------------+
 
 
                               Рис.15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


                                - 249 -
 
                          00152-01 34 07-1
 
 
      Oпределенные окна:
 
      DBG>DISPLAY SRC AT H1, OUT AT H2  .
 
           Для ввода предопределенных команд DISPLAY (см. подраз-
 
      дел 8.6) можно использовать комбинации  клавиш,  такие  как
 
      BLUE-MINUS. При этом экран устанавливается на новый размер.
 
           Область допустимых значений для /PAGE - от 11 до  100,
 
      для /WIDTH - от 20 до 255. Для  просмотра  текущей  ширины,
 
      используемой отладчиком, применяется команда SHOW TERMINAL.
 
 
 
           8.6. Использование клавиш малой клавиатуры  для  ввода
 
      команд
 
 
           Команды отладчика можно вводить, набирая их на клавиа-
 
      туре терминала. Кроме того, можно использовать малую  (циф-
 
      ровую) клавиатуру для ввода команд одним нажатием  (опреде-
 
      ленных) клавиш. Применение малой клавиатуры для ввода  наи-
 
      более общих команд уменьшает время набора этих команд.
 
           После вызова  отладчика  он  предопределяет  некоторые
 
      функции (команды, последовательности  команд,  ограничители
 
      команд) для клавиш малой клаватуры. Например, нажатие  кла-
 
      виши "запятая" (,) эквивалентно набору команды GO и  после-
 
      дующего нажатия клавиши RETURN.  Кроме  того,  пользователь
 
      может с помощью команды DEFINE/KEY определить  для  клавиши
 
      новые функции, (раздел 9).
 
           Использование  клавиш  малой  клавиатуры  для   команд
 
      отладчика (как предопределенных, так и определенных пользо-
 
      вателем) требует разрешения режима работы с малой клавиату-
 
      рой (командой SET MODE KEYPAD). Режим работы с  малой  кла-
 
      виатурой является разрешенным после вызова отладчика.  Если
 
      необходимо запретить  режим  работы  с  малой  клавиатурой,
 


                                - 250 -
 
                          00152-01 34 07-1
 
 
      может быть по причине использования этих клавиш самой отла-
 
      живаемой программой, то необходимо ввести команду SET  MODE
 
      NOKEYPAD.
 
           Функции  клавиш  малой  клавиатуры,   предопределенные
 
      отладчиком, приведены в табл.3. Легко заметить,  что  боль-
 
      шинство  этих  функций  используется  для   манипулирования
 
      экранными кадрами в экранном режиме. Естественно,  что  для
 
      использования команд экранного режима необходимо этот режим
 
      разрешить нажатием клавиши малой клавиатуры PF3  (SET  MODE
 
      SCREEN).
 
                                                        Таблица 3
 
           Функции клавиш малой клавиатуры, предопределяемые
 
                              отладчиком
 
      -----------------------------------------------------------
             I
        Имя  I          Выполняемая функция
             I
      клавишиI---------------------------------------------------
             I                 I                 I
             I  DEFAULT        I     GOLD        I     BLUE
             I                 I                 I
      -----------------------------------------------------------
             I                 I                 I
      PF1    I GOLD            I GOLD            IGOLD
             I                 I                 I
      PF2    I HELP DEFAULT    I HELP GOLD       IHELP BLUE
             I                 I                 I
      PF3    I SET MODE SCREEN I SET MODE NOSCR  IDISP/GENERATE
             I                 I                 I
      PF4    I BLUE            I BLUE            IBLUE
             I                 I                 I
      KP1(1) I EXAMINE         I EXAM^(PPEV)     I
             I                 I                 I
      KP2(2) I SCROLL/DOWN     I SCROLL/BOTTOM   ISCROLL/DOWN *
             I                 I                 I
      KP3(3) I SEL/SCROLL NEXT I SEL/OUT NEXT    ISEL/SOURCE NEXT
             I                 I                 I
      KP4(4) I SCROLL/LEFT     I SCROLL/LEFT:132 ISCROLL/LEFT *
             I                 I                 I
      KP5(5) I EX/SOU .0\%PC   I SHOW CALLS      ISHOW CALLS 3
             I                 I                 I
      KP6(6) I SCROLL/RIGHT    I                 ISCROLL/RIGHT *
             I                 I                 I
      KP7(7) IDISP SRC,OUT,INSTI DISP INST,OUT   IDISP REG,OUT
             I                 I                 I
      KP8(8) I SCROLL/UP       I SCROLL/TOP      ISCROLL/UP *


                                - 251 -
 
                          00152-01 34 07-1
 
 
                                              Продолжение табл. 3
      -----------------------------------------------------------
             I
        Имя  I          Выполняемая функция
             I
      клавишиI---------------------------------------------------
             I                 I                 I
             I  DEFAULT        I     GOLD        I     BLUE
             I                 I                 I
      -----------------------------------------------------------
             I                 I                 I
      KP9(9) I DISPLAY NEXT    I                 I
             I                 I                 I
      KP0(0) I STEP            I STEP/INTO       ISTEP/OVER
             I                 I                 I
      COMMA  I GO              I                 ISEL/INST NEXT
             I                 I                 I
      PERIOD I RESET           I RESET           IRESET
             I                 I                 I
      MINUS  I DISP NEXT AT FS I                 IDISP SRC,OUT
             I                 I                 I
      ENTER  I ввод            I ввод            Iввод
 
 
           Примечания:
 
           1. * означает,  что  нажатие  клавиши  не  заканчивает
 
      команду. Необходим параметр.
 
           2. Обозначения  KP0,KP1,...,KP9,  PF1,...PF4,  PERIOD,
 
      COMMA, MINUS, ENTER - это имена  клавиш  малой  клавиатуры,
 
      которые используются с  командами  DEFINE/KEY,  DELETE/KEY,
 
      SHOW KEY.
 
           3. Для получения более полной информации о предопреде-
 
      ленных функциях  необходимо  задать  команды  SHOW  KEY/ALL
 
      (функция   по   умолчанию),   SHOW    KEY/ALL/STATE    GOLD
 
      (GOLD-функция) и SHOW KEY/ALL/STATE BLUE (BLUE-функция).
 
           Одна клавиша малой клавиатуры может выполнять до  трех
 
      предопределенных функций:
 
           1) первая функция выполняется при нажатии самой клави-
 
      ши. Такие функции называются DEFAULT-функциями или функция-
 
      ми по умолчанию;
 
           2) вторая функция вводится  нажатием  клавиши  PF1,  а
 
      затем   данной   клавиши.    Такие    функции    называются


                                - 252 -
 
                          00152-01 34 07-1
 
 
      GOLD-функциями, потому что клавиша PF1 еще называется и как
 
      GOLD-клавиша;
 
           3) третья функция вводится  нажатием  клавиши  PF4,  а
 
      затем данной. Она называется BLUE-функцией по названию кла-
 
      виши PF4 - BLUE.
 
           Например, нажатием клавиши малой клавиатуры 2 вводится
 
      команда  SCROLL/DOWN  (DEFAULT-функция);  нажатием  клавиши
 
      PF1, а  затем  клавиши  2  вводится  команда  SCROLL/BOTTOM
 
      (GOLD-функция); нажатием PF4, а затем  той  же  клавиши  2-
 
      незавершенная команда SCROLL/DOWN (BLUE-функция).
 
           Команды,(см. табл.3) которые не помечены справа  звез-
 
      дочкой (*), являются завершенными  (выполняются  немедленно
 
      после нажатия клавиши). Команды, помеченные звездочкой  (*)
 
      (см. табл.3), требуют параметра. Пользователь  должен  ука-
 
      зать параметр, а затем нажать клавишу "возврат каретки" для
 
      завершения команды. Например, для  прокрутки  кадра  на  12
 
      строк вниз нужно нажать PF4, затем клавишу малой  клавиату-
 
      ры 2, затем :12 на основной клавиатуре, после чего - клави-
 
      шу "возврат каретки".
 
           Получение справки (HELP) по клавишным функциям  дости-
 
      гается нажатием PF2: как ее одной, так и  с  клавишами  PF1
 
      или PF4. Так для получения справки о функциях по  умолчанию
 
      нажимается PF4 (функции по умолчанию известны  так  же  как
 
      бесцветные (NOCOLOR) функции в отличие от GOLD - золотых  и
 
      BLUE  -  голубых  функций),  для   получения   справки   по
 
      GOLD-функциям - PF1 и PF2.
 
           В табл.4 перечислены все клавиши  малой  клавиатуры  и
 
      детально описаны предопределенные  функции.  Имена  клавиш,
 
      перечисленные в этой таблице (например, PF1,  COMMA,  KP3),
 
      используются в командах DEFINE/KEY, DELETE/KEY,  SHOW  KEY.


                                - 253 -
 
                          00152-01 34 07-1
 
 
      Любая клавиша, функция которой  не  определена  отладчиком,
 
      доступна для определения пользователем. Кроме того, предоп-
 
      ределенные функции можно переопределить.
 
                                                        Таблица 4
 
                 Предопределенные функции малой клавиатуры
 
      -----------------------------------------------------------
             I
      КлавишаI                  Функция
             I
      -----------------------------------------------------------
             I
      PF1    I  Позволяет использовать GOLD-функцию любой другой
             I
             I клавиши, если такая существует. Сначала нажимается
             I
             I клавиша GOLD, затем любая другая, связанная с ко-
             I
             I мандой отладчика
             I
      PF2    I  Выдает справку о функциях по умолчанию малой кла-
             I
             I виатуры (HELP KEYPAD DEFAULT или, что то же самое,
             I
             I HELP KEYPAD NOCOLOR). Показывает диаграмму клавиа-
             I
             I туры и соответствующие предопределенные функции по
             I
             I умолчанию. Эта команда является завершенной и вы-
             I
             I водится на экран
             I
      GOLD   I  Выдает команду HELP KEYPAD GOLD. Показывает диа-
             I
       PF2   I грамму малой клавиатуры и связанные с ней предо-
             I
             I пределенные GOLD-функции. Команда является завер-
             I
             I шенной и выводится на экран
             I
      BLUE   I  Выдает команду HELP KEYPAD BLUE. Показывает диа-
             I
      PF2    I грамму малой клавиатуры и связанные с ней предо-
             I
             I пределенные BLUE-функции. Команда является завер-
             I
             I шенной и выводится на экран
             I
      PF3    I  Выдает команды SET MODE SCREEN и SET STEP SOURCE.
             I
             I Устанавливает экранный режим и подавляет вывод
             I
             I исходного текста, который обычно появляется в кад-
             I
             I ре выходной информации (поскольку эта информация


                                - 254 -
 
                          00152-01 34 07-1
 
 
                                              Продолжение табл. 4
      -----------------------------------------------------------
             I
      КлавишаI                  Функция
             I
      -----------------------------------------------------------
             I
             I
             I является излишней при наличии кадра исходного
             I
             I текста). Эти команды являются законченными (не
             I
             I требующими других действий оператора-пользователя)
             I
             I и выводятся на экран
             I
      GOLD   I  Выдает команду SET MODE NOSCREEN, которая отменя-
             I
      PF3    I ет экранный режим
             I
      BLUE   I  Выдает команду DISPLAY/GENERATE, которая восста-
             I
      PF3    I навливает все автоматически корректируемые экран-
             I
             I ные кадры (только в экранном режиме)
             I
      PF4    I  Позволяет использовать BLUE-функции других кла-
             I
             I виш, если такие существуют. Сначала нажимается
             I
             I PF4, а затем любая другая, связанная с командой
             I
             I отладчика
             I
      KP7    I  Выдает команды DISPLAY SRC AT T1, INST AT T2, OUT
             I
             I AT T3; SELECT/SCROLL/SOURCE SRC; SELECT/INSTRUC-
             I
             I TION INST; SELECT/OUTPUT OUT, в результате которых
             I
             I предопределенный кадр SRC отображается в верхней
             I
             I трети экрана, предопределенный кадр INST - во вто-
             I
             I рой трети,предопределенный кадр OUT - в нижней
             I
             I трети экрана. При этом кадр SRC является прокручи-
             I
             I ваемым. Перечисленные команды являются завершенны-
             I
             I ми. На экране не высвечиваются (только для экран-
             I
             I ного режима)
             I
      GOLD   I  Выдает команды DISPLAY INST AT H1, OUT AT N2;
             I
      KP7    I SELECT/SCROLL/INSTRUCTION INST;
             I
             I SELECT/OUTPUT OUT, в результате


                                - 255 -
 
                          00152-01 34 07-1
 
 
                                              Продолжение табл. 4
      -----------------------------------------------------------
             I
      КлавишаI                  Функция
             I
      -----------------------------------------------------------
             I
             I
             I которых предопределенные кадры INST и OUT отобра-
             I
             I жаются соответственно в верхней и нижней половинах
             I
             I экрана, при этом кадр INST являетсяя прокручивае-
             I
             I мым. Другими словами, данная клавиша восстанавли-
             I
             I вает обычное состояние экрана для языка макро. Пе-
             I
             I речисленный набор команд является завершенным и на
             I
             I экран не выдается (только для экранного режима)
             I
      BLUE   I  Выдает команду DISPLAY REG AT Q3, OUT AT Q4, в
             I
      KP7    I результате которой предопределенный кадр REG ото-
             I
             I бражается в третьей четверти экрана, предопреде-
             I
             I ленный кадр OUT в нижней четверти. Эта команда
             I
             I является завершенной, на экране не отображается
             I
             I (только для экранного режима)
             I
      KP8    I  Выдает команду SCROLL/UP, в результате чего окно
             I
             I перемещается вверх над текстом текущего прокручи-
             I
             I ваемого кадра для показа дальнейшего текста кадра.
             I
             I Команда завершенная, на экране не отображается
             I
             I (только для экранного режима)
             I
      GOLD   I  Выдает команду SCROLL/TOP, в результате которой в
             I
      KP8    I окне устанавливается текст начала прокручиваемого
             I
             I кадра. Команда завершенная, на экране не отобража-
             I
             I ется (только для экранного режима)
             I
      BLUE   I  Выдает команду SCROLL/UP *, в результате которой
             I
      KP8    I окно перемещается по текту прокручиваемого кадра.
             I
             I т.к. данная команда не завершенная, то можно или
             I
             I указать количество (:N) прокручиваемых вверх строк


                                - 256 -
 
                          00152-01 34 07-1
 
 
                                              Продолжение табл. 4
      -----------------------------------------------------------
             I
      КлавишаI                  Функция
             I
      -----------------------------------------------------------
             I
             I
             I или указать имя прокручиваемого кадра (только для
             I
             I экранного режима)
             I
      KP9    I  Выдает команду DISPLAY %NEXTDISP, которая отобра-
             I
             I жает следующий кадр из списка. Команда завершен-
             I
             I ная, на экран не выдается. Повторное нажатие кла-
             I
             I виши приводит к циклическому просмотру всех неу-
             I
             I даленных с экрана кадров по очереди. (только для
             I
             I экранного режима)
             I
      MINUS  I  Выдает команды DISPLAY %NEXTDISP AT FS; SELECT/
             I
             I SCROLL %CURDISP, в результате чего следующий из
             I
             I списка кадр отображается на весь экран, закрывая
             I
             I все другие кадры, наблюдаемые в текущий момент.
             I
             I Этот кадр становится текущим прокручиваемым. Пов-
             I
             I торное использование клавиши позволяет циклически
             I
             I пройти по списку кадров, отображая каждый из них
             I
             I на полный экран. Команды - завершенные.
             I
             I на экран не выдаются
             I
      BLUE   I  Выдает команды DISPLAY SRC AT H1, OUT AT H2;
             I
      MINUS  I SELECT/SCROLL/SOURCE SRC; SELECT/OUTPUT OUT, в
             I
             I результате чего предопределенные кадры SRC и OUT
             I
             I отображаются соответственно в верхней и нижней по-
             I
             I ловинах экрана, при этом кадр SRC становится те-
             I
             I кущим прокручиваемым кадром. Данная клавиша вос-
             I
             I станавливает обычное состояние экрана для всех
             I
             I языков, кроме макро. Команды - завершенные, на
             I
             I экран не отображаются (только для экранного


                                - 257 -
 
                          00152-01 34 07-1
 
 
                                              Продолжение табл. 4
      -----------------------------------------------------------
             I
      КлавишаI                  Функция
             I
      -----------------------------------------------------------
             I
             I
             I режима)
             I
      KP4    I  Выдает команду SCROLL/LEFT, в результате которой
             I
             I окно смещается влево на восемь позиций по текущему
             I
             I прокручиваемому кадру для показа текста за левой
             I
             I границей. Команда завершенная, на экран не выдает-
             I
             I ся (только для экранного режима)
             I
      GOLD   I  Выдает команду SCROLL/LEFT:132, которая возвраща-
             I
      KP4    I ет окно в исходное положение Oтносительно текуще-
             I
             I го прокручиваемого кадра (после возможного преды-
             I
             I дущего смещения вправо). Команда завершенная, на
             I
             I экран не выдается (только для экранного режима)
             I
      BLUE   I  Выдает команду SCROLL/LEFT*, которая позволяет
             I
      KP4    I сместить окно влево по кадру, для просмотра текста
             I
             I за левой границей. Команда незавершенная, поэтому
             I
             I необходимо либо задать количество позиций смещения
             I
             I (:N), либо указать имя кадра. Нельзя прокручивать
             I
             I за первую позицию (только для экранного режима)
             I
      KP5    I  Выдает команды EXAMINE/SOURCE.%SOURCE_SCOPE\%PC;
             I
             I EXAMINE/INSTRUCTION. 0\%PC, которые позволяют уви-
             I
             I деть исходную строку и команду программы, кото-
             I
             I рые будут выполняться следующими. В экранном режи-
             I
             I ме исходная строка, которая будет выполняться сле-
             I
             I дующей, располагается по центру текущего кадра
             I
             I исходного текста, а команда программы, выполняе-
             I
             I мая следующей,- в центре текущего кадра команд
             I
             I АССЕМБЛЕРА. Указанный набор команд не требует


                                - 258 -
 
                          00152-01 34 07-1
 
 
                                              Продолжение табл. 4
      -----------------------------------------------------------
             I
      КлавишаI                  Функция
             I
      -----------------------------------------------------------
             I
             I
             I дополнительных действий пользователя и на экран не
             I
             I выводится
             I
      GOLD   I  Выдает команду SHOW CALLS, которая отображает
             I
      KP5    I информацию о последовательности текущих процедур-
             I
             I ных вызовов. Команда является завершенной, выво-
             I
             I дится на экран
             I
      BLUE   I  Выдает команду SHOW CALLS 3, которая отображает
             I
      KP5    I информацию о трех последних вызовах процедур. Эта
             I
             I информация достаточно небольшая и помещается в ок-
             I
             I не размером в четверть экрана. Команда является
             I
             I завершенной, выводится на экран
             I
      KP6    I  Выдает команду SCROLL/RIGHT, которая смещает окно
             I
             I вправо на восемь позиций над текущим прокручивае-
             I
             I мым кадром для просмотра текста за правой грани-
             I
             I цей. Команда является завершенной, на экран не вы-
             I
             I дается (только для экранного режима)
             I
      BLUE   I  Выдает команду SCROLL/RIGHT *, позволяющую сме-
             I
      KP6    I щать окно вправо по кадру. Поскольку команда явля-
             I
             I ется незавершенной, необходимо указать или число
             I
             I позиций смещения (:N), или имя кадра. Нельзя сме-
             I
             I щать за позицию 132 (только для экранного режима)
             I
      COMMA  I  Выдает команду GO, которая начинает или продолжа-
             I
             I ет выполнение программы. Команда является завер-
             I
             I шенной и выводится на экран
             I
      BLUE   I  Выдает команду SELECT/INSTRUCTION %NEXTINST,
             I
      COMMA  I позволяющую выбрать следующий из списка кадр ко-


                                - 259 -
 
                          00152-01 34 07-1
 
 
                                              Продолжение табл. 4
      -----------------------------------------------------------
             I
      КлавишаI                  Функция
             I
      -----------------------------------------------------------
             I
             I
             I манд АССЕМБЛЕРА в качестве текущего кадра для ко-
             I
             I манд EXAMINE/INSTRUCTION. Команда является
             I
             I завершенной, на экран не выдается. Повторное
             I
             I использование клавиши позволяет пройти в цикле по
             I
             I всему списку для получения требуемого кадра (толь-
             I
             I ко для экранного режима)
             I
      KP1    I  Выдает команду EXAMINE, которая позволяет прос-
             I
             I мотреть логический преемник текущего об'екта, если
             I
             I такой определен. В действительности она выдает
             I
             I следующую ячейку. Команда является завершенной,
             I
             I выводится на экран
             I
      GOLD   I  Выдает команду EXAMINE^, позволяющую просмотреть
             I
      KP1    I логический предшественник текущего об'екта, если
             I
             I такой определен. В действительности она выдает
             I
             I предыдущую ячейку. Команда является завершенной,
             I
             I выводится на экран
             I
      KP2    I  Выдает команду SCROLL/DOWN, сдвигающую окно вниз
             I
             I по тексту кадра. Команда является завершенной, на
             I
             I экан не выдается (только для экранного режима).
             I
      GOLD   I  Выдает команду SCROLL/BOTTOM, устанавливающую ок-
             I
      KP2    I но на конец текста текущего прокручиваемого кадра.
             I
             I команда является завершенной, на экран не выдается
             I
             I (только для экранного режима)
             I
      BLUE   I  Выдает команду SCROLL/DOWN *, смещающую окно вниз
             I
      KP2    I по тексту кадра. Т.к. команда незавершенная, необ-
             I
             I ходимо указать или количество сдвигаемых строк


                                - 260 -
 
                          00152-01 34 07-1
 
 
                                              Продолжение табл. 4
      -----------------------------------------------------------
             I
      КлавишаI                  Функция
             I
      -----------------------------------------------------------
             I
             I
             I (:N), или имя сдвигаемого кадра (только для экран-
             I
             I ного режима)
             I
      KP3    I  Выдает команду SELECT/SCROLL %NEXTSCROLL, позво-
             I
             I ляющую выбрать следующий из списка кадр в качестве
             I
             I текущего прокручиваемого кадра. Команда является
             I
             I завершенной, на экран не выдается. Повторное
             I
             I использование данной клавиши позволяет пройти в
             I
             I цикле по всему списку для выбора необходимого кад-
             I
             I ра (только для экранного режима)
             I
      GOLD   I  Выдает команду SELECT/OUTPUT %NEXTOUTPUT, которая
             I
      KP3    I выбирает следующий из списка кадр выходной инфор-
             I
             I мации для занесения в него выходной информации ко-
             I
             I манд отладчика. Команда является завершенной, на
             I
             I экран не выдается. Повторное использование данной
             I
             I клавиши позволяет пройтись в цикле по списку для
             I
             I выбора требуемого кадра выходной информации (толь-
             I
             I ко для экранного режима)
             I
      BLUE   I  Выдает команду SELECT/SOURCE %NEXTSOURCE, позво-
             I
      KP3    I ляющую назначить следующий по списку кадр исходно-
             I
             I го текста в качестве текущего для команд отладчика
             I
             I TYPE и EXAMINE/SOURCE. Команда является завершен-
             I
             I ной, на экран не выдается. Повторное использование
             I
             I клавиши дает возможность пройти в цикле по списку
             I
             I для выбора необходимого кадра исходного текста
             I
             I (только для экранного режима)
             I
      ENTER  I  Позволяет вводить (или завершать) команду. Имеет


                                - 261 -
 
                          00152-01 34 07-1
 
 
                                              Продолжение табл. 4
      -----------------------------------------------------------
             I
      КлавишаI                  Функция
             I
      -----------------------------------------------------------
             I
             I
             I тот же эффект, что и клавиша "возврат каретки"
             I
      KP0    I  Выдает команду STEP, по которой выполняется сле-
             I
             I дующая строка или команда программы, в зависимости
             I
             I от текущих условий пошагового выполнения. Команда
             I
             I является завершенной, выводится на экран
             I
      GOLD   I  Выдает команду STEP/INTO, разрешающую вход в вы-
             I
      KP0    I зываемые подпрограммы. Команда является завершен-
             I
             I ной, выдается на экран
             I
      BLUE   I  Выдает команду STEP/OVER, которая запрещает про-
             I
      KP0    I хождение через вызываемые подпрограммы (отладчик
             I
             I "перешагивает" через подпрограммы). Команда явля-
             I
             I ется завершенной, выдается на экран
             I
      PERIOD I  Отменяет действие клавиш GOLD или BLUE, нажатых
             I
             I по ошибке. На экране не отображается
             I
      CTRL/W I  Выдает команду DISPLAY/REFRESH, устанавливающую
             I
             I экран в исходное состояние. Команда является за-
             I
             I вершенной, на экран не выдается. (Только для
             I
             I экранного режима)
 
 
 
 
           8.7. Пример использования экранного режима
 
 
           В данном подразделе иллюстрируется отладка в  экранном
 
      режиме фрагмента программы на ФОРТРАНЕ.
 


                                - 262 -
 
                          00152-01 34 07-1
 
 
           8.8. Пример сеанса отладки в экранном режиме
 
 
           Приводимый пример иллюстрирует  отладку  программы  на
 
      ФОРТРАНЕ и показывает некоторые команды,  используемые  при
 
      работе в экранном режиме. Здесь же даны иллюстрации изобра-
 
      жения исходного кода программы и выхода отладчика в предоп-
 
      ределенных кадрах SRC и OUT соответственно.
 
           Итак, есть программа на фортране, содержащая ошибку:
 
      1:       INTEGER INARR(20), OUTARR(20)
 
      2: C
 
      3: C     ---Прочитать входной массив из файла
 
      4:       OPEN(UNIT=8,FILE='DATAFILE.DAT',STATUS='OLD')
 
      5:       READ(8,*) N,(INARR(I),I=1,N)
 
      6: C
 
      7: C     ---Квадраты ненулевых элементов поместить
 
               в выходной массив
 
      8:       K=0
 
      9:       DO 10 I=1,N
 
      10:       IF(INARR(I) .NE.0) THEN
 
      11:           OUTARR(K)=INARR(I)**2
 
      12:       ENDIF
 
      13:    10 CONTINUE
 
      14: C
 
      15: C     ---Распечатать выходные значения. Останов
 
      16:       PRINT 20,K
 
      17:    20 FORMAT ('число ненулевых элементов равно',I4)
 
      18:       DO 40 I=1,K
 
      19:       PRINT 30,I,OUTARR(I)
 
      20:    30 FORMAT ('элемент',14,'имеет значение',I6)
 
      21:    40 CONTINUE
 


                                - 263 -
 
                          00152-01 34 07-1
 
 
      22:       END
 
           Программа считывает последовательность целых чисел  из
 
      файла данных (строки 4,5)  и  сохраняет  в  массиве  INARR.
 
      Затем идет цикл (строки с 8 по 13), где возводятся в  квад-
 
      рат все ненулевые элементы  исходной  последовательности  и
 
      помещаются в массив OUTARR.  И  наконец,  печатается  число
 
      ненулевых элементов и квадраты каждого из  таких  элементов
 
      (строки с 16 по 21).
 
           Ошибка состоит в том, что переменная к, являясь  теку-
 
      щим индексом для OUTARR, не меняется (строки с  9  по  13).
 
      Следовало бы ввести выражение К=К+1 не ниже 11 строки.
 
           Для нахождения ошибки делается компиляция,  компоновка
 
      и запуск программы:
 
      $FORT/DEBUG/NOOPTIMIZE FORSQUARE
 
      $LINK/DEBUG FORSQUARE
 
      $RUN FORSQUARE
 
           Чтобы упростить отладку, следует отменить оптимизацию,
 
      осуществляемую компилятором ФОРТРАНА, с помощью  квалифика-
 
      тора /NOOPTIMIZE. После перечисленных  команд  на  терминал
 
      выдастся сообщение:
 
                   M32 SM DEBUG версия 1.0
 
      %DEBUG-I-INITIAL,LANGUAGE IS FORTRAN, MODULE SET
 
                       TO 'FORSQUARE$MAIN'
 
      DBG>
 
           Теперь можно вводить команды  отладчика.  Для  задания
 
      экранного режима нажимается клавиша PF3, в результате  чего
 
      вводится команда SET MODE SCREEN, а затем команда SET  STEP
 
      NOSOURCE. По первой команде в верхней половине экрана  рас-
 
      полагается кадр SRC, в нижней кадр OUT,  которые  считаются
 
      текущими кадрами исходного  текста  и  выходной  информации


                                - 264 -
 
                          00152-01 34 07-1
 
 
      соответственно. Команда SET STEP NOSOURCE  подавляет  вывод
 
      исходного текста в кадр выходной информации (поскольку  эта
 
      информация является излишней, т.к. имеется  кадр  исходного
 
      текста).
 
           В результате всего экран терминала  содержит  информа-
 
      цию, показанную на рис.16.
 
           Следует заметить, что команды, соответствующие нажатию
 
      PF3, отражаются на экран.
 
           Для  продвижения  вперед  на  четыре  строки  вводится
 
      команда:
 
      DBG>STEP 4
 
           В  результате  экран  принимает  вид,  показанный   на
 
      рис.17.
 
           Для просмотра переменных N и K (для контроля их  теку-
 
      щих значений) вводится команда:
 
      DBG>EXAM N,K
 
           Информация на экране после этого имеет вид, показанный
 
      на рис.18.
 
           В этой точке выполнения программы N и K имеют правиль-
 
      ные значения.
 
           Введем далее команду STEP 2 для входа в цикл, где все
 
      ненулевые элементы INARR возводятся в квадрат и копируются
 
      в OUTARR. Счетчик команд указывает строку 11, а в кад-
 
      ре OUT появляется сообщение о переходе к этой строке,  как
 
      видно на рис.19.
 
           Вводим команду EXAM I,K, чтобы увидеть ожидаемые  зна-
 
      чения I,K. На кадре OUT рис.20 видно, что  I  имеет  значе-
 
      ние 1, как и ожидалось, в то время как K имеет нулевое зна-
 
      чение, чего не должно быть. Теперь видна ошибка в  програм-
 
      ме: K должно быть увеличено до использования в строке 11.


                                - 265 -
 
                          00152-01 34 07-1
 
 
 
                  Информация на экране при запуске
 
                      экранного режима  (пример)
 
  +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
  I                                                                              I
  I->   1:       INTEGER INARR(20), OUTARR(20)                                   I
  I                                                                              I
  I     2: C                                                                     I
  I                                                                              I
  I     3: C     ---Прочитать входной массив из файла.                           I
  I                                                                              I
  I     4:       OPEN(UNIT=8, FILE='DATAFILE.DAT', STATUS='OLD')                 I
  I                                                                              I
  I     5:       READ(8,*) N, (INARR(I), I=1,N)                                  I
  I                                                                              I
  I     6: C                                                                     I
  I                                                                              I
  I     7: C     ---Квадраты ненулевых элементов поместить в выходной массив.    I
  I                                                                              I
  I     8:       K = 0                                                           I
  I                                                                              I
  I     9:       DO 10 I = 1, N                                                  I
  I                                                                              I
  I--OUT---OUTPUT----------------------------------------------------------------I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I------------------------------------------------------------------------------I
  I                                                                              I
  I%DEBUG-I-INITIAL, LANGUAGE IS FORTRAN, MODULE SET TO 'FORSQUARE$MAIN'         I
  I                                                                              I
  IDBG> SET MODE SCREEN; SET STEP NOSOURCE                                       I
  I                                                                              I
  IDBG>                                                                          I
  I                                                                              I
  +------------------------------------------------------------------------------+
 
 
                               Рис. 16
 
 


                                - 266 -
 
                          00152-01 34 07-1
 
 
 
                   Информация на экране после команды STEP 4  (пример)
 
  +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
  I                                                                              I
  I     5:       READ(8,*) N, (INARR(I), I=1,N)                                  I
  I                                                                              I
  I     6: C                                                                     I
  I                                                                              I
  I     7: C     ---Квадраты ненулевых элементов поместить в выходной массив.    I
  I                                                                              I
  I     8:       K = 0                                                           I
  I                                                                              I
  I->   9:       DO 10 I = 1, N                                                  I
  I                                                                              I
  I    10:       IF(INARR(I) .NE. 0) THEN                                        I
  I                                                                              I
  I    11:           OUTARR(K) = INARR(I)**2                                     I
  I                                                                              I
  I    12:       ENDIF                                                           I
  I                                                                              I
  I    13:    10 CONTINUE                                                        I
  I                                                                              I
  I--OUT---OUTPUT----------------------------------------------------------------I
  I                                                                              I
  ISTEPPED TO FORSQUARE$MAIN\%LINE 9                                             I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I------------------------------------------------------------------------------I
  I                                                                              I
  IDBG> SET MODE SCREEN; SET STEP NOSOURCE                                       I
  I                                                                              I
  IDBG> STEP 4                                                                   I
  I                                                                              I
  IDBG>                                                                          I
  I                                                                              I
  +------------------------------------------------------------------------------+
 
 
                               Рис. 17
 
 
 
 
 


                                - 267 -
 
                          00152-01 34 07-1
 
 
 
                   Информация на экране после команды EXAMINE N,K  (пример)
 
  +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
  I                                                                              I
  I     5:       READ(8,*) N, (INARR(I), I=1,N)                                  I
  I                                                                              I
  I     6: C                                                                     I
  I                                                                              I
  I     7: C     ---Квадраты ненулевых элементов поместить в выходной массив.    I
  I                                                                              I
  I     8:       K = 0                                                           I
  I                                                                              I
  I->   9:       DO 10 I = 1, N                                                  I
  I                                                                              I
  I    10:       IF(INARR(I) .NE. 0) THEN                                        I
  I                                                                              I
  I    11:           OUTARR(K) = INARR(I)**2                                     I
  I                                                                              I
  I    12:       ENDIF                                                           I
  I                                                                              I
  I    13:    10 CONTINUE                                                        I
  I                                                                              I
  I--OUT---OUTPUT----------------------------------------------------------------I
  I                                                                              I
  ISTEPPED TO FORSQUARE$MAIN\%LINE 9                                             I
  I                                                                              I
  IFORSQUARE$MAIN\N:       9                                                     I
  I                                                                              I
  IFORSQUARE$MAIN\K:       0                                                     I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I------------------------------------------------------------------------------I
  I                                                                              I
  IDBG> STEP 4                                                                   I
  I                                                                              I
  IDBG> EXAM N, K                                                                I
  I                                                                              I
  IDBG>                                                                          I
  I                                                                              I
  +------------------------------------------------------------------------------+
 
 
                               Рис. 18
 
 
 
 
 


                                - 268 -
 
                          00152-01 34 07-1
 
 
 
                   Информация на экране после команды STEP 2  (пример)
 
  +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
  I                                                                              I
  I     7: C     ---Квадраты ненулевых элементов поместить в выходной массив.    I
  I                                                                              I
  I     8:       K = 0                                                           I
  I                                                                              I
  I     9:       DO 10 I = 1, N                                                  I
  I                                                                              I
  I    10:       IF(INARR(I) .NE. 0) THEN                                        I
  I                                                                              I
  I->  11:           OUTARR(K) = INARR(I)**2                                     I
  I                                                                              I
  I    12:       ENDIF                                                           I
  I                                                                              I
  I    13:    10 CONTINUE                                                        I
  I                                                                              I
  I    14: C                                                                     I
  I                                                                              I
  I    15: C     ---Распечатать выходные значения. Останов.                      I
  I                                                                              I
  I--OUT---OUTPUT----------------------------------------------------------------I
  I                                                                              I
  ISTEPPED TO FORSQUARE$MAIN\%LINE 9                                             I
  I                                                                              I
  IFORSQUARE$MAIN\N:       9                                                     I
  I                                                                              I
  IFORSQUARE$MAIN\K:       0                                                     I
  I                                                                              I
  ISTEPPED TO FORSQUARE$MAIN\%LINE 11                                            I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I------------------------------------------------------------------------------I
  I                                                                              I
  IDBG> EXAM N, K                                                                I
  I                                                                              I
  IDBG> STEP 2                                                                   I
  I                                                                              I
  IDBG>                                                                          I
  I                                                                              I
  +------------------------------------------------------------------------------+
 
 
                                Рис. 19
 
 
 
 
 


                                - 269 -
 
                          00152-01 34 07-1
 
 
 
                    Информация на экране после команды SET TRACE  (пример)
 
   +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
   I                                                                              I
   I     7: C     ---Квадрты ненулевых элементов поместить в выходной массив.     I
   I                                                                              I
   I     8:       K = 0                                                           I
   I                                                                              I
   I     9:       DO 10 I = 1, N                                                  I
   I                                                                              I
   I    10:       IF(INARR(I) .NE. 0) THEN                                        I
   I                                                                              I
   I->  11:           OUTARR(K) = INARR(I)**2                                     I
   I                                                                              I
   I    12:       ENDIF                                                           I
   I                                                                              I
   I    13:    10 CONTINUE                                                        I
   I                                                                              I
   I    14: C                                                                     I
   I                                                                              I
   I    15: C     ---Распечатать выходные значения. Останов.                      I
   I                                                                              I
   I--OUT---OUTPUT----------------------------------------------------------------I
   I                                                                              I
   ISTEPPED TO FORSQUARE$MAIN\%LINE 9                                             I
   I                                                                              I
   IFORSQUARE$MAIN\N:       9                                                     I
   I                                                                              I
   IFORSQUARE$MAIN\K:       0                                                     I
   I                                                                              I
   ISTEPPED TO FORSQUARE$MAIN\%LINE 11                                            I
   I                                                                              I
   IFORSQUARE$MAIN\I:       1                                                     I
   I                                                                              I
   IFORSQUARE$MAIN\K:       0                                                     I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I------------------------------------------------------------------------------I
   I                                                                              I
   IDBG> DEPOSIT K = 1                                                            I
   I                                                                              I
   IDBG> SET TRACE/SILENT %LINE 11 DO(DEPOSIT K = K + 1)                          I
   I                                                                              I
   IDBG>                                                                          I
   I                                                                              I
   +------------------------------------------------------------------------------+
 
 
                                Рис. 20
 
 
 
 
 


                                - 270 -
 
                          00152-01 34 07-1
 
 
      Для проверки этой гипотезы "исправим" программу командами:
 
      DBG>DEPOSIT K=1
 
      DBG>SET TRACE/SILENT %LINE 11 DO (DEPOSIT K=K+1)
 
      Первая команда присваивает K значение, которое  оно  должно
 
      иметь на данном шаге, вторая - указывает, что отладчик дол-
 
      жен выполнять при каждом попадании  на  строку  11  команду
 
      DEPOSIT K=K+1. Использование SET  TRACE  вместо  SET  BREAK
 
      приводит к непрерывному выполнению программы после исполне-
 
      ния последовательности DO  в  отличие  от  приостанова  при
 
      использовании SET  BREAK.  Квалификатор  /SILENT  подавляет
 
      сообщение о достижении каждый раз отслеживаемой строки  11.
 
      Теперь программа выполняется правильно в результате постав-
 
      ленной "заплатки" командой  SET  TRACE.  Экран  имеет  вид,
 
      показанный на рис.20 (заметим, что командA EXAM  I,K,  ука-
 
      занная перед командой DEPOSIT K=1, сместилась за экран).
 
           Для смещения окна вниз по  кадру  SRC  введем  команду
 
      SCROLL/DOWN  (или  нажмем  KP2).  Отметим,  что  строка  22
 
      является подходящим местом для точки приостанова, где прог-
 
      рамма остановится после тестирования корректности  "заплат-
 
      ки". Введем команду SET BREAK %LINE 22. После  этих  команд
 
      экран имеет вид, показанный на рис.21.
 
           Для возврата кадра SRC на исходное место введем коман-
 
      ду SCROLL/UP. Кадр SRC прокручивается по умолчанию, т.к.  в
 
      данном примере он представлен как прокручиваемый кадр,  как
 
      на рис.22.  Предположим,  что  теперь  желательно  прогнать
 
      программу для проверки "заплаты". Ожидается, что  программа
 
      будет выдавать строк информации больше, чем сможет  размес-
 
      титься в трехстрочном окне (входном для отладчика и  выход-
 
      ном для программы) внизу экрана. Для выделения места для


                                - 271 -
 
                          00152-01 34 07-1
 
 
 
                    Информация на экране после команд SCROLL/DOWN
 
                                  и SET BREAK  (пример)
 
   +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
   I                                                                              I
   I    14: C                                                                     I
   I                                                                              I
   I    15: C     ---Распечатать выходные значения. Останов.                      I
   I                                                                              I
   I    16:       PRINT 20, K                                                     I
   I                                                                              I
   I    17:    20 FORMAT(' NUMBER OF NON-ZERO ELEMENTS IS',I4)                    I
   I                                                                              I
   I    18:       DO 40 I = 1, K                                                  I
   I                                                                              I
   I    19:       PRINT 30, I, OUTARR(I)                                          I
   I                                                                              I
   I    20:    30 FORMAT(' ELEMENT',I4,' HAS VALUE',I6)                           I
   I                                                                              I
   I    21:    40 CONTINUE                                                        I
   I                                                                              I
   I    22:       END                                                             I
   I                                                                              I
   I--OUT---OUTPUT----------------------------------------------------------------I
   I                                                                              I
   ISTEPPED TO FORSQUARE$MAIN\%LINE 9                                             I
   I                                                                              I
   IFORSQUARE$MAIN\N:       9                                                     I
   I                                                                              I
   IFORSQUARE$MAIN\K:       0                                                     I
   I                                                                              I
   ISTEPPED TO FORSQUARE$MAIN\%LINE 11                                            I
   I                                                                              I
   IFORSQUARE$MAIN\I:       1                                                     I
   I                                                                              I
   IFORSQUARE$MAIN\K:       0                                                     I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I
   I------------------------------------------------------------------------------I
   I                                                                              I
   IDBG> SCROLL/DOWN                                                              I
   I                                                                              I
   IDBG> SET BREAK %LINE 22                                                       I
   I                                                                              I
   IDBG>                                                                          I
   I                                                                              I
   +------------------------------------------------------------------------------+
 
 
                                Рис. 21
 
 


                                - 272 -
 
                          00152-01 34 07-1
 
 
 
                    Информация на экране после команды SCROLL/UP  (пример)
 
   +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
   I                                                                              I
   I     7: C     ---Квадраты ненулевых элементов поместить в выходной массив.    I
   I                                                                              I
   I     8:       K = 0                                                           I
   I                                                                              I
   I     9:       DO 10 I = 1, N                                                  I
   I                                                                              I
   I    10:       IF(INARR(I) .NE. 0) THEN                                        I
   I                                                                              I
   I->  11:           OUTARR(K) = INARR(I)**2                                     I
   I                                                                              I
   I    12:       ENDIF                                                           I
   I                                                                              I
   I    13:    10 CONTINUE                                                        I
   I                                                                              I
   I    14: C                                                                     I
   I                                                                              I
   I    15: C     ---Распечатать выходные значения. Останов.                      I
   I                                                                              I
   I--OUT---OUTPUT----------------------------------------------------------------I
   I                                                                              I
   ISTEPPED TO FORSQUARE$MAIN\%LINE 9                                             I
   I                                                                              I
   IFORSQUARE$MAIN\N:       9                                                     I
   I                                                                              I
   IFORSQUARE$MAIN\K:       0                                                     I
   I                                                                              I
   ISTEPPED TO FORSQUARE$MAIN\%LINE 11                                            I
   I                                                                              I
   IFORSQUARE$MAIN\I:       1                                                     I
   I                                                                              I
   IFORSQUARE$MAIN\K:       0                                                     I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I------------------------------------------------------------------------------I
   I                                                                              I
   IDBG> SET BREAK %LINE 22                                                       I
   I                                                                              I
   IDBG> SCROLL/UP                                                                I
   I                                                                              I
   IDBG>                                                                          I
   I                                                                              I
   +------------------------------------------------------------------------------+
 
 
                            Рис. 22
 
 
 
 
 


                                - 273 -
 
                          00152-01 34 07-1
 
 
      Выходной информации программы расположим кадр OUT во второй
 
      трети экрана с помощью команды DISPLAY OUT AT T2, как пока-
 
      зано на рис.23.
 
           Заметим, что теперь кадр OUT накрывает (прячет) нижнюю
 
      часть кадра SRC, т.к. кадр OUT упоминается в более  поздней
 
      команде DISPLAY (чем кадр SRC). Нижняя треть плюс три  ниж-
 
      них строки экрана теперь доступны  для  входной  информации
 
      отладчика и выходной информации программы  (строки,  остаю-
 
      щиеся от предыдущего положения  кадра  будут  смещаться  по
 
      мере ввода команд отладчика).
 
           Далее введем команду GO, в результате которой програм-
 
      ма отработает до точки приостанова на  строке  22.  Оконча-
 
      тельный вид информации на экране показан на рис.24.
 
           По выходной информации программы (в нижней части экра-
 
      на) видно, что программа стала работать правильно с "запла-
 
      той" DEPOSIT K=K+1. Теперь отладку можно  завершить,  затем
 
      отредактировать, скомпилировать и перекомпоновать  програм-
 
      му. Однако  пока  отладчик  работает,  просмотрим  исходный
 
      текст программы с помощью команд:
 
        DBG>DISPLAY SRC AT FS;SCROLL/TOP SRC
 
           Эти команды отражают кадр SRC на весь экран (окно FS),
 
      за исключением окна внизу экрана  для  входной  информации.
 
      Вторая команда устанавливает  окно  на  начало  кадра,  как
 
      показано на рис.25.
 
           Прочитать всю  программу  можно  повторными  командами
 
      SCROLL/DOWN.  Однако,  т.к.  данная  программа   достаточно
 
      короткая, то можно решить проще: расположить окно  в  конце
 
      текста программы, применив команду SCROLL/BOTTOM, как пока-
 
      зано на рис.26.


                                - 274 -
 
                          00152-01 34 07-1
 
 
 
                 Информация на экране после команды DISPLAY OUT AT T2  (пример)
 
   +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
   I                                                                              I
   I     8:       K = 0                                                           I
   I                                                                              I
   I     9:       DO 10 I = 1, N                                                  I
   I                                                                              I
   I    10:       IF(INARR(I) .NE. 0) THEN                                        I
   I                                                                              I
   I->  11:           OUTARR(K) = INARR(I)**2                                     I
   I                                                                              I
   I    12:       ENDIF                                                           I
   I                                                                              I
   I    13:    10 CONTINUE                                                        I
   I                                                                              I
   I--OUT---OUTPUT----------------------------------------------------------------I
   I                                                                              I
   ISTEPPED TO FORSQUARE$MAIN\%LINE 9                                             I
   I                                                                              I
   IFORSQUARE$MAIN\N:       9                                                     I
   I                                                                              I
   IFORSQUARE$MAIN\K:       0                                                     I
   I                                                                              I
   ISTEPPED TO FORSQUARE$MAIN\%LINE 11                                            I
   I                                                                              I
   IFORSQUARE$MAIN\I:       1                                                     I
   I                                                                              I
   IFORSQUARE$MAIN\K:       0                                                     I
   I                                                                              I
   I------------------------------------------------------------------------------I
   I                                                                              I
   IFORSQUARE$MAIN\N:       9                                                     I
   I                                                                              I
   IFORSQUARE$MAIN\K:       0                                                     I
   I                                                                              I
   ISTEPPED TO FORSQUARE$MAIN\%LINE 11                                            I
   I                                                                              I
   IFORSQUARE$MAIN\I:       1                                                     I
   I                                                                              I
   IFORSQUARE$MAIN\K:       0                                                     I
   I                                                                              I
   I------------------------------------------------------------------------------I
   I                                                                              I
   IDBG> SCROLL/UP                                                                I
   I                                                                              I
   IDBG> DISPLAY OUT AT T2                                                        I
   I                                                                              I
   IDBG>                                                                          I
   I                                                                              I
   +------------------------------------------------------------------------------+
 
 
                                Рис. 23
 
 
 
 


                                - 275 -
 
                          00152-01 34 07-1
 
 
 
                    Информация на экране после команды GO  (пример)
 
   +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
   I                                                                              I
   I    17:    20 FORMAT(' NUMBER OF NON-ZERO ELEMENTS IS',I4)                    I
   I                                                                              I
   I    18        DO 40 I = 1, K                                                  I
   I                                                                              I
   I    19:       PRINT 30, I, OUTARR(I)                                          I
   I                                                                              I
   I    20:    30 FORMAT(' ELEMENT',I4,' HAS VALUE',I6)                           I
   I                                                                              I
   I    21:    40 CONTINUE                                                        I
   I                                                                              I
   I->  22:       END                                                             I
   I                                                                              I
   I--OUT---OUTPUT----------------------------------------------------------------I
   I                                                                              I
   IFORSQUARE$MAIN\N:       9                                                     I
   I                                                                              I
   IFORSQUARE$MAIN\K:       0                                                     I
   I                                                                              I
   ISTEPPED TO FORSQUARE$MAIN\%LINE 11                                            I
   I                                                                              I
   IFORSQUARE$MAIN\I:       1                                                     I
   I                                                                              I
   IFORSQUARE$MAIN\K:       0                                                     I
   I                                                                              I
   IBREAK AT FORSQUARE$MAIN\%LINE 22                                              I
   I                                                                              I
   I------------------------------------------------------------------------------I
   I                                                                              I
   IDBG> GO                                                                       I
   I                                                                              I
   INUMBER OF NON-ZERO ELEMENTS IS  6                                             I
   I                                                                              I
   IELEMENT   1 HAS VALUE    16                                                   I
   I                                                                              I
   IELEMENT   2 HAS VALUE    36                                                   I
   I                                                                              I
   IELEMENT   3 HAS VALUE     9                                                   I
   I                                                                              I
   IELEMENT   4 HAS VALUE    49                                                   I
   I                                                                              I
   IELEMENT   5 HAS VALUE    81                                                   I
   I                                                                              I
   IELEMENT   6 HAS VALUE     1                                                   I
   I                                                                              I
   IDBG>                                                                          I
   I                                                                              I
   +------------------------------------------------------------------------------+
 
 
                                Рис. 24
 
 
 
 


                                - 276 -
 
                          00152-01 34 07-1
 
 
 
                    Информация на экране после команд
 
                      DISPLAY и SCROLL/TOP  (пример)
 
   +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
   I                                                                              I
   I     1:       INTEGER INARR(20), OUTARR(20)                                   I
   I                                                                              I
   I     2: C                                                                     I
   I                                                                              I
   I     3: C     ---Прочитать входной массив из файла.                           I
   I                                                                              I
   I     4:       OPEN(UNIT=8, FILE='DATAFILE.DAT', STATUS='OLD')                 I
   I                                                                              I
   I     5:       READ(8,*) N, (INARR(I), I=1,N)                                  I
   I                                                                              I
   I     6: C                                                                     I
   I                                                                              I
   I     7: C     ---Квадраты ненулевых элементов поместить в выходной массив.    I
   I                                                                              I
   I     8:       K = 0                                                           I
   I                                                                              I
   I     9:       DO 10 I = 1, N                                                  I
   I                                                                              I
   I    10:       IF(INARR(I) .NE. 0) THEN                                        I
   I                                                                              I
   I    11:           OUTARR(K) = INARR(I)**2                                     I
   I                                                                              I
   I    12:       ENDIF                                                           I
   I                                                                              I
   I    13:    10 CONTINUE                                                        I
   I                                                                              I
   I    14: C                                                                     I
   I                                                                              I
   I    15: C     ---Распечатать выходные значения. Останов.                      I
   I                                                                              I
   I    16:       PRINT 20, K                                                     I
   I                                                                              I
   I    17:    20 FORMAT(' NUMBER OF NON-ZERO ELEMENTS IS',I4)                    I
   I                                                                              I
   I    18:       DO 40 I = 1, K                                                  I
   I                                                                              I
   I    19:       PRINT 30, I, OUTARR(I)                                          I
   I                                                                              I
   I------------------------------------------------------------------------------I
   I                                                                              I
   IELEMENT   6 HAS VALUE     1                                                   I
   I                                                                              I
   IDBG> DISPLAY SCR AT FS; SCROLL/TOP SRC                                        I
   I                                                                              I
   IDBG>                                                                          I
   I                                                                              I
   +------------------------------------------------------------------------------+
 
 
                                Рис. 25
 
 


                                - 277 -
 
                          00152-01 34 07-1
 
 
 
                    Информация на экране после команды SCROLL/BOTTOM  (пример)
 
   +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
   I                                                                              I
   I     4:       OPEN(UNIT=8, FILE='DATAFILE.DAT', STATUS='OLD')                 I
   I                                                                              I
   I     5:       READ(8,*) N, (INARR(I), I=1,N)                                  I
   I                                                                              I
   I     6: C                                                                     I
   I                                                                              I
   I     7: C     ---Квадраты ненулевых элементов поместить в выходной массив.    I
   I                                                                              I
   I     8:       K = 0                                                           I
   I                                                                              I
   I     9:       DO 10 I = 1, N                                                  I
   I                                                                              I
   I    10:       IF(INARR(I) .NE. 0) THEN                                        I
   I                                                                              I
   I    11:           OUTARR(K) = INARR(I)**2                                     I
   I                                                                              I
   I    12:       ENDIF                                                           I
   I                                                                              I
   I    13:    10 CONTINUE                                                        I
   I                                                                              I
   I    14: C                                                                     I
   I                                                                              I
   I    15: C     ---Распечатать выходные значения. Останов.                      I
   I                                                                              I
   I    16:       PRINT 20, K                                                     I
   I                                                                              I
   I    17:    20 FORMAT(' NUMBER OF NON-ZERO ELEMENTS IS',I4)                    I
   I                                                                              I
   I    18:       DO 40 I = 1, K                                                  I
   I                                                                              I
   I    19:       PRINT 30, I, OUTARR(I)                                          I
   I                                                                              I
   I    20:    30 FORMAT(' ELEMENT',I4,' HAS VALUE',I6)                           I
   I                                                                              I
   I    21:    40 CONTINUE                                                        I
   I                                                                              I
   I->  22:       END                                                             I
   I                                                                              I
   I------------------------------------------------------------------------------I
   I                                                                              I
   IDBG> DISPLAY SCR AT FS; SCROLL/TOP SCR                                        I
   I                                                                              I
   IDBG> SCROLL/BOTTOM                                                            I
   I                                                                              I
   IDBG>                                                                          I
   I                                                                              I
   +------------------------------------------------------------------------------+
 
 
                                Рис. 26
 
 
 
 


                                - 278 -
 
                          00152-01 34 07-1
 

 
           После редактирования, компиляции и компоновки програм-

      мы можно снова запустить ее под управлением  отладчика  для

      проверки правильности  функционирования.  Введем  следующие

      команды:

        DBG>SET MODE SCREEN

        DBG>SCROLL/DOWN

        DBG>SET DISPLAY NEWDISP AT Q3 DO(EXAM I,K; SHOW CALLS)

           Команда  SET  DISPLAY  создает  новый  кадр  с  именем

      NEWDISP, которая  отображается  в  третьей  чеверти  экрана

      (окно Q3), а его содержимое определяется указанным  списком

      команд отладчика (в данном случае это команды EXAM I,K;SHOW

      CALLS). В результате на экране будет информация, показанная

      на рис.27.

           Для установки точки приостанова на  строке  12,  чтобы

      просмотреть значение I,K введем команды:

        DBG>SET BREAK %LINE 12

        DBG>GO

           Экран примет вид, показанный на рис.28  (заметим,  что

      кадр NEWDISP автоматически  скорректировался  и  показывает

      теперь новые значения I,K для строки 12. Значение  K,  рав-

      ное 1, отражает то, что программа выполняется правильно).

           Последующие команды GO  вызовут  отображение  в  кадре

      NEWDISP текущих значений  I,K  и  текущего  списка  вызова.

      Через две команды GO экран будет иметь вид,  показанный  на

      рис.29. Заметим, что K=3, как ожидалось, а I=4. Это говорит

      о том, что один из элементов INARR был равен нулю, и поэто-

      му строки 11 и 12 один раз не выполнялись (к не  увеличива-

      лось).



                                - 279 -
 
                          00152-01 34 07-1
 
 
 
                  Информация на экране после
 
                  команды SET DISPLAY NEWDISP (пример)
 
   +--SRC: MODULE OKSQUARE$MAIN---SOURCE-SCROLL-----------------------------------+
   I                                                                              I
   I     8:       K = 0                                                           I
   I                                                                              I
   I     9:       DO 10 I = 1, N                                                  I
   I                                                                              I
   I    10:       IF(INARR(I) .NE. 0) THEN                                        I
   I                                                                              I
   I    11:           K = K + 1                                                   I
   I                                                                              I
   I    12:           OUTARR(K) = INARR(I)**2                                     I
   I                                                                              I
   I    13:       ENDIF                                                           I
   I                                                                              I
   I    14:    10 CONTINUE                                                        I
   I                                                                              I
   I    15: C                                                                     I
   I                                                                              I
   I    16: C     ---Распечатать выходные значения. Останов.                      I
   I                                                                              I
   I--NEWDISP---------------------------------------------------------------------I
   I                                                                              I
   IOKSQUARE$MAIN\I:        0                                                     I
   I                                                                              I
   IOKSQUARE$MAIN\K:        0                                                     I
   I                                                                              I
   I MODULE NAME     ROUTINE NAME                   LINE       REL PC      ABS PC I
   I                                                                              I
   I*OKSQUARE$MAIN   OKSQUARE$MAIN                     1      00000002   00000602 I
   I                                                                              I
   I--OUT---OUTPUT----------------------------------------------------------------I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I------------------------------------------------------------------------------I
   I                                                                              I
   IDBG> SCROLL/DOWN                                                              I
   I                                                                              I
   IDBG> SET DISPLAY NEWDISP AT Q3 DO(EXAM I, K; SHOW CALLS)                      I
   I                                                                              I
   IDBG>                                                                          I
   I                                                                              I
   +------------------------------------------------------------------------------+
 
 
                                Рис. 27
 
 
 
 
 
 
 


                                - 280 -
 
                          00152-01 34 07-1
 
 
 
                  Информация на экране после достижения
 
                        точки приостанова  (пример)
 
   +--SRC: MODULE OKSQUARE$MAIN---SOURCE-SCROLL-----------------------------------+
   I                                                                              I
   I     8:       K = 0                                                           I
   I                                                                              I
   I     9:       DO 10 I = 1, N                                                  I
   I                                                                              I
   I    10:       IF(INARR(I) .NE. 0) THEN                                        I
   I                                                                              I
   I    11:           K = K + 1                                                   I
   I                                                                              I
   I->  12:           OUTARR(K) = INARR(I)**2                                     I
   I                                                                              I
   I    13:       ENDIF                                                           I
   I                                                                              I
   I    14:    10 CONTINUE                                                        I
   I                                                                              I
   I    15: C                                                                     I
   I                                                                              I
   I    16: C     ---Распечатать выходные значения. Останов.                      I
   I                                                                              I
   I--NEWDISP---------------------------------------------------------------------I
   I                                                                              I
   IOKSQUARE$MAIN\I:        1                                                     I
   I                                                                              I
   IOKSQUARE$MAIN\K:        1                                                     I
   I                                                                              I
   I MODULE NAME     ROUTINE NAME                   LINE       REL PC      ABS PC I
   I                                                                              I
   I*OKSQUARE$MAIN   OKSQUARE$MAIN                    12      0000006E   0000066E I
   I                                                                              I
   I--OUT---OUTPUT----------------------------------------------------------------I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I------------------------------------------------------------------------------I
   I                                                                              I
   IDBG> SET BREAK %LINE 12                                                       I
   I                                                                              I
   IDBG> GO                                                                       I
   I                                                                              I
   IDBG>                                                                          I
   I                                                                              I
   +------------------------------------------------------------------------------+
 
 
                                Рис. 28
 
 
 
 
 
 
 


                                - 281 -
 
                          00152-01 34 07-1
 
 
 
                  Информация на экране после двух команд GO  (пример)
 
   +--SRC: MODULE OKSQUARE$MAIN---SOURCE-SCROLL-----------------------------------+
   I                                                                              I
   I     8:       K = 0                                                           I
   I                                                                              I
   I     9:       DO 10 I = 1, N                                                  I
   I                                                                              I
   I    10:       IF(INARR(I) .NE. 0) THEN                                        I
   I                                                                              I
   I    11:           K = K + 1                                                   I
   I                                                                              I
   I->  12:           OUTARR(K) = INARR(I)**2                                     I
   I                                                                              I
   I    13:       ENDIF                                                           I
   I                                                                              I
   I    14:    10 CONTINUE                                                        I
   I                                                                              I
   I    15: C                                                                     I
   I                                                                              I
   I    16: C     ---Распечатать выходные значения. Останов.                      I
   I                                                                              I
   I--NEWDISP---------------------------------------------------------------------I
   I                                                                              I
   IOKSQUARE$MAIN\I:        4                                                     I
   I                                                                              I
   IOKSQUARE$MAIN\K:        3                                                     I
   I                                                                              I
   I MODULE NAME     ROUTINE NAME                   LINE       REL PC      ABS PC I
   I                                                                              I
   I*OKSQUARE$MAIN   OKSQUARE$MAIN                    12      0000006E   0000066E I
   I                                                                              I
   I--OUT---OUTPUT----------------------------------------------------------------I
   I                                                                              I
   I    12:           OUTARR(K) = INARR(I)**2                                     I
   I                                                                              I
   I                                                                              I
   I                                                                              I
   I------------------------------------------------------------------------------I
   I                                                                              I
   IDBG> GO                                                                       I
   I                                                                              I
   IDBG> GO                                                                       I
   I                                                                              I
   IDBG>                                                                          I
   I                                                                              I
   +------------------------------------------------------------------------------+
 
 
                           Рис. 29
 
 
 
 
 
 
 
 


                                - 282 -
 
                          00152-01 34 07-1
 
 
           Обратите внимание, что верхняя половина кадра OUT нак-

      рыта кадром NEWDISP. Пока не достигнута точка  приостанова,

      обычная выходная информация  отладчика  выдается  в  нижнюю

      половину окна кадра OUT.

 

           8.8.1. Примуер  кадров  значений  регистров  и  команд

      ассемблера
 
 
           Пример иллюстрирует, как могут располагаться в различ-

      ных окнах предопределенные кадры  REG  и  INST,  отражающие

      содержимое регистров СМ 1700 и текущие  команды  ассемблера

      соответственно.

           Данный пример базируется на примере, описанном в  пре-

      дыдущем пункте (п. 8.7.1). Предполагаем, что он находится в

      такой точке отладки, когда текущие кадры SRC  и  OUT  имеют

      вид, показанный на рис.30.

           Для просмотра текущих значений регистров введем коман-

      ду DISPLAY REG, где REG -  предопределенный  кадр  значений

      регистров, который по умолчанию размещается в третьей  чет-

      верти экрана, как на рис.31.

           Теперь верхняя половина кадра OUT спрятана под  кадром

      REG. Можно поместить кадр OUT в более малое  окно  Q4,  так

      чтобы не перекрывались ни кадр REG, ни кадр SRC. Для  этого

      введем команду DISPLAY OUT AT Q4 (нажатие последовательнос-

      ти клавиш малой клавиатуры  BLUE-KP7  позволяет  разместить

      кадр REG в Q3, а кадр OUT - в Q4), в результате чего  экран

      примет вид, показанный на рис.32.



                                - 283 -
 
                          00152-01 34 07-1
 
 
 
                   Пример. Исходная информация на экране
 
  +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
  I                                                                              I
  I     7: C     ---Квадраты ненулевых элементов поместить в выходной массив.    I
  I                                                                              I
  I     8:       K = 0                                                           I
  I                                                                              I
  I     9:       DO 10 I = 1, N                                                  I
  I                                                                              I
  I    10:       IF(INARR(I) .NE. 0) THEN                                        I
  I                                                                              I
  I->  11:           OUTARR(K) = INARR(I)**2                                     I
  I                                                                              I
  I    12:       ENDIF                                                           I
  I                                                                              I
  I    13:    10 CONTINUE                                                        I
  I                                                                              I
  I    14: C                                                                     I
  I                                                                              I
  I    15: C     ---Распечатать выходные значения. Останов.                      I
  I                                                                              I
  I--OUT---OUTPUT----------------------------------------------------------------I
  I                                                                              I
  ISTEPPED TO FORSQUARE$MAIN\%LINE 9                                             I
  I                                                                              I
  IFORSQUARE$MAIN\N:       9                                                     I
  I                                                                              I
  IFORSQUARE$MAIN\K:       0                                                     I
  I                                                                              I
  ISTEPPED TO FORSQUARE$MAIN\%LINE 11                                            I
  I                                                                              I
  IFORSQUARE$MAIN\I:       1                                                     I
  I                                                                              I
  IFORSQUARE$MAIN\K:       0                                                     I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I------------------------------------------------------------------------------I
  I                                                                              I
  IDBG> SET BREAK %LINE 22                                                       I
  I                                                                              I
  IDBG> SCROLL/UP                                                                I
  I                                                                              I
  IDBG>                                                                          I
  I                                                                              I
  +------------------------------------------------------------------------------+
 
 
                                  Рис. 30
 
 
 
 
 
 
 
 


                                - 284 -
 
                          00152-01 34 07-1
 
 
                 Информация на экране после команды DISPLAY REG  (пример)
 
  +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
  I                                                                              I
  I     7: C       ---Квадраты ненулевых элементов поместить в выходной массив.  I
  I                                                                              I
  I     8:         K = 0                                                         I
  I                                                                              I
  I     9:         DO 10 I = 1, N                                                I
  I                                                                              I
  I    10:         IF(INARR(I) .NE. 0) THEN                                      I
  I                                                                              I
  I->  11:             OUTARR(K) = INARR(I)**2                                   I
  I                                                                              I
  I    12:         ENDIF                                                         I
  I                                                                              I
  I    13:      10 CONTINUE                                                      I
  I                                                                              I
  I    14: C                                                                     I
  I                                                                              I
  I    15: C       ---Распечатать выходные значения. Останов.                    I
  I                                                                              I
  I--REG-------------------------------------------------------------------------I
  I                                                                              I
  IR0:00000001 R4:00000000 R8: 7FFED052 AP:7FF5EFCC @AP:00000006 @SP:00000000 N:0I
  I                                                                              I
  IR1:00000008 R5:00000000 R9: 7FFED25A FP:7FF5EF80  +4:7FFE6440  +4:08000000 Z:0I
  I                                                                              I
  IR2:00000000 R6:7FF5EC49 R10:7FFEDDD4 SP:7FF5EF80  +8:7FFA8ED3  +8:7FF5EFCC V:0I
  I                                                                              I
  IR3:7FF5EF94 R7:8001E4DD R11:000004A0 PC:00000668 +12:7FFE640C +12:7FF5EFB8 C:0I
  I                                                                              I
  I--OUT---OUTPUT----------------------------------------------------------------I
  I                                                                              I
  IFORSQUARE$MAIN\K:       0                                                     I
  I                                                                              I
  I                                                                              I
  I                                                                              I
  I------------------------------------------------------------------------------I
  I                                                                              I
  IDBG> SCROLL/UP                                                                I
  I                                                                              I
  IDBG> DISPLAY REG                                                              I
  I                                                                              I
  IDBG>                                                                          I
  I                                                                              I
  +------------------------------------------------------------------------------+
 
 
                               Рис. 31
 
 
 
 
 
 
 
 
 


                                - 285 -
 
                          00152-01 34 07-1
 
 
 
                  Информация на экране после нажатия клавиш BLUE-KP7  (пример)
 
  +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
  I                                                                              I
  I     7: C       ---Квадраты ненулевых элементов поместить в выходной массив.  I
  I                                                                              I
  I     8:         K = 0                                                         I
  I                                                                              I
  I     9:         DO 10 I = 1, N                                                I
  I                                                                              I
  I    10:         IF(INARR(I) .NE. 0) THEN                                      I
  I                                                                              I
  I->  11:             OUTARR(K) = INARR(I)**2                                   I
  I                                                                              I
  I    12:         ENDIF                                                         I
  I                                                                              I
  I    13:      10 CONTINUE                                                      I
  I                                                                              I
  I                                                                              I
  I    14: C                                                                     I
  I                                                                              I
  I    15: C       ---Распечатать выходные значения. Останов.                    I
  I                                                                              I
  I--REG-------------------------------------------------------------------------I
  I                                                                              I
  IR0:00000001 R4:00000000 R8: 7FFED052 AP:7FF5EFCC @AP:00000006 @SP:00000000 N:0I
  I                                                                              I
  IR1:00000008 R5:00000000 R9: 7FFED25A FP:7FF5EF80  +4:7FFE6440  +4:08000000 Z:0I
  I                                                                              I
  IR2:00000000 R6:7FF5EC49 R10:7FFEDDD4 SP:7FF5EF80  +8:7FFA8ED3  +8:7FF5EFCC V:0I
  I                                                                              I
  IR3:7FF5EF94 R7:8001E4DD R11:000004A0 PC:00000668 +12:7FFE640C +12:7FF5EFB8 C:0I
  I                                                                              I
  I--OUT---OUTPUT----------------------------------------------------------------I
  I                                                                              I
  IFORSQUARE$MAIN\K:       0                                                     I
  I                                                                              I
  ISTEPPED TO FORSQUARE$MAIN\%LINE 11                                            I
  I                                                                              I
  IFORSQUARE$MAIN\I:       1                                                     I
  I                                                                              I
  IFORSQUARE$MAIN\K:       0                                                     I
  I                                                                              I
  I------------------------------------------------------------------------------I
  I                                                                              I
  IDBG> DISPLAY REG                                                              I
  I                                                                              I
  IDBG> DISPLAY OUT AT Q4                                                        I
  I                                                                              I
  IDBG>                                                                          I
  I                                                                              I
  +------------------------------------------------------------------------------+
 
 
                               Рис. 32
 
 
 


                                - 286 -
 
                          00152-01 34 07-1
 
 
           Другой полезной комбинацией кадров является SRC, INST,
 
      OUT: SRC - в верхней трети экрана (T1), INST  -  в  средней
 
      (т2) и OUT - в нижней трети (T3). Для этого служит команда:
 
      DISPLAY SRC AT T1,INST AT T2,  OUT  AT  T3,  которую  можно
 
      ввести нажатием клавиши малой  клавиатуры  KP7,  которая  в
 
      свою очередь выдает команду SELECT  для  назначения  кадров
 
      SRC, INST, OUT в качестве текущих кадров исходного  текста,
 
      команд ассемблера и выходной информации соответственно.
 
           После отработки этих команд кадры INST  и  OUT  вместе
 
      накрывают кадр REG, как на рис.33.
 


                                - 287 -
 
                          00152-01 34 07-1
 
 
 
                  Информация на экране после нажатия клавиши KP7  (пример)
 
  +--SRC: MODULE FORSQUARE$MAIN---SOURCE-SCROLL----------------------------------+
  I                                                                              I
  I     8:         K = 0                                                         I
  I                                                                              I
  I     9:         DO 10 I = 1, N                                                I
  I                                                                              I
  I    10:         IF(INARR(I) .NE. 0) THEN                                      I
  I                                                                              I
  I->  11:             OUTARR(K) = INARR(I)**2                                   I
  I                                                                              I
  I    12:         ENDIF                                                         I
  I                                                                              I
  I    13:      10 CONTINUE                                                      I
  I                                                                              I
  I--INST: ROUTINE FORSQUARE$MAIN---INSTRUCTION----------------------------------I
  I                                                                              I
  I          : TSTL    W^164(R11)[R0]                                            I
  I                                                                              I
  I          : BEQL    FORSQUARE$MAIN\%LINE 13                                   I
  I                                                                              I
  I->NE    11: MOVL    B^12(R11),R1                                              I
  I                                                                              I
  I          : MOVL    B^4(R11),R0                                               I
  I                                                                              I
  I          : MULL3   W^-164(R11)[R0],W^-164(R11)[R0],B^-84(R11)[R1]            I
  I                                                                              I
  ILINE    13: AOBLEQ  B^16(R11),B^4(R11),FORSQUARE$MAIN\%LINE 10                I
  I                                                                              I
  I--OUT---OUTPUT----------------------------------------------------------------I
  I                                                                              I
  IFORSQUARE$MAIN\N:       9                                                     I
  I                                                                              I
  IFORSQUARE$MAIN\K:       0                                                     I
  I                                                                              I
  ISTEPPED TO FORSQUARE$MAIN\%LINE 11                                            I
  I                                                                              I
  IFORSQUARE$MAIN\I:       1                                                     I
  I                                                                              I
  IFORSQUARE$MAIN\K:       0                                                     I
  I                                                                              I
  I------------------------------------------------------------------------------I
  I                                                                              I
  IDBG> DISPLAY OUT AT Q4                                                        I
  I                                                                              I
  IDBG> DISPLAY SCR AT T1, INST AT T2, OUT AT T3                                 I
  I                                                                              I
  IDBG>                                                                          I
  I                                                                              I
  +------------------------------------------------------------------------------+
 
 
                               Рис. 33
 
 
 
 


                                - 288 -
 
                          00152-01 34 07-1
 
 
                        9. Организация отладки
 
 
 
           Отладчик имеет некоторые специализированные  средства,
 
      позволяющие организовывать сеанс  отладки  удобно  как  для
 
      разработки конкретной программы, так и для нужд пользовате-
 
      ля. Эти средства позволяют:
 
           1) выделять дополнительную память;
 
           2) использовать структуры управления;
 
           3) задавать параметры командным процедурам;
 
           4) определять и отменять команды;
 
           5) определять и отменять клавишные команды.
 
 
 
           9.1. Выделение дополнительной памяти
 
 
           Отладчик имеет внутренний пул памяти,  часть  которого
 
      используется как постоянная память, а часть -  как  времен-
 
      ная. Структуры данных, создаваемые отладчиком при обработке
 
      команды, нуждаются только во  временной  памяти.  Поскольку
 
      эти структуры данных  сбрасываются  сразу  после  обработки
 
      команды, то память, которую они  занимали,  можно  повторно
 
      использовать для другой обработки. С другой стороны, струк-
 
      туры данных, которые используются в течение сеанса  отладки
 
      (такие как точки приостанова) нуждаются в постоянной  памя-
 
      ти.
 
           Большая часть пула памяти используется для  размещения
 
      таблицы текущих символических имен (RST) модулей,  устанав-
 
      ливаемых командой SET MODULE. Обычно пул  памяти  отладчика
 
      позволяет разместить шесть наибольших модулей пользователя.
 
           Однако программа пользователя может иметь много  боль-
 
      ших модулей, которые желательно установить одновременно,  а
 


                                - 289 -
 
                          00152-01 34 07-1
 
 
      нормальное распределение памяти не позволяет включить имена
 
      всех этих модулей в таблицу RST. Для решения этой  проблемы
 
      можно  выделить   дополнительную   память   либо   командой
 
      ALLOCATE, либо командой SET MODULE/ALLOCATE.
 
 
 
           9.1.1. Команда ALLOCATE
 
 
           Команда ALLOCATE дает возможность явно управлять  раз-
 
      мером пула памяти отладчика. Она позволяет  увеличить  вир-
 
      туальное адресное пространство, предназначенное  отладчику.
 
      Это пространство отладчик использует для запоминания табли-
 
      цы символических имен, например, информации точек  событий.
 
      Данную команду можно применить после получения сообщения об
 
      ошибке "NOFREE", показывающего, что отладчик вышел за  пре-
 
      делы свободной виртуальной памяти. Команда имеет  следующий
 
      вид:
 
           ALLOCATE число_байтов
 
      Параметр число_байтов указывает количество байтов,  которое
 
      пользователь хочет добавить к пулу памяти отладчика.  Необ-
 
      ходимо запрашивать по крайней мере 1000 байтов. Размер пула
 
      можно выяснить, вводя команду SHOW MODULE. Размер показан в
 
      строке "REMAINING SIZE" (остающийся об'ем). Число,  указан-
 
      ное в этой строке, представляет количество  свободных  бай-
 
      тов, имеющихся в пуле.
 
           Команда SHOW MODULE  помогает  также  узнать,  сколько
 
      байтов необходимо для установки  каждого  модуля  программы
 
      пользователя. Знание требуемого об'ема  можно  использовать
 
      для определения количества добавляемых байтов.
 
           Выделять дополнительную  память  желательно  в  начале
 
      сеанса отладки. Выделять можно и в середине сеанса отладки,
 


                                - 290 -
 
                          00152-01 34 07-1
 
 
      однако это  может  затронуть  распределение  памяти  внутри
 
      программы  пользователя,  если  она  вызывает  подпрограмму
 
      LIB$GET.VM. Поскольку отладчик также использует  LIB$GET_VM
 
      (для увеличения размера памяти), то память, отданная  прог-
 
      рамме пользователя, может быть перераспределена  отладчику.
 
      Обычно в этом нет проблемы,  но  в  некоторых  случаях  это
 
      может повлиять на поведение программы.
 
 
 
           9.1.2. Команда SET MODULE/ALLOCATE
 
 
           Квалификатор /ALLOCATE команды SET MODULE указывает на
 
      необходимость выделения памяти по завершении команды.
 
           Обычно отладчик старается  выделить  память  в  начале
 
      сеанса отладки до запуска программы. Поэтому любая  команда
 
      SET MODULE, введенная до выполнения  команд  STEP  или  GO,
 
      будет выделять, если необходимо, память независимо от того,
 
      указан квалификатор /ALLOCATE или нет.
 
           После запуска программы отладчик уже не будет выделять
 
      память, потому что может произойти перераспределение памяти
 
      отладчика и программы, а это, в свою  очередь,  может  пов-
 
      лиять на поведение программы. Поэтому, если  после  запуска
 
      программы требуется выделение дополнительной памяти во вре-
 
      мя установки модуля, необходимо сделать такой запрос  явно,
 
      указав команду SET MODULE/ALLOCATE.
 
           Пример показывает, как применять команды ALLOCATE, SET
 
      MODULE/ALLOCATE и SHOW MODULE:
 
      DBG>SHOW MODULE     !Вывод на экран имен модулей и размеров
 
      MODULE NAME         SYMBOLS    LANGUAGE            SIZE
 
      (Имя модуля)        (Имена)     (Язык)            (Размер)
 
      DISTANCE$MAIN        YES        FORTRAN            15600
 


                                - 291 -
 
                          00152-01 34 07-1
 
 
      DIST                 NO         FORTRAN             5420
 
      SUB1                 NO         FORTRAN            10000
 
      SUB2                 NO         FORTRAN             5260
 
      SHARE$FORRTL         NO         IMAGE                  0
 
      SHARE$LIBRTL         NO         IMAGE                  0
 
      SHARE$MTHRTL         NO         IMAGE                  0
 
      SHARE$DEBUG          NO         IMAGE                  0
 
      SHARE$LBRSHR         NO         IMAGE                  0
 
      SHARE$PLIRTL         NO         IMAGE                  0
 
      SHARE$SCRSHR         NO         IMAGE                  0
 
      SHARE$SMGSHR         NO         IMAGE                  0
 
      TOTAL MODULES: 12    REMAINING SIZE: 46260.
 
      (всего модулей:12)   (оставшийся размер: 46260)
 
      DBG>SET MODULE/ALL   !Установить  все  модули в начале
 
                           !процесса отладки
 
      DBG>SHOW MODULE      !Вывод на экран всей совокупности
 
                           !модулей.Заметим, что разделяемый
 
                           !образ не устанавливается.
 
      MODULE NAME          SYMBOLS    LANGUAGE           SIZE
 
      DISTANCE$MAIN        YES        FORTRAN            15600
 
      DIST                 YES        FORTRAN             5420
 
      SUB1                 YES        FORTRAN            10000
 
      SUB2                 YES        FORTRAN             5260
 
      SHARE                NO         IMAGE                  0
 
      SHARE                NO         IMAGE                  0
 
      SHARE                NO         IMAGE                  0
 
      SHARE                NO         IMAGE                  0
 
      SHARE                NO         IMAGE                  0
 
      SHARE                NO         IMAGE                  0
 
      SHARE                NO         IMAGE                  0


                                - 292 -
 
                          00152-01 34 07-1
 
 
      SHARE                NO         IMAGE                  0
 
      TOTAL MODULES: 12    REMAINING SIZE: 20000.
 
      DBG>SET MODULE/ALLOCATE SHARE$FORRTL
 
                           !Явный запрос на установку
 
                           !разделяемого образа
 
                           !независимо от размера.
 
      DBG>SHOW MODULE      !Вывод на экран установленных
 
                           !модулей. Заметим, что теперь
 
                           !модуль SHARE$FORRTL установлен.
 
      MODULE NAME          SYMBOLS    LANGUAGE            SIZE
 
      DISTANCE$MAIN        YES        FORTRAN            15600
 
      DIST                 YES        FORTRAN             5420
 
      SUB1                 YES        FORTRAN            10000
 
      SUB2                 YES        FORTRAN             5260
 
      SHARE$FORRTL         YES        IMAGE                  0
 
      SHARE$LIBRTL         YES        IMAGE                  0
 
      SHARE$MTHRTL         NO         IMAGE                  0
 
      SHARE$DEBUG          NO         IMAGE                  0
 
      SHARE$LBRSHR         NO         IMAGE                  0
 
      SHARE$PLIRTL         NO         IMAGE                  0
 
      SHARE$SCRSHR         NO         IMAGE                  0
 
      SHARE$SMGSHR         NO         IMAGE                  0
 
      TOTAL MODULES: 10    REMAINING SIZE: 8400.
 
      DBG>SET MODULE SHARE$LIBRTL !Попытка установить другой
 
                                  !модуль.
 
      %DEBUG-E-NOFREE, NO FREE STOGAGE AVAILABLE
 
                       (нет свободной памяти)
 
      DBG>ALLOCATE 15000   !Увеличим явно пул памяти на 15000
 
                           !байтов. Можно также использовать
 
                           !команду SET MODULE/ALLOCATE.


                                - 293 -
 
                          00152-01 34 07-1
 
 
      DBG>SET MODULE SHARE$LIBRTL !Еще одна попытка установить
 
                                  !модуль.
 
      DBG>SHOW MODULE             !Вывод на экран всех модулей.
 
      MODULE NAME          SYMBOLS    LANGUAGE             SIZE
 
      DISTANCE$MAIN        YES        FORTRAN            15600
 
      DIST                 YES        FORTRAN             5420
 
      SUB1                 YES        FORTRAN            10000
 
      SUB2                 YES        FORTRAN             5260
 
      SHARE$FORRTL         YES        IMAGE              11600
 
      SHARE$LIBRTL         YES        IMAGE              19652
 
      SHARE$MTHRTL         NO         IMAGE                  0
 
      SHARE$DEBUG          NO         IMAGE                  0
 
      SHARE$LBRSHR         NO         IMAGE                  0
 
      SHARE$PLIRTL         NO         IMAGE                  0
 
      SHARE$SCRSHR         NO         IMAGE                  0
 
      SHARE$SMGSHR         NO         IMAGE                  0
 
      TOTAL MODULES: 12    REMAINING SIZE: 4200.
 
 
 
           9.2. Использование управляющих структур
 
 
           Язык команд отладчика - специализированный язык  прог-
 
      раммирования, который состоит в основном из простых  опера-
 
      ций (или простых команд), таких как EXAMINE  и  SET  BREAK.
 
      Однако как и в других языках программирования эффективность
 
      и гибкость этих простых команд усилена благодаря  конструк-
 
      циям организации циклов и условий.  Отладчик  включает  три
 
      таких управляющих структуры: команды FOR, IF и WHILE.
 


                                - 294 -
 
                          00152-01 34 07-1
 
 
           9.2.1. Команда FOR
 
 
           Команда FOR позволяет повторно выполняться  некоторому
 
      списку команд отладчика заданное  количество  раз.  Команда
 
      имеет вид:
 
      FOR имя=выражение1 TO выражение2 [BY выражение3] DO(спи-
 
      сок_команд)
 
           Поведение команды FOR зависит  от  значения  параметра
 
      выражение3. Если выражение3  положительно,  "имя"  увеличи-
 
      вается от значения выражение1 на величину выражения3 до тех
 
      пор, пока не станет больше значения выражения2.
 
           Если выражение3 отрицательно, то "имя" уменьшается  от
 
      значения выражения1 на величину значения выражения3 до  тех
 
      пор, пока не станет меньше значения выражения2.
 
           Если выражение3 равно нулю, отладчик выдает  сообщение
 
      об ошибке.
 
           Если выражение3 совсем отсутствует, то отладчик прини-
 
      мает его значение равным +1.
 
           Пример показывает, как использовать команду FOR:
 
      DBG>FOR COUNT=1 TO 4 DO(STEP)   !Установлен цикл шагов на
 
      STEPPED TO DISTANCE$MAIN\%LINE 5!следующие 4 строки
 
           5:     STATUS=LIB$GET_LUN(LOG_UNIT)
 
      STEPPED TO DISTANCE$MAIN\%LINE 6
 
           6:     OPEN(UNIT=LOG_UNIT,FILE='FOR.DAT',STATUS='OLD')
 
      STEPPED TO DISTANCE$MAIN\%LINE 7
 
           7:     DO WHILE (X1 .NE. -9.9)
 
      STEPPED TO DISTANCE$MAIN\%LINE 8
 
           8:     READ(UNIT=LOG_UNIT,FMT=100)X1,X2,Y1,Y2
 
      DBG>SHOW SYMBOL COUNT          !Вывод на экран имени COUNT
 
      DEFINED COUNT
 


                                - 295 -
 
                          00152-01 34 07-1
 
 
      DBG>EVALUATE COUNT              !Вывод на экран текущего
 
      4                               !значения COUNT
 
      DBG>REPEAT 4 DO(STEP)           !Другой путь повторения
 
                                      !команды отладчика
 
      STEPPED TO DISTANCE$MAIN\%LINE 10
 
          10:      D=DIST(X1,X2,Y1,Y2)
 
      STEPPED TO DISTANCE$MAIN\%LINE 16
 
          16:      TYPE 200,X1
 
      STEPPED TO DISTANCE$MAIN\%LINE 17
 
          17:      TYPE 201,X2
 
      STEPPED TO DISTANCE$MAIN\%LINE 18
 
          18:      TYPE 202,Y1
 
           Более  полную  информацию  о  команде  FOR  см. в
 
      части 2 настоящего документа.
 
 
 
           9.2.2. Команда IF
 
 
           Команда IF  позволяет  списку  команд  отладчика  быть
 
      выполненными по условию, если языковое выражение имеет зна-
 
      чение "истина" (TRUE). Команда имеет вид:
 
      IF языковое_выражение THEN (список_команд)-
 
      [(ELSE(список_команд)]
 
           Команда IF вычисляет логическое  выражение,  зависящее
 
      от языка программирования. Если его значение "истина"  (для
 
      текущего языка программирования), выполняется список команд
 
      выражения THEN. Если  значение  предложения  -  "ложь",  то
 
      выполняется список команд предложения ELSE (если такой ука-
 
      зан).
 
           Следующий пример показывает использование команды IF:
 


                                - 296 -
 
                          00152-01 34 07-1
 
 
      DBG>IF X1 .NE. -9.9 THEN(EXAMINE X2) ELSE (EX Y1)
 
      DISTANCE$MAIN\X2  0.0000000
 
                                  !Просмотреть переменную
 
                                  !X2, если X1 не равно
 
                                  !-9.9; в противном случае
 
                                  !просмотреть переменную Y1.
 
      DBG>FOR COUNT=1 TO 4 DO (IF X1 .NE. -9.9 THEN (STEP))
 
      STEPPED TO DISTANCE$MAIN\%LINE 19   !Установка управляющей
 
          19:      TYPE 203,Y2             !структуры пошагового
 
      STEPPED TO DISTANCE$MAIN\%LINE 20    !прохождения четырех
 
                                           !строк до тех пор,
 
          20:      TYPE 204,D              !пока X1 не станет
 
      STEPPED TO DISTANCE$MAIN\%LINE 21    !равным -9.9
 
          21:      END DO
 
      STEPPED TO DISTANCE$MAIN\%LINE 7
 
           7:      DO WHILE(X1 .NE. -9.9)
 
 
 
           9.2.3. Команда WHILE
 
 
           Kоманда WHILE позволяет неоднократно выполнять  список
 
      команд отладчика до тех пор, пока  указанное  пользователем
 
      выражение не станет  иметь  значение  "ложь"  (FALSE).  Эта
 
      команда имеет вид:
 
      WHILE логическое_выражение DO (список_команд)
 
           Eсли значение логического выражения  -  "истина"  (для
 
      текущего языка  программирования),  то  выполняется  список
 
      команд оператора DO. При повторных запусках  команды  WHILE
 
      каждый раз вычисляется  значение  логического  выражения  и
 
      список команд выполняется всякий раз, когда значение  этого
 
      логического выражения не "ложь".
 


                                - 297 -
 
                          00152-01 34 07-1
 
 
           Eсли значение логического выражения - "ложь",  команда
 
      WHILE завершается.
 
           Пример показывает, как использовать команду WHILE:
 
      DBG>WHINE X2 .LE. X1 DO (EX X2; STEP)
 
      DISTANCE$MAIN\X12:   5.5000000
 
      STEPPED TO DISTANCE$MAIN\%LINE 8
 
           8:      READ (UNIT=LOG_UNIT,FMT=100)X1,X2,Y1,Y2
 
      DISTANCE$MAIN\X2:   5.5000000     !Рассматривается перемен-
 
                                        !ная X2 и затем осуществ-
 
      STEPPED TO DISTANCE$MAIN\%LINE 10 !ляется шаг к следующей
 
         10:       D=DIST(X1,X2,Y1,Y2)  !строке до тех пор, пока
 
      DISTANCE$MAIN\X2:   5.000000      !X2 меньше, чем перемен-
 
      STEPPED TO DISTANCE$MAIN\%LINE 16 !ная X1
 
          16:      TYPE 200,X1
 
      DISTANCE$MAIN\X2:   5.000000
 
      STEPPET TO DISTANCE$MAIN\%LINE 17
 
          17:      TYPE 201,X2
 
      DISTANCE$MAIN\X2:   5.000000
 
 
 
           9.3. Об'явление параметров командным процедурам
 
 
           Еще одним  специальным  средством  отладчика  является
 
      команда DECLARE, позволяющая передавать параметры косвенным
 
      командным процедурам. Эта  команда  используется  только  в
 
      командной процедуре отладчика.
 
           Каждое об'явление параметра имеет то же действие,  что
 
      и при команде DEFINE: связывается имя (формальный параметр)
 
      со значением или другой конструкцией (действительным  пара-
 
      метром).
 


                                - 298 -
 
                          00152-01 34 07-1
 
 
           Формат команды:
 
      DECLARE имяп:типп [,имяп:типп[,...]] .
 
           Имяп указывает имя формального параметра, а типп - тип
 
      параметра, который может быть следующим:
 
           1) ADDRESS - действительный параметр будет интерпрети-
 
      роваться как адресное выражение. Действие - такое же, как у
 
      команды DEFINE/ADDRESS имяп=действительный_параметр;
 
           2) VALUE - действительный параметр будет интерпретиро-
 
      ваться как языковое выражение. Действие - такое  же  как  у
 
      команды DEFINE/VALUE имяп=действительный_параметр;
 
           3) COMMAND - действительный параметр будет интерпрети-
 
      роваться как командная строка.  Действие  -  такое,  как  у
 
      команды DEFINE/COMMAND имяп=действительный_параметр.
 
           В одной команде DECLARE можно указать более одной пары
 
      имяп:типп. Каждая  пара  действует  как  отдельная  команда
 
      DECLARE с одним параметром. Поэтому, если необходимо,  нап-
 
      ример, передавать косвенной командной процедуре пять  пара-
 
      метров, то сама процедура должна иметь пять соответствующих
 
      пар имяп:типп. Пары всегда обрабатываются в том порядке,  в
 
      каком они указаны.
 
           Число действительных параметров для текущей  командной
 
      процедуры (косвенного командного файла) указывает  символи-
 
      ческое имя %PARCNT.  Например  предположим,  что  командный
 
      файл ABC вызван командой @ABC  111,222,333.  Тогда  %PARCNT
 
      внутри ABC имеет значение три, поскольку при данном  вызове
 
      ABC было передано три  параметра.  %PARCNT  используется  в
 
      командных процедурах, которые могут иметь  различное  коли-
 
      чество действительных параметров. Данное имя можно употреб-
 
      лять только внутри командных файлов,  при  вводе  команд  с
 
      терминала оно является неопределенным.


                                - 299 -
 
                          00152-01 34 07-1
 
 
           Образец формата следующий:
 
      EVALUATE %PARCNT
 
      FOR I=1 TO %PARCNT DO (DECLARE X:VALUE;EVALUATE X )
 
           Следующий  пример  показывает   командную   процедуру,
 
      содержащую команду DECLARE и ее  использование  в  процессе
 
      отладки:
 
      DBG>SET OUTPUT VERIFY        !Включить VERIFY, чтобы коман-
 
                                   !ды из командной процедуры
 
                                   !выводились на экран.
 
      DBG>DEFINE/COMMAND W="@EXAM.COM" !Определение команды W
 
                                       !для выполнения командной
 
                                       !процедуры EXAM.COM.
 
      DBG>SHO SYM/DEFINED W        !Проверка определения W.
 
      DEFINED W
 
         BOUND TO: "@EXAM.COM"
 
         WAS DEFINED/COMMAND
 
      DBG>W OPTIONS                !Выполнение процедуры.
 
      %DEBUG-I-VERIFYICF, ENTERING INDIRECT COMMAND FILE
 
      "WALK.COM"    (вход в косвенный командный файл WALK.COM).
 
      DECLARE P1:ADDRESS           !OPTIONS передается процедуре
 
      EXAMINE P1                   !как P1.
 
      CONV_EX$MAIN\OPTIONS         !Просмотр OPTIONS.
 
           (1):     18
 
           (2):     1
 
           (3):     0
 
           (4):     1
 
           (5):     0
 
           (6):     0
 
           (7):     1
 
           (8):     2


                                - 300 -
 
                          00152-01 34 07-1
 
 
           (9):     0
 
          (10):     0
 
          (11):     0
 
          (12):     0
 
          (13):     0
 
          (14):     0
 
          (15):     0
 
          (16):     0
 
          (17):     0
 
          (18):     1
 
          (19):     0
 
      %DEBUG-I-VERIFYICF, EXITING INDERECT COMMAND FILE
 
      "EXAM.COM" (выход из косвенного командного файла EXAM.COM).
 
 
 
           9.4. Определение дополнительных команд
 
 
           Отладчик обладает  еще  одним  средством,  позволяющим
 
      определять  пользователю  свои  собственные  команды.   Это
 
      делается с помощью команды DEFINE/COMMAND, по которой стро-
 
      ке символов (командной строке) присваивается имя. Когда это
 
      имя появляется в последующей команде отладчика,  оно  заме-
 
      няется на соответствующую  строку  символов.  В  результате
 
      данное символическое имя действует как новая команда отлад-
 
      чика.
 
           Для определения  сложных  команд  может  потребоваться
 
      использование  косвенных  командных  файлов  с  параметрами
 
      (например, DEFINE/COMMAND DUMP="@DUMP.COM"). Более  подроб-
 
      ная информация об об'явлении  параметров  командных  файлов
 
      дана в подразделе 9.3.
 
           Команда DEFINE/COMMAND обеспечивает по существу те  же
 


                                - 301 -
 
                          00152-01 34 07-1
 
 
      самые возможности, что и команда языка DCL "имя:=параметр".
 
           Следующий  пример  показывает,  как  определять  новые
 
      (дополнительные) команды отладчика:
 
      DBG>DEFINE/COMMAND EXN="EXAMINE %NEXTLOC" !Определение ко-
 
                                                !манды EXN.
 
      DBG>SHOW SYM/DEFINED EXN           !Проверка определения
 
      DEFINED EXN                        !команды.
 
         BOUND TO:"EXAMINE %NEXTLOC"
 
         WAS DEFINED/COMMAND
 
      DBG>EX X1                         !Просмотр ячейки.
 
      DISTANCE$MAIN\X1:   0.0000000
 
      DBG>EXN                         !Использование определенной
 
      DISTANCE$MAIN\X2:   0.0000000   !команды EXN для просмотра
 
      DBG>EXN                         !последующих ячеек.
 
      DISTANCE$MAIN\Y1:   0.0000000
 
 
 
           9.5. Определение клавиш
 
 
           Отладчик позволяет изменять функции клавиш малой  кла-
 
      виатуры по своим потребностям. С помощью команд DEFINE/KEY,
 
      SHOW KEY и DELETE/KEY (или UNDEFINE/KEY)  можно  соответст-
 
      венно задать, просмотреть и стереть определения клавиш. Для
 
      использования этих возможностей, необходимо, однако, снача-
 
      ла установить с помощью команды SET MODE KEYPAD режим рабо-
 
      ты с малой клавиатурой. Этот режим позволяет использовать и
 
      предопределенные функции клавиш малой клавиатуры.
 
           Однако большинство функций малой клавиатуры связано  с
 
      командами экранного  режима,  поэтому,  если  есть  желание
 
      использовать все предопределенные функции, необходимо  сна-
 
      чала установить экранный режим (командой SET MODE SCREEN).
 


                                - 302 -
 
                          00152-01 34 07-1
 
 
           9.5.1. Задание определений клавиш
 
 
           Команда DEFINE/KEY  позволяет  пользователю  назначать
 
      свои собственные определения клавиш малой  клавиатуры.  При
 
      нажатии затем такой клавиши строка, связанная  определением
 
      с этой клавишей, помещается в командную  строку  отладчика.
 
      Для связи некоторых атрибутов с представлением клавиши мож-
 
      но  применять  с  командой  DEFINE/KEY  квалификаторы.  Для
 
      использования данной команды  необходимо  установить  режим
 
      работы с малой клавиатурой.
 
           Указанная команда имеет вид:
 
      DEFINE/KEY имя_клавиши "эквивалентная_строка"
 
           Имя_клавиши указывает имя  определяемой  клавиши.  Для
 
      отдельных слов без специальных символов  нет  необходимости
 
      заключать эквивалентную строку в кавычки.
 
           Стандартные имена клавиш, которым можно задать опреде-
 
      ление, перечислены в табл.5.
 
                                                        Таблица 5
 
                     Стандартные имена клавиш
 
      -----------------------------------------------------------
                    !
      Имя клавиши   !     Обозначение клавиши
                    !
      -----------------------------------------------------------
                    !
      PF1           ! красная (для LK201,VT100,VT52)
                    !
      PF2           ! голубая (для LK201,VT100,VT52)
                    !
      PF3           ! черная (для LK201,VT100,VT52)
                    !
      PF4           !        для LK201,VT100
                    !
      KP0,...KP9    ! цифровые клавиши малой клавиатуры от 0 до 9
                    !
      PERIOD        ! точка
                    !
      COMMA         ! запятая
                    !
      MINUS         ! знак минус
                    !


                                - 303 -
 
                          00152-01 34 07-1
 
 
                                              Продолжение табл. 5
      -----------------------------------------------------------
                    !
      Имя клавиши   !     Обозначение клавиши
                    !
      -----------------------------------------------------------
      ENTER         ! ввод
                    !
      E1            ! поиск (для LK201)
                    !
      E2            ! вставить здесь (для LK201)
                    !
      E3            ! удалить (для LK201)
                    !
      E4            ! выбрать (для LK201)
                    !
      E5            ! предыдущий экран (для LK201)
                    !
      E6            ! следующий экран (для LK201)
                    !
      HELP          ! помощь (для LK201)
                    !
      DO            ! выполнить (для LK201)
                    !
      F6,...F20     ! функциональные клавиши (для LK201)
 
           Возможность определять клавиши может сэкономить и вре-
 
      мя и количество  нажатий  на  клавиатуру.  Если,  например,
 
      какая-то команда отладчика (или набор команд)  используется
 
      многократно, то для нее можно  определить  одну  из  клавиш
 
      малой клавиатуры.
 
           Команда DEFINE/KEY обеспечивает те же возможности, что
 
      и аналогичная команда языка DCL.
 
           Следующий пример показывает, как определять клавиши:
 
      DBG>SET MODE KEYPAD           !Режим работы с малой кла-
 
                                    !виатурой
 
      DBG>DEFINE/KEY PF1 "SET STEP/INSTRUCTION"
 
      %DEBUG-I-DEFKEY, DEFAULT KEY PF1 HAS BEEN DEFINED
 
                                    !Определить клавишу PF1.
 
                                    !определение повторяется,
 
                                    !потому что /LOG действует
 
                                    !по умолчанию.
 
      DBG>DEFINE/KEY/TERMINATE PF3 "SET OUTPUT LOG"


                                - 304 -
 
                          00152-01 34 07-1
 
 
      %DEBUG-I-DEFKEY, DEFAULT KEY PF3 HAS BEEN DEFINED
 
                                    !Определить клавишу PF3.
 
                                    !Когда пользователь нажмет
 
                                    !эту клавишу, команда
 
                                    !будет выполняться автомати-
 
                                    !чески, потому что есть ква-
 
                                    !лификатор /TERMINATE.
 
 
 
           9.5.2. Использование определений  клавиш,  назначенных
 
      отладчиком
 
 
           Отладчик обеспечивает ряд определений команд для  кла-
 
      виш малой  (цифровой)  клавиатуры.  Хотя  большинство  этих
 
      определений относится к функциям экранного режима, но  и  в
 
      обычном построчном  можно  использовать  некоторые  клавиши
 
      малой клавиатуры.
 
           Клавиши и их функции показаны в табл.3 и были  описаны
 
      в подразделе 8.6.
 
 
 
           9.5.3. Просмотр определений клавиш
 
 
           Пользователь может просмотреть созданные им  определе-
 
      ния клавиш с помощью команды SHOW KEY:
 
      SHOW KEY [имя_клавиши]
 
           Данная команда обеспечвает те же  возможности,  что  и
 
      аналогичная команда языка DCL.
 
           Для просмотра всех  определений  используется  команда
 
      SHOW KEY/ALL.
 
           На примере показан просмотр определений клавиш:
 
      DBG>SHOW KEY PF1
 
      DEFAULT KEYPAD DEFINITIONS:


                                - 305 -
 
                          00152-01 34 07-1
 
 
      PF2="SET STEP/INSTRUCTION"(ECHO, NOTERMINATE, NOLOCK)
 
                         !Вывод на экран команды, связанной
 
                         !с клавишей PF1.
 
      DBG>SHOW KEY PF3
 
      DEFAULT KEYPAD DEFINITIONS:
 
      PF3="SET OUTPUT LOG" (ECHO, TERMINATE, NOLOCK)
 
                         !Вывод на экран команды, связанной
 
                         !с клавишей PF3.
 
      DBG>SHOW KEY KP3
 
      DEFAULT KEYPAD DEFINITIONS:
 
      KP3="SELECT/SOURCE %NEXTSOURCE"(NOECHO, TERMINATE, NOLOCK)
 
                         !Вывод на экран команды отладчика,
 
                         !связанной с клавишей KP3 по умолчанию.
 
 
 
           9.5.4. Удаление определений клавиш
 
 
           Для удаления (ликвидации) определения клавиши, создан-
 
      ного командой DEFINE/KEY  служат  команды  DELETE/KEY  либо
 
      UNDEFINE/KEY, имеющие вид:
 
         DELETE/KEY [имя_клавиши]
 
         UNDEFINE/KEY [имя_клавиши]
 
           Обе команды обеспечивают  те  же  возможности,  что  и
 
      команда DELETE/KEY языка DCL.
 
           Пример показывает, как удалить или отменить  определе-
 
      ния клавиш малой клавиатуры:
 
      DBG>SET MODE KEYPAD      !Установить режим работы с малой
 
                               !клавиатурой
 
      DBG>DELETE/KEY PF1      !Удалить определение клавиши PF1
 
      %DEBUG-I-DELKEY,DEFAULT KEY PF1 HAS BEEN DELETED
 
      DBG>UNDEFINE/KEY/NOLOG PF3
 


                                - 306 -
 
                          00152-01 34 07-1
 
 
                              !Отмена определения клавиши PF3.
 
                              !Отладчик не выводит на экран
 
                              !сообщения об этом по причине
 
                              !квалификатора /NOLOG.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


                              - 307K -

                        2б.00152-01 34 07-1

    ----------------------------------------------------------- 
    I               Лист регистрации изменений                I
    ----------------------------------------------------------- 
    I Номера листов (страниц)IВсего I       IВходяшийI    I   I
    I------------------------IлистовI    N  I    N   I    IДа-I
    I   IИз- IЗа- I   IАнну- I(стра-I       Iсопрово-IПодпIта I 
    IИзмIме- Iме- IНо-Iлиро- Iниц) вIдокуменIдительноI    I   I
    I   Iнен-Iнен-IвыхIванныхIдокум.I   та  Iго докумI    I   I
    I   Iных Iных I   I      I      I       I и дата I    I   I 
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    ----------------------------------------------------------- 
    I   I    I    I   I      I      I       I        I    I   I
    -----------------------------------------------------------

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!