Турбо отладчик (Turbo Debugger) 3.0

         

зависимая система подсказки  обеспечит  вас


                                  Введение
       -----------------------------------------------------------------
            Турбо отладчик (Turbo Debugger) - это  современный отладчик,
       позволяющий  отлаживать  программы  на  уровне исходного текста и
       предназначенный для программистов,  работающих  на  Турбо  языках
       фирмы  Borland.  Многочисленные перекрывающие друг друга окна,  а
       также сочетание спускающихся и раскрывающихся  меню  обеспечивают
       быстрый, интерактивный пользовательский интерфейс. Интерактивная,
       контекстно- зависимая система подсказки  обеспечит  вас подсказкой
       на всех стадиях работы.
            Ниже перечислены лишь некоторые свойства Турбо отладчика:
            - использование расширенной  памяти  типа  EMS  для  отладки
              больших программ;


            - вычисление  любых выражений языка Си,  C++,  Паскаль и Ас-
              семблера;
            - настраиваемое размещение информации на экране;
            - доступ к Ассемблеру и процессору по мере необходимости;
            - мощные средства использования точек останова  и  протокола
              регистрации;
            - запись нажатий клавиш (макрокоманды);
            - средства обратной трассировки отлаживаемой программы;
            - использование удаленной системы для отладки больших  прог-
              рамм;
            - поддержка  процессора 80386 и аппаратных отладчиков прочих
              изготовителей;
            - полная поддержка  объектно-ориентированного  программирова-
              ния на Турбо Паскаль 5.5 и старше;
            - полная поддержка языка C++ семейства  компиляторов Borland
              C++;
            - возможности  отладки резидентных в памяти программ и драй-
              веров устройств;
            - возможности отладки прикладных программ Microsoft Windows.

       TDeb 3.0 #1-3                 = 9 =
                    Новые свойства и изменения в версии 3.0


       -----------------------------------------------------------------
            Турбо отладчик версии 3.0 содержит некоторые улучшения,  ко-
       торые применимы и к отладке в DOS,  и к отладке в Windows. Другие
       улучшения и изменения касаются только отладки в Windows.
            И к отладке в DOS, и к отладке в Windows применимы следующие
       средства:
            - Буфер вырезанного изображения ("карман") Clipboard  позво-
              ляет вам  выполнять  копирование  из окон в текстовые поля
              ввода или в другие окна. Подробнее это средство описывает-
              ся далее.
            - Имеются новые средства,  касающиеся  точек  останова  (см.
              Главу 7), которые позволяют вам:
                 - устанавливать для точки останова множественные  усло-
                   вия и действия;
                - установка и удаление точек останова в группах;
                - задание точек останова для всех процедур и  функций  в
                  модуле;
               - установка  и  отмена точек останова для всех методов  и
                 объектных типов или для всех функций-элементов в  клас-
                 сах.
            - Поддерживаются шаблоны C++ и вложенные классы.
            - Удаленная отладка позволяет работать как в сети, так и че-
              рез последовательную связь (см. Приложение E).
            - С  помощью  установок  DOS  COUNTRY  или  установок  языка
              Windows поддерживаются сортировки в соответствии с набора-
              ми символов разных стран.
            Следующие средства относятся только к отладке в Windows:
            Окно CPU содержит новую область,  в которой показываются се-
       лекторы защищенного режима,  что позволяет вам просматривать  со-
       держимое ячеек памяти, на которые ссылаются данные селекторы.
            - Драйвер   устройства  TDDEBUG.386  обеспечивает  поддержку
       прерывания программы по клавишам Ctrl-Alt-SysRq.  Кроме того этот


       драйвер устройства  поддерживает  аппаратные  отладочные регистры
       процессора Intel   80386   (и  старше).  Об  установке  программы
       TDDEBUG.386 рассказывается далее. Об аппаратной отладке рассказы-
       вается в соответствующем разделе и в файле HDWDEBUG.TD.
            - Отладка DLL теперь выполняется быстрее, поскольку загружа-

       TDeb 3.0 #1-3                = 10 =
       ется таблица идентификаторов прикладной программы и таблица иден-
       тификаторов любой явно загружаемой DLL или  той  библиотеки  DLL,
       которую вы проходите.

       TDeb 3.0 #1-3                = 11 =
             Требования к аппаратному и программному обеспечению
       -----------------------------------------------------------------
            Турбо отладчик  может  работать на компьютерах семейства IBM
       PC,  включая серии XT, AT и PS/2, а также полностью совместимых с
       ними. Компьютер должен работать под управлением операционной сис-
       темы DOS версии 3.1 или более поздней и иметь  как  минимум  384К
       оперативной  памяти.  Компьютер  может быть оснащен любым цветным
       или монохромным монитором,  поддерживающим режим отображения в 80
       столбцов. Мы рекомендуем использовать компьютер с жестким диском.
       При работе с Турбо отладчиком в системе с двумя  накопителями  на
       гибких дисках этого следует использовать дискеты высокой плотнос-
       ти.  Можно также работать с 3.5-дюймовыми дискетами по 720К. Сле-
       дует отметить,  что программа INSTALL в последнем случае неприме-
       нима, и копирование файлов требуется выполнять самостоятельно.
            Турбо отладчик не требует использования математического соп-
       роцессора 8087.
            Турбо отладчик  работает  со  следующими  продуктами   фирмы
       Borland: Borland С++, Турбо Паскаль версии 5.0 или старше, а так-
       же  Турбо  Ассемблер версии 1.0 или старше.  Прежде чем загружать
       программу в Турбо отладчик, необходимо скомпилировать ее исходный


       текст  в  исполняемый  файл типа EXE в режиме формирования полной
       отладочной информации.
            При запуске отладчика TD необходимо, чтобы были доступны как
       выполняемый файл, так и файлы с исходным текстом программы. Турбо
       отладчик ищет исходные файлы сначала там, где их находил компиля-
       тор при компиляции программы, затем в каталоге, заданном командой
       Options/Path for Source (Параметры/Маршрут  доступа  к  исходному
       файлу), затем в текущем каталоге, и в последнюю очередь в том ка-
       талоге, где находится выполняемый файл типа EXE.
                          Замечания по терминологии
       -----------------------------------------------------------------
            Для удобства и краткости изложения несколько терминов в дан-
       ном руководстве используется в более широком смысле,  чем обычно.
       К ним относятся термины "модуль", "функция" и "аргумент".
            Термин "модуль" в данном руководстве  обозначает  эквивалент
       модуля (module) Си и Ассемблера, а также модуля (unit) Паскаля.
            Термин "функция"  в  данном  руководстве  означает функцию в
       языке Си и то,  что в языке Паскаль называется подпрограммой,  то
       есть охватывает процедуры,функции и объектно-ориентированные пра-
       вила. В языке Си функция может возвращать значение (так же, как и
       функция  в  Паскале),  но  может и не возвращать (как процедура в
       Паскале).  (В Си функция, которая не возвращает значения, называ-
       ется  пустой  (void)  функцией).  Для  краткости изложения термин
       "функция" часто используется для обозначения  как  функций  языка
       Си,  так и функций и процедур языка Паскаль,  конечно,  кроме тех

       TDeb 3.0 #1-3                = 12 =
       разделов руководства, которые посвящены конкретным языкам.
            Термин "аргумент" используется в данном руководстве как  си-


       ноним  термина "параметр".  Он означает как аргументы (параметры)
       командной строки,  так и аргументы  (параметры),  передаваемые  в
       процедуры и функции.

       TDeb 3.0 #1-3                = 13 =
                       Содержание данного руководства
       -----------------------------------------------------------------
            Ниже приведено краткое описание содержания глав и приложений
       данного руководства.
            В Главе  1 "Начало работы" описано содержимое дистрибутивных
       дискет и  сообщается,  как записать файлы Турбо отладчика на свой
       компьютер.  Даются также рекомендации, какую главу читать следую-
       щей, в зависимости от начального уровня знаний.
            В Главе 2 "Отладка и Турбо отладчик" описан пользовательский
       интерфейс отладчика TD,  система меню, окна, объясняется, как от-
       вечать на запросы отладчика и сообщения об ошибках.
            В Главе 3 "Небольшой пример" рассмотрен образец отладки, ко-
       торый  проведет вас по всему сеансу отладки программы, написанной
       либо на Си,  либо на Паскале,  и продемонстрирует многие полезные
       возможности Турбо отладчика.
            В Главе 4 "Запуск Турбо отладчика" рассказано, как запустить
       отладчик из командной строки DOS, для чего используются параметры
       командной строки,  и как записать часто используемые параметры  в
       файл конфигурации.
            В Главе 5 "Управление процессом  выполнения  программы"  де-
       монстрируются различные способы запуска и останова программы, по-
       казывается,  как начать новый сеанс отладки или возобновить  пос-
       ледний сеанс.
            В Главе 6 "Проверка и модификация данных" описаны уникальные
       возможности Турбо отладчика  по  проверке  и  модификации  данных
       внутри отлаживаемой программы.
            В Главе  7 "Точки останова" объясняется концепция "точки ос-


       танова",  охватывающая функции отладчика, которые обычно называют
       точками  прерывания,  точками  слежения или контрольными точками.
       Описаны как условные так и безусловные точки  останова,  а  также
       действия, которые могут выполняться при включении точки останова.
            В Главе 8 "Проверка и модификация файлов" описано,  как про-
       верять и модифицировать исходные файлы программ,  а также  произ-
       вольные дисковые файлы,  содержащие как текстовые, так и двоичные
       данные.
            В Главе 9 "Выражения" описаны синтаксические правила постро-
       ения выражений на языках Си,  C++,  Паскаль и Ассемблер,  которые
       воспринимаются Турбо отладчиком,  а также символы управления фор-
       матом,  которые используются для задания формата  отображения  на
       экране значений выражений.
            В Главе 10 "Отладка С++ и объектно-ориентированного Паскаля"
       рассматриваются специальные средства отладчика, позволяющие прос-

       TDeb 3.0 #1-3                = 14 =
       матривать объекты программ на языке Турбо Паскаль 5.5 и старше, и
       классы программ на языках семейства Borland С++.
            В Главе  11 "Отладка на уровне Ассемблера" описывается,  как
       просматривать содержимое областей памяти в виде неструктурирован-
       ного  шестнадцатиричного  дампа и изменять его,  как использовать
       встроенный Ассемблер и дисассемблер,  как  проверять  и  изменять
       состояние регистров и флагов процессора.
            В Главе 12 "Сопроцессор 80х87 и эмулятор" описано,  как про-
       верять и модифицировать  содержимое  регистров  сопроцессора  или
       состояние его эмулятора.
            В Главе  13 "Справочник по командам отладчика" приведен пол-
       ный перечень всех команд главного меню и  команд  локальных  меню
       всех видов окон.
            В Главе  14 "Отладка программы" описана методика эффективной


       отладки программ.
            В Главе 15 "Виртуальная  отладка  на  машине  с  процессором
       80386" объясняется,  как использовать преимущества дополнительной
       памяти и производительности процессора 80386, позволяя отлаживае-
       мой  программе  использовать  полное  адресное  пространство ниже
       640К, как если бы не был загружен отладчик.
            В Главе 16 "Отладка в защищенном режиме  при  помощи  TD286"
       описано, как использовать TD286 для запуска Турбо отладчика в за-
       щищенном режиме,  освобождая память для отладки больших программ.
            В Главе 17 "Турбо отладчик для Windows (TDW)"  описан запуск
       отладчика TDW и использование его специальных средств.
            В Главе 18 "Отладка прикладной программы для Windows" приво-
       дится пример сеанса отладки при  мера  прикладной  программы  для
       Windows.
            В Главе   19  "Отладка  прикладной  программы,  использующей
       ObjectWindows" показан сеанс отладки примера  программы  Windows,
       написанной с  использованием  Borland  C++ и библиотечного класса
       ObjectWindows.
            В Главе  20  "Отладка  резидентных программ и драйверов уст-
       ройств" объясняется,  как  отлаживать  при помощи Турбо отладчика
       резидентные программы и программы, которые становятся резидентны-
       ми при загрузке, а также как загружать вручную таблицу имен иден-
       тификаторов.
            В Приложении  A  "Параметры командной строки" приведен пере-
       чень всех параметров командной строки, которые подробно описаны в
       Главе 4.
            В Приложении  B  "Технические  замечания" приведены сведения

       TDeb 3.0 #1-3                = 15 =
       для опытных программистов.  В ней описаны подробности  реализации
       отладчика, которые объясняют, как он взаимодействует с отлаживае-
       мой программой и операционной системой DOS.


            В Приложении  C "Ключевые слова встроенного ассемблера" при-
       ведены все мнемонические обозначения команд и  специальные слова,
       которые используются при вводе команд для процессоров 8086/80286/
       80386 и 8087/80287/80387.
            В Приложении D "Настройка Турбо отладчика"  объясняется, как
       использовать программу TDINST для настройки  цветов экрана  и из-
       менения параметров отладчика, используемых по умолчанию.
            В Приложении E "Удаленная отладка" описано, как использовать
       утилиту  WREMOTE  для  удаленной  отладки прикладных программ для
       Windows и утилиту TDREMOTE для отладки  прикладных  программ  для
       DOS. Эти утилиты позволяют отлаживать при помощи отладчика, нахо-
       дящегося на одной машине,  программы, находящиеся на другой маши-
       не.
            В Приложении  F  "Подсказки  и сообщения об ошибках" описаны
       все запросы и сообщения об ошибках,  которые  можно  получить  во
       время отладки, приведены рекомендации, как на них отвечать.
            В Приложении G "Отладка программ на  разных  языках"  даются
       некоторые рекомендации по отладке программ, написанных на Си, Ас-
       семблере или Паскале.
            В Глоссарии  приведен перечень терминов,  наиболее часто ис-
       пользуемых в данном руководстве, и дано их краткое определение.

       TDeb 3.0 #1-3                = 16 =
                  Как обратиться за помощью к фирме Borland
       -----------------------------------------------------------------
            Borland предлагает вам множество услуг, которые позволят от-
       ветить на вопросы о данном программном продукте.  Убедитесь,  что
       вы послали регистрационную карту.  Для зарегистрированных пользо-
       вателей обеспечивается техническое сопровождение, кроме того, они
       могут получать  информацию  обо  всех  изменениях и дополнениях к
       продукту.


                            Ресурсы вашего пакета
       -----------------------------------------------------------------
            Данный пакет содержит много ресурсов,  которые могут вам по-
       мочь:
            - В руководстве  дана информация по каждому аспекту програм-
              мы. Используйте его, как основной источник информации. Из-
              менения  и  дополнения  к руководствам можно найти в файле
              MANUAL.TD.
            - Во время работы с программой для получения справочной  ин-
              формации вы можете нажать клавишу F1.
            - Ответы на общие вопросы,  обзор новых средств,  информация
              об установке содержатся в файле README,  который находится
              в каталоге основного компилятора языка.  В этом файле опи-
              саны также текстовые файлы,  которые  дополняют  материалы
              руководства.
                          Возможности фирмы Borland
       -----------------------------------------------------------------
            Службы технического  сопровождения  фирмы  Borland публикуют
       техническую информацию по множеству тем.  Там вы можете  получить
       ответы на возникшие вопросы.
            TechFax (8000-822-4269)  - это 24-часовая автоматизированная
       служба, позволяющая свободно получить техническую  информацию  по
       факсу. Вы можете запросить до трех документов за один вызов.
            408-439-9096 (модем)  - пересылка файлов (File DownLoad BBS,
       2500 бод).  Через модем вы можете получать образцы файлов,  прик-
       ладных программ  и техническую информацию.  Специальной установки
       не требуется.
            Подписчики информационных услуг CompuServe,  GEnie  или  BIX
       могут получать  техническую  поддержку  с помощью модема.  Чтобы,
       имея доступ к информационной службе, связаться с Borland, исполь-
       зуйте следующую таблицу:

       TDeb 3.0 #1-3                = 17 =
            Оперативные информационные услуги


            -----------------------------------------
            Служба               Команда
            -----------------------------------------
            CompuServe           Go BORLAND
            BIX                  JOIN BORLAND
            GEnie                BORLAND
            -----------------------------------------
            Передачу электронных сообщений адресуйте All или Sysop.  Се-
       рийный номер вам указывать не нужно: если сообщения не посылаются
       по частной системе пересылки, они общедоступны. Включите в вопрос
       максимум информации.  Обслуживающий персонал ответит на сообщение
       в течении одного рабочего дня.
            408-438-5300 - по этому телефону можно обратиться в наш  от-
       дел технического обслуживания по рабочим дням с 6 утра до 5 вече-
       ра. Звоните пожалуйста по телефону, который находится недалеко от
       компьютера с работающей программой.  Прежде чем позвонить, подго-
       товьте следующую информацию:
            1. Название продукта и  серийный  номер  вашей  оригинальной
               дистрибутивной дискеты.  Этот номер обязателен,  иначе мы
               не сможем обслужить вашу заявку.
            2. Номер версии вашего продукта. Номер версии Турбо отладчи-
               ка  выводится на дисплей после исходной загрузки програм-
               мы,  до того,  как вы нажмете какие-либо клавиши. Если вы
               находитесь  в  системе  Турбо  отладчика,  выберите пункт
               About из меню Ё (System).
            3. Семейство и модель компьютера,  а также любого используе-
               мого вами дополнительного аппаратного обеспечения.
            4. Название и номер версии операционной системы. (Номер вер-
               сии можно определить,  введя по приглашению  DOS  команду
               VER).
            5. Содержимое вашего файла AUTOEXEC.BAT.
            6. Содержимое вашего файла CONFIG.SYS.
            7. Содержимое  файлов WIN.INI и SYSTEM.INI,  расположенных в


       каталоге Windows (для вопросов, касающихся TDW).
            8. Если звонок связан с какой-то проблемой, какие шаги нужно
       выполнить, чтобы возникла эта проблема.
            По телефону  408-438-5300 с 7 до 17 часов вы можете получить
       ответы на нетехнические вопросы,  включая цены,  изменения и т.д.
       (служба покупателя).

       TDeb 3.0 #1-3                = 18 =
                          Рекомендуемая литература
       -----------------------------------------------------------------
            Многие ведущие издательства поддерживают программные продук-
       ты фирмы Borland широким выбором замечательных книг по этим  про-
       дуктам, от предназначенных для начинающих пользователей, и кончая
       предназначенными для опытных специалистов. Кроме того, существует
       еще  ряд книг по другим темам,  например программирование в среде
       Windows, с которыми также следует ознакомиться.
                Турбо отладчик и средства разработки программ
       -----------------------------------------------------------------
            Ниже приводится несколько названий книг, содержащих дополни-
       тельную информацию по  Турбо  отладчику  и  средствам  разработки
       программного обеспечения:
            Ackerman,Charles. Turbo Debugger and Tools:  A Self-Teaching
       Guide, John Wiley and Sons (New York:1990).
            Swan,Tom. Mastering  Turbo Assembler,  Howard W.Sams and Co.
       (Carmel,IN: 1989).
            Swan,Tom. Mastering Turbo Debugger and Tools,  Howard W.Sams
       and Co. (Carmel,IN: 1990).
            Syck,Gary. The  Waite Group's Turbo Assembler Bible,  Howard
       W.Sams and Co. (Carmel,IN: 1990).
                         Книги по Microsoft Windows
       -----------------------------------------------------------------
            Следующие издания содержат сведения о том,  как следует  пи-
       сать прикладные программы для Windows:
            Microsoft staff.


Microsoft Windows Software Development Kit,
       Guide to Programming, Microsoft Corporation. (Redmond, WA: 1990).
            Microsoft staff. Microsoft Windows Software Development Kit,
       Reference, Vols  1 and 2,  Microsoft Corporation.  (Redmond,  WA:
       1990).
            Microsoft staff. Microsoft Windows Software Development Kit,
       Tools, Microsoft Corporation. (Redmond, WA: 1990).
            Petxold, Charles.   Programming  Windows,  Microsoft  Press.
       (Redmond, WA: 1990).

       TDeb 3.0 #1-3                = 19 =
                           Глава 1. Начало работы
       -----------------------------------------------------------------
            Пакет компилятора языка фирмы Borland включает в  себя набор
       дистрибутивных дискет и данное "Руководство пользователя по Турбо
       отладчику" (Turbo Debugger User's Guide).  Дистрибутивные дискеты
       содержат все программы,  файлы и утилиты, необходимые для отладки
       программ, написанных на языках Borland  C++,  Турбо  Ассемблер  и
       Турбо Паскаль. Кроме этого, пакет Турбо отладчика содержит в фай-
       лах  README,  FREELIST.DOC,  HELPME!.TD,   MANUAL.TD,   UTILS.TD,
       HDWDEBUG.TD и DBGGBOARD.TD документацию по вопросам,  не освещен-
       ным в данном руководстве.
            Руководство пользователя  по  Турбо  отладчику  обеспечивает
       последовательное ознакомление с возможностями Турбо  отладчика  и
       полный справочник команд отладчика.
            Если вы  до сих пор не знакомы с положением о лицензировании
       продуктов Borland,  ознакомьтесь с вашей копией договора. Вышлите
       на фирму  заполненную  регистрационную  карту  на ваш продукт,  и
       тогда фирма будет высылать вам уведомления о  любых  модификациях
       данного продукта и новых доступных продуктах.
                           Дистрибутивные дискеты
       -----------------------------------------------------------------
            При установке Турбо отладчика на свою машину вы будете копи-


       ровать  дистрибутивные  дискеты на рабочие дискеты или на жесткий
       диск.  Вы  можете  запустить  специальную   программу   установки
       INSTALL.EXE,  которая  находится на одной из ваших дистрибутивных
       дискет.  Дистрибутивные дискеты отформатированы под дисководы для
       двухсторонних  дискет  с  двойной  плотностью записи и могут быть
       прочитаны на персональном компьютере семейства IBM PC и совмести-
       мых с ними.  Программа Install копирует все файлы документации  в
       подкаталог DOC    основного   каталога   компилятора,   например,
       C:\BORLANDC\DOC.
            Список файлов,  поставленных вам на дистрибутивных дискетах,
       см. в файле FILELIST.DOC на дискете Installation.
                                 Файл README
       -----------------------------------------------------------------
            Очень важно,  чтобы прежде чем начать что-либо делать в сис-
       теме Турбо отладчика,  вы нашли время ознакомиться  с  содержимым
       файла README,  который находится на дискете Installation (устано-
       вочный диск). Этот файл содержит самую свежую информацию, которой
       может не быть в данном руководстве. Кроме того, в нем перечислены
       все файлы, имеющиеся на дистрибутивных дискетах, с кратким описа-
       нием каждого из них.
            Для того чтобы прочитать содержимое файла README, надо вста-

       TDeb 3.0 #1-3                = 20 =
       вить дискету Installation в дисковод A, сделать его текущим, вве-
       дя с клавиатуры команду A: и, нажав клавишу Enter, затем ввести с
       клавиатуры README и нажать Enter еще раз.  После того, как загру-
       зится файл README,  его содержимое можно прокручивать на экране с
       помощью клавиш "Стрелка вверх" и "Стрелка вниз".  Для  завершения
       просмотра надо нажать клавишу Esc.
                              Файл HELPME!.TD
       -----------------------------------------------------------------


            На дискете Installation имеется файл  HELPME!.TD, содержащий
       ответы на вопросы, которые часто возникают у пользователей. Обра-
       щайтесь к этому файлу, когда у вас возникнут какие-либо затрудне-
       ния. Кроме всего прочего,  файл HELPME!.TD содержит информацию по
       следующим вопросам:
            - вывод на экран для программ,  работающих в  графическом  и
              текстовом режимах;
            - выполнение других программ, не выходя из отладчика;
            - прерывание выполнения и выход из отлаживаемой программы;
            - синтаксические  и  грамматические  отличия Турбо отладчика
              от Турбо языков;
            - отладка программ, использующих несколько языков, с помощью
              Турбо отладчика;
            - Tandy 1000A,  IBM PC Convertible или NEC MultiSpeed и про-
              чие компьютеры,  использующие NMI (немаскируемые  прерыва-
              ния).
                               Файл MANUAL.TD
       -----------------------------------------------------------------
            Чтобы ознакомиться с последними изменениями и дополнениями к
       данному руководству, прочтите файл MANUAL.TD.
                           Утилиты Турбо отладчика
       -----------------------------------------------------------------
            Пакет Турбо отладчика поставляется с  несколькими утилитами.
       Подробная информация об этих утилитах находится на дистрибутивных
       дискетах. Доступ к этой информации описан в файле README.
            Ниже приводится краткое описание утилит Турбо отладчика:
            - Утилита для связи с файлами на удаленной системе TDRF.EXE,
              работающая вместе с отладчиком и позволяющая передавать на
              удаленную систему основные команды управления файлами.
            - Утилита    удаления    таблицы    имен    идентификаторов,

       TDeb 3.0 #1-3                = 21 =
              TDSTRIP.EXE, позволяет удалить отладочную информацию (таб-


              лицу имен идентификаторов) из вашей программы без  повтор-
              ной компоновки.
              Примечание: Утилиту  TDSTRIP можно использовать для подго-
              товки к отладке файлов COM.
              Типичное использование этой  утилиты  состоит  в  создании
              файлов .TDS,  используемых для отладчик файлов .COM.  Пос-
              кольку полученный с помощью компилятора файл .COM не соде-
              ржит таблицу идентификаторов,вы можете отладить его, толь-
              ко если сделаете следующее:  скомпилируете исходный код  с
              включением  отладочной  информации  в  односегментный файл
              .EXE,  затем запустите для него утилиту TDSTRIP. Если файл
              .EXE  можно  преобразовать  в файл .COM,  утилита  TDSTRIP
              создает файл .COM и файл .TDS.  После этого вы может отла-
              живать файл .COM, используя для него файл .TDS.
            - TDMAP.EXE  позволяет  добавлять в файл .EXE отладочную ин-
              формацию из соответствующего файла .MAP для отладки выпол-
              няемой программы,  полученную с использованием компилятора
              или компоновщика иной фирмы, нежели Borland.
            - TDDEV.EXE выводит на дисплей таблицу,  в которой  показана
              информация о драйверах устройств.
            - Утилита  TDMEM.EXE  выводит на дисплей таблицу,  в которой
              показано текущее использование и  доступность  оперативной
              памяти,  включая  расширенную  (expanded) и дополнительную
              (extended) память.
            - Утилита TDUMP.EXE - это дисассемблер объектных  модулей  и
              файлов .EXE.
            - Кроме того, имеется небольшая резидентная программа TDNMI.
              COM,  сбрасывающая триггер срабатывания прерываний при ис-
              пользовании платы Periscope I.
            Для того,    чтобы   получить   список   параметров   утилит
       TDCONVRT.EXE,  TDRF.EXE,  TDSTRIP.EXE,  TDPACK.EXE, TDMAP.EXE или


       TDUMP.EXE,  наберите имя соответствующей команды и нажмите Enter.
       Например,  для  получения  параметров  командной  строки  утилиты
       TDMAP.EXE, введите команду:
            TDMAP

       TDeb 3.0 #1-3                = 22 =
                          Установка Турбо отладчика
       -----------------------------------------------------------------
            На дискете Installation имеется программа INSTALL.EXE, кото-
       рая поможет вам установить  Турбо отладчик версии 3.0 на свою ма-
       шину. Общая информация об установке находится в файле README.
                Установка TDDEBUG.386 для использования c TDW
       -----------------------------------------------------------------
            На ваших  установочных  дискетах  имеется  файл TDDEBUG.386,
       обеспечивающий те  же  функциональные  возможности,  что  и  файл
       Windows SDK. Кроме того, он обеспечивает поддержку аппаратных от-
       ладочных регистров процессора 80386 (и старше).
            Программа установки должна  скопировать  этот  файл  на  ваш
       жесткий диск  и  изменить  файл  Windows SYSTEM.INI.  После этого
       Windows вместо WINDEBUG.386 будет загружать TDDEBUG.386. Если ус-
       тановочная программа не сможет этого сделать,  она сообщит вам об
       этом. Тогда вам придется это сделать самостоятельно:
            1. Установочная программа должна копировать на  жесткий диск
               с установочной дискеты файл TDDEBUG.386.  Стандартным ка-
               талогом для этого файла является C:\BORLAND\BIN.  Если вы
               перепишете  этот файл в другой каталог,  подставьте его в
               инструкциях.
            2. С помощью редактора  откройте  файл  Windows  SYSTEM.INI,
               найдите  []386nh]  и  добавьте  с  раздел 386nh следующую
               строку:
                  device*cc:\borlandc\bin\tddebug.386
            3. Если в секции 386nh  имеется  строка,  которая  загружает
               WINDEBUG.386,  то закомментируйте эту строку точкой с за-


               пятой,  или удалите ее  совсем.  (Одновременно  загружать
               TDDEBUG.386 и WINDEBUG.386 нельзя.)
               Например, если вы загружаете WINDEBUG.386 из каталога C:\
               WINDOWS, то комментируемой строкой будет:
                 ;device=c:\windows\windebug.386
                             Аппаратная отладка
       -----------------------------------------------------------------
            Если у  вас  есть  плата  для  аппаратной отладки (например,
       Arton,  Periscope,  Purart Trapper и
т.д.) или аппаратный драйвер
       устройства,  вы можете использовать их совместно с Турбо отладчи-
       ком. Обратитесь к изготовителю  относительно  совместимости  этой
       платы с Турбо отладчиком.

       TDeb 3.0 #1-3                = 23 =
            Информацию об  интерфейсе между платами аппаратной отладки и
       Турбо отладчиком можно найти в файле DBGBOARD.TD.
                       Средства аппаратной отладки DOS
       -----------------------------------------------------------------
            При работе на компьютере с процессором 80386  можно  устано-
       вить драйвер устройства TDH386.SYS,  который поставляется с Турбо
       отладчиком.  Этот драйвер позволяет существенно ускорить работу с
       точками  останова,  которые следят за изменениями содержимого об-
       ластей памяти и доступом к порту ввода-вывода.
            Скопируйте этот файл в каталог,  где у вас хранятся драйверы
       устройств, и добавьте в файл CONFIG.SYS строку следующего вида:
            DEVICE=\SYS\TDH386.SYS
            При следующей загрузке Турбо отладчика он сможет найти и ис-
       пользовать этот драйвер устройства.
            Примечание: Подробнее  о TD386 и TDH386.SYS рассказывается в
       Главе 15.
            Для получения подробной информации об интерфейсе этого драй-
       вера устройства обратитесь к поставляемой на  диске  документации
       об аппаратном интерфейсе отладчика (файл HDWDEBUG.TD).


             Аппаратная отладка для прикладных программ Windows
       -----------------------------------------------------------------
            Отладочные регистры процессора Intel 80386 (или старше) мож-
       но использовать для отладки программ Windows.  Чтобы использовать
       эти регистры,  нужно  загрузить  при  запуске Windows TDDEBUG.386
       (см. выше) и,  конечно, использовать для отладки программы отлад-
       чик TDW.
            Более подробно  об отладке прикладных программ Windows расс-
       казывается в файле HDWDEBUG.TD.

       TDeb 3.0 #1-3                = 24 =
                             Что делать дальше?
       -----------------------------------------------------------------
            После того,  как вы скопируете все  необходимые  для  работы
       файлы, вы можете приступить к изучению Турбо отладчика. Поскольку
       данное руководство рассчитано на две различные группы пользовате-
       лей,  то  в зависимости от того,  к какой группе вы принадлежите,
       вам могут понадобиться разные главы.  Приведенные ниже рекоменда-
       ции помогут вам выбрать необходимый материал.
                    Программистам, изучающим Турбо языки
       -----------------------------------------------------------------
            Если вы только начинаете изучать один  из  Турбо языков,  то
       прежде чем осваивать Турбо отладчик, вы, вероятно, захотите иметь
       возможность писать на этом языке небольшие  программы.  Необходи-
       мость отладки реальных программ,  написанных вами, и приведет вас
       к практическому изучению Турбо отладчика.  После того, как вы по-
       лучите знания,  необходимые для программирования на данном языке,
       прочтите Главу  3,  "Небольшой пример",  которая познакомит вас с
       основными функциями Турбо отладчика.  Вы изучите основные возмож-
       ности отладчика, которые вам понадобятся для отладки своей первой
       программы.  В следующей главе рассмотрены более  сложные  функции


       отладчика.
             Программистам, имеющим опыт работы на Турбо языках
       -----------------------------------------------------------------
            Если вы  уже  имеете  опыт программирования на одном из Тур-
       бо-языков, вы можете начать с изучения новых  особенностей  среды
       Турбо отладчика, которые описаны в Главе 2. Если это соответству-
       ет вашему стилю работы вы можете проработать учебное руководство,
       либо  же можете сразу перейти к Главе 4 "Запуск Турбо отладчика".
       Полный перечень  команд  отладчика  приведен  в Главе 13 "Команды
       Турбо отладчика".

       TDeb 3.0 #1-3                = 25 =
                      Глава 2. Отладка и Турбо отладчик
       -----------------------------------------------------------------
            Отладка -  это  процесс  нахождения  и  исправления ошибок в
       программе. Нет ничего необычного в том, что поначалу поиск и уст-
       ранение ошибок занимают больше времени,  чем написание программы.
       Отладка не является точной наукой.  Часто лучшее средство отладки
       находится в голове у программиста.  Тем не менее, систематический
       метод отладки может дать некоторые преимущества.
            Процесс отладки в общем случае  можно  разделить  на  четыре
       этапа:
            1. Обнаружение ошибки.
            2. Поиск ее местонахождения.
            3. Определение причины ошибки.
            4. Исправление ошибки.
                             Обнаружение ошибки
       -----------------------------------------------------------------
            Первый этап является наиболее очевидным. Компьютер либо "за-
       висает" во время работы программы,  либо происходит сбой, который
       проявляется в выдаче на экран бессмысленной информации. Однако, в
       некоторых  случаях ошибка не проявляется так очевидно.  Программа
       может работать хорошо до тех пор, пока не будет введено некоторое


       число  (например,  0 или отрицательное число),  или пока не будет
       тщательно проверена выдаваемая ею информация.  Только после такой
       проверки можно обнаружить, что результат отличается от ожидаемого
       в 2 раза,  или что в середине списка имен стоят неправильные ини-
       циалы.
                              Нахождение ошибки
       -----------------------------------------------------------------
            Второй этап иногда является самым трудным.  Он заключается в
       том,  чтобы найти место в программе, где находится ошибка. Просто
       невозможно держать в голове всю программу сразу (если  эта  прог-
       рамма не очень маленькая). Лучший подход - это "разделяй и власт-
       вуй",  то есть разбивать программу на части и отлаживать  их  от-
       дельно  друг  от  друга.  Структурное  программирование  идеально
       подходит для такой отладки.

       TDeb 3.0 #1-3                = 26 =
                         Определение причины ошибки
       -----------------------------------------------------------------
            Третий этап,  выяснение причины ошибки,  возможно,  является
       второй наиболее трудной стадией отладки.  После того,  как  будет
       определено  местонахождение  ошибки,  обычно становится несколько
       проще определить причину неправильной работы программы. Например,
       если  вы  определили,  что  ошибка находится в процедуре с именем
       PrintNames, вам достаточно просмотреть текст только этой процеду-
       ры,  а не всей программы. Но даже в этом случае ошибка может ока-
       заться настолько "неуловимой",  что вам придется немного поэкспе-
       риментировать, прежде чем вы сможете ее найти.
                             Исправление ошибки
       -----------------------------------------------------------------
            Последний этап заключается в исправлении  ошибки.  Вооружив-
       шись  знанием  языка  программирования  и знанием местонахождения


       ошибки,  вы устраняете ее.  После этого вы снова запускаете прог-
       рамму,  ждете появления следующей ошибки, и процесс отладки начи-
       нается снова.
            Примечание: Более  подробное  рассмотрение  процесса отладки
       см. в Главе 14.
            При написании программы процесс,  состоящий их этих  четырех
       этапов, повторяется многократно. Например, многочисленные синтак-
       сические ошибки не позволяют откомпилировать программу,  пока все
       они не будут исправлены. Компиляторы фирмы Borland имеют встроен-
       ные средства проверки синтаксиса, которые информируют программис-
       та об ошибках такого типа и позволяют тут же их исправлять.
            Однако есть ошибки гораздо более тонкие и коварные, чем син-
       таксические.  Они не проявляются до тех пор,  пока вы не  введете
       отрицательное число, либо являются настолько неуловимыми, что за-
       гоняют вас в тупик.  Здесь-то вам и придет на помощь Турбо отлад-
       чик.
                     Что может вам дать Турбо отладчик?
       -----------------------------------------------------------------
            Автономный Турбо отладчик дает вам доступ  к  гораздо  более
       мощным средствам отладки,  чем те, которые имеются в самом компи-
       ляторе.
            Примечание: Добавление такого мощного отладчика к компилято-
       ру слишком сильно увеличило бы его размер.
            Турбо отладчик можно использовать для отладки любой програм-
       мы на языке Си или C++ для компилятора семейства  Borland,  Турбо
       Паскале,  Турбо Ассемблере.
            Турбо отладчик можно использовать для решения двух  трудней-

       TDeb 3.0 #1-3                = 27 =
       ших проблем процесса отладки: поиска места нахождения ошибки и ее
       причины. Турбо отладчик поможет вам преодолеть  эти  трудности  с
       помощью  исключительных  возможностей  по  замедлению  выполнения
       программы, благодаря чему вы можете исследовать  состояние  прог-


       раммы  в  любой заданной точке.  Вы даже можете тестировать новые
       значения переменных,  чтобы увидеть, как они воздействуют на вашу
       программу.  Эти  возможности  реализуются  с помощью трассировки,
       пошагового выполнения, просмотра, изменения и прослеживания.
       ------------------------------------------------------------------
       Трассировка          Вы  можете выполнять программу по одному опе-
                            ратору.
       Обратная трассировка Вы можете выполнить код в  обратном порядке.
       Пошаговое выполнение Вы можете выполнять программу по одному опе-
                            ратору,  но  пропускать  вызовы  процедур  и
                            функций. Если вы уверены, что что в процеду-
                            рах и функциях нет ошибок, то пропуск их вы-
                            зовов увеличит скорость отладки.
       Просмотр             Вы можете  запросить  Турбо отладчик создать
                            специальное окно для показа  самых различных
                            вещей - переменных, их значений, точек оста-
                            нова, содержимого стека, файлов регистрации,
                            данных,  файлов исходных текстов,  кодов ЦП,
                            памяти,  регистров,  информации  процессора,
                            арифметики с плавающей точкой,  вывода прог-
                            раммы.
       Проверка             Вы можете запросить Турбо  отладчик получить
                            содержимое  сложных структур данных из вашей
                            программы.
       Изменение            Можно изменить  содержимое  переменной  (как
                            локальной, так и глобальной) на новое значе-
                            ние.
       Прослеживание        Вы можете выделить некоторые программные пе-
                            ременные  и прослеживать изменение их значе-
                            ний в процессе работы программы.


       -----------------------------------------------------------------
            Можно использовать эти мощные средства для  разделения вашей
       программы на некоторые фрагменты,  подтверждать работоспособность
       которых вы можете поочередно.  Таким образом, вы сможете просмот-
       реть всю программу, независимо от ее величины и сложности, и най-
       ти ошибку. Может быть вы найдете функцию,которая неверно изменяет
       значение  переменной,  или  неправильную рекурсию,  или попадание
       программы в бесконечный цикл.  В любом случае Турбо отладчик зна-
       чительно поможет вам найти и определить тип ошибки.
            В Турбо отладчик версии 2.0 и старше внесены улучшения, поз-

       TDeb 3.0 #1-3                = 28 =
       воляющие выполнять отладку объектно-ориентированных программ Пас-
       каля и С++. Он позволяет работать с объектами и классами. Он кор-
       ректно обрабатывает позднее связывание  виртуальных  методов  или
       функций-элементов, поэтому отладчик всегда выполняет и выводит на
       экран корректный код.

       TDeb 3.0 #1-3                = 29 =
                    Что Турбо отладчик не сможет сделать
       -----------------------------------------------------------------
            Познакомившись со всеми этими возможностями Турбо отладчика,
       вы можете подумать, что он может все. В действительности есть как
       минимум три вещи, которые Турбо отладчик не сможет сделать:
            - Он не имеет встроенного редактора  текстов  для  изменения
              вашей исходной программы.  Большинство программистов имеет
              свои излюбленные редакторы, и вполне довольны ими. Было бы
              расточительством  памяти  включать  какой-либо  редактор в
              Турбо отладчик. Однако вы можете легко передать управление
              вашему  текстовому  редактору,  выбрав  глобальную команду
              Edit (Редактирование) окна File (Файл) (о локальных коман-


              дах  рассказывается далее).  Турбо отладчик использует ре-
              дактор,  который задается с  помощью  программы  установки
              TDINST. Если в вас имеется компилятор Borland C++, то мож-
              но использовать для запуска Турбо отладчика из  интегриро-
              ванной  интерактивной  среды программирования Турбо языков
              новое средство передачи (Transfer).
            - Турбо  отладчик не может перекомпилировать вашу программу.
              Для этого вам нужен компилятор  (например,  Турбо  Паскаль
              или Borland C++).
            - Турбо  отладчик не сможет заменить процесс обдумывания. Во
              время отладки вашим главным инструментом  является  мысль.
              Турбо  отладчик является мощным средством,  но при отсутс-
              твии ее он не экономит ни время, ни усилия.
                       Как работает Турбо отладчик
       -----------------------------------------------------------------
            Турбо отладчик TDW обеспечивает вас всеми мощными и сложными
       средствами, сохраняя при этом простоту в использовании.
            В TDW  мощность  и  расширенный набор средств сопровождается
       превосходной операционной средой. о которой подробнее рассказыва-
       ется в следующем разделе.
                         Достоинства Турбо отладчика
       ------------------------------------------------------------------
            Мы надеемся, что начав использовать Турбо отладчик, вы скоро
       не сможете без него обойтись.  Турбо отладчик специально разраба-
       тывался настолько простым и удобным,  насколько это возможно. Для
       достижения этой цели в него были заложены  следующие возможности:
            - Удобная и логичная система глобального меню.
            - Контекстно-зависимые локальные меню,  которые практически
              делают ненужным запоминание и ввод команд.

       TDeb 3.0 #1-3                = 30 =
            - Диалоговые окна,  в которых вы можете выбирать, устанавли-


              вать и переключать параметры, а также вводить информацию.
            - Когда вам надо ввести что-либо с клавиатуры,  Турбо отлад-
               чик предоставляет вам сохраненный список  текстов, которые
              вы уже вводили в подобных ситуациях. Вы можете выбрать лю-
              бой текст из этого списка,  отредактировать его или ввести
              новый текст.
            - Полная  поддержка  макрокоманд,  позволяющая ускорить ввод
              последовательности команд или нажатий клавиш.
            - Копирование и вставка между окнами и диалоговыми окнами.
            - Удобное и полное управление окнами.
            - Поддержка устройства "мышь".
            - Доступ к нескольким типам интерактивной подсказки.
            - Запись сеанса и выполнение в обратной последовательности.
            В оставшейся части данной главы рассмотрены эти  шесть  осо-
       бенностей пользовательского интерфейса Турбо отладчика.
                           Меню и диалоговые окна
       -----------------------------------------------------------------
            В Турбо отладчике,  как и во многих продуктах фирмы Borland,
       используются удобная система глобальных меню, доступных из строки
       меню, выводимой в верхней части экрана.  За исключением того  мо-
       мента, когда активно диалоговое окно, система меню всегда доступ-
       на.
            Если вам необходимо что либо набрать на клавиатуре, то Турбо
       отладчик сохраняет текст, который вы набрали в подобной ситуации.
       Вы можете выбрать подходящий текст из протокола (списка регистра-
       ции), отредактировать его или ввести новый.
            Турбо отладчик обеспечивает полную поддержку макрокоманд для
       ускорения ввода последовательностей команд и  нажатий  клавиш,  а
       также  полное управление окнами и доступ к нескольким типам спра-
       вочников.
                        Использование главного меню
       -----------------------------------------------------------------


            Как и многие продукты фирмы Borland,  Турбо  отладчик  имеет
       удобную систему меню, которые доступны из горизонтального меню на
       верхней строке экрана (основное или главное меню).  Главное гори-
       зонтальное меню доступно всегда,  независимо от того,  какое окно
       активно (т.е.  в каком окне находится курсор).

       TDeb 3.0 #1-3                = 31 =
            Для каждого  пункта (команды) главного меню имеется спускаю-
       щееся меню. С помощью спускающегося меню вы можете:
            - Выполнить команду.
            - Открыть всплывающее меню. Это меню выводится после
              выбора элемента меню, за которым следуется отметка (>).
            - Открыть  диалоговое окно.  Это окно открывается,  когда вы
              выбираете элемент  меню,  за  которым  следует  многоточие
              (...).
                             Использование меню
       -----------------------------------------------------------------
            Существует 4 способа выбора пунктов из главного меню:
            - Нажать F10,  подвести курсор к требуемому элементу меню  и
              нажать клавишу Enter.
            - Нажать клавишу F10 и клавишу с первой буквой элемента меню
              (F, V, R, B, D, O, W, H).
            - Нажать клавишу Alt одновременно с первой  клавишей  пункта
              (элемента) меню (F,  V,  R, B, D, O, W, H) для активизации
              выбранного меню команд.  Например,  в любом месте  системы
              нажатие  клавиш  Alt-F  переместит вас в меню File (Файл).
              Меню Ё (System) будет открыто при нажатии клавиш  Alt-про-
              бел.
            - Выбрать  элемент  (пункт) меню с помощью манипулятора типа
              "мышь" и нажать кнопку.
            Для перемещения по всем меню,  кроме  главного,  используйте
       следующие клавиши:
            Используйте стрелки  вправо/влево  для перемещения от одного
       спускающегося меню к другому (например, когда вы находитесь в ме-


       ню File, нажатие стрелки влево переместит вас в меню View).
            Для перемещения  по  командам  конкретного  меню используйте
       стрелки вверх и вниз.
            Используйте клавиши Home и End для перемещения  к  первой  и
       последней альтернативам (командам) меню, соответственно.
            Для перемещения  в  меню  или  диалоговое окно более низкого
       уровня (всплывающее меню) используется клавиша Enter.
            С этой же целью можно использовать "мышь",  поместив  указа-
       тель на нужную команду и нажав кнопку.
            Выйти из меню или системы меню можно следующим образом:

       TDeb 3.0 #1-3                = 32 =
            - Нажмите клавишу Esc для выхода из меню и возврата в преды-
              дущее меню.
            - Нажимайте клавишу Esc - если вы находитесь в  меню второго
              уровня, это позволяет выйти из системного меню возвратить-
              ся в предыдущее активное окно.
            - F10 для возврата из меню любого уровня в предыдущее актив-
              ное окно.
            - Чтобы  выйти  из системы меню и вернуться в активное окно,
              нажмите в этом окне кнопку "мыши".
            Некоторые команды главного  (основного)  меню  соответствуют
       оперативным  клавишам  (сокращения  команд).  Там,  где возможно,
       обозначения оперативных клавиш изображаются справа от альтернати-
       вы меню.
            Рисунок 13.1 в Главе 13 показывает полное дерево спускающих-
       ся меню для Турбо отладчика TDW. В Таблица 13.1 перечисляются все
       функциональные клавиши.  Перечень всех команд Турбо отладчика TDW
       также приведен в Главе 13.

       TDeb 3.0 #1-3                = 33 =
                              Диалоговые окна
       -----------------------------------------------------------------
            Многие команды Турбо отладчика доступны с помощью диалоговых
       окон. Диалоговое окно может содержать один или более из следующих


       элементов:
       -----------------------------------------------------------------
            -----------¬     Программные   "кнопки"  представляют  собой
            ¦          ¦-    "теневой" текст  (на  монохромных  системах
            ¦          ¦-    он отображается  в  обратном  видеорежиме).
            L------------    Если   вы  выберите   переключатель,  Турбо
              -----------    отладчик немедленно выполнит соответствующее
                             щее действие.  Для подтверждения вашего вы-
                             бора выходите из диалоговых окон  с помощью
                             "кнопки"   с  отметкой  OK.  Для  отмены  -
                             Cancel.  Диалоговые окна содержат также пе-
                             реключатель  (функциональную  кнопку) Help,
                             по которому выводится  справочная  информа-
                             ция.  Вместо "кнопки" OK можно использовать
                             оперативные клавиши Alt-K.
            [X]              Многопозиционные    переключатели    (блоки
                             проверки) - это переключатели, работающие в
                             режиме "включено/выключено". Их можно выби-
                             рать  для  включения/выключения  параметра.
                             При включенном состоянии в квадратных скоб-
                             ках появляется X: [X].
            ( )              Селективные    переключатели      позволяют
            (.)              выбрать одну из нескольких  установок.  При
            ( )              этом в круглых  скобках  появляется  жирная
                             точка.
            -------------¬   Рамки (окна) ввода выводятся для того, что-
            ¦_           ¦   бы вы могли  ввести  строку в ответ на под-
            L-------------   сказку. С окном (рамкой) подсказки связыва-
                             ется обычно протокол ввода.


          ---------------¬   Окна списка  содержат список элементов, из
          ¦ THISFILE.EXE ¦   которых вы можете сделать выбор (например,
          ¦-THATFILE.EXE-¦   мер, список  файлов,  которые  нужно  отк-
          ¦ TOTHERTL.EXE ¦   крыть).
          L---------------
       ----------------------------------------------------------------
            Перемещаться по диалоговым окнам можно с помощью  клавиш Tab
       и Shift-Tab. Для выбора нужного элемента или "кнопки" используйте
       клавиши стрелок, затем нажмите клавишу Enter.
            Для этой цели можно также использовать  "мышь".  Для  выбора
       диалогового окна переместите указатель в его верхних левый угол и
       нажмите кнопку "мыши".

       TDeb 3.0 #1-3                = 34 =
            Элементы можно  также  выбирать с помощью оперативных клавиш
       (подсвеченная буква в каждой команде).
                         Контекстно-зависимая работа
       -----------------------------------------------------------------
            В дополнение к удобной системе  Borland  спускающихся  меню,
       Турбо  отладчик имеет достоинства,  которые уменьшают возможность
       ошибки и сокращают процесс изучения путем  сокращения  последова-
       тельности меню.
            Для понимания  этих  возможностей  вы должны запомнить,  что
       Турбо отладчик является  контекстно-зависимой  программой.  Турбо
       отладчик запоминает, какое окно вы открыли, какой текст выбрали и
       в какой части окна находится курсор.  Другими словами,  он  точно
       знает, на  что  вы смотрите и где находится курсор при выборе ко-
       манды.  Он использует эту информацию при реагировании на вашу ко-
       манду.  Рассмотрим  пример для иллюстрации этого фундаментального
       вопроса.
            Предположим в вашей программе на Паскале есть следующий опе-
       ратор:
               MyCounter[TheGrade] := MyCounter[TheGrade] + 1;
            Как вы  увидите,  при работе с Турбо отладчиком получить ин-


       формацию о структуре данных достаточно просто:  вам нужно  только
       нажать клавиши Ctrl-I (проверка).  Если курсор находится под име-
       нем массива MyCounter, то Турбо отладчик покажет информацию о со-
       держимом всего массива.  Но если бы вы выбрали  (т.е.  высветили)
       полностью  имя массива плюс индекс и нажали бы клавиши Ctrl-I, то
       отладчик знал бы,  что вы хотите узнать содержимое только  одного
       элемента массива, и вывел бы на экран только один элемент.
            Вы можете так переходить ко все более малым и простым  прог-
       раммным элементам.  Нажатие клавиш Ctrl-I во время просмотра мас-
       сива дает вам представление о некотором элемента массива.

       TDeb 3.0 #1-3                = 35 =
            Этот вид контекстной зависимости делает Турбо отладчик  лег-
       ким в использовании.  Это избавляет от необходимости запоминать и
       набирать на клавиатуре сложные строки команд меню или использова-
       ния клавиш,  подобных командам. Вы перемещаете курсор к элементу,
       содержимое которого хотите определить (или выбираете  его  с  по-
       мощью клавиши Ins) и вызываете команду (например, для просмотра -
       Ctrl-I).  Турбо отладчик наилучшим образом выполняет команду  для
       этого выбранного элемента.
            Контекстная зависимость  облегчающая пользование отладчиком,
       однако затрудняет документирование команд. Так, например, команда
       Ctrl-I в Турбо отладчике не имеет единственного результата,  нао-
       борот,  результат команды зависит от положения курсора и от  выб-
       ранного текста.

       TDeb 3.0 #1-3                = 36 =
                               Локальные меню
       -----------------------------------------------------------------
            Другим  аспектом  контекстной  зависимости  Турбо  отладчика
       TDW  является использование локальных меню (в зависимости от обс-
       тоятельств).
            Локальные меню в Турбо отладчике TDW настроены на конкретное


       окно или область,  в которой вы находитесь. Очень важно не путать
       локальные меню с глобальными меню (однако при реальной  работе  в
       TDW оба типа меню никогда одновременно не выводятся).
       ----------------------------------------------------------------¬
       ¦Ё File Edit -View- Run Breakpoint Data Option Window  Help MENU¦
       ¦-- Module--------------------------¬ 181-------------1-[ ][ ]¬ ¦
       ¦¦  type  ¦Breakpoints--------------¦                        ^¦ ¦
       ¦¦    Parm¦Stack                    ¦                        -¦ ¦
       ¦¦    Parm¦Log                      ¦                        -¦ ¦
       ¦¦      Pa¦Watches                  ¦<- глобальное меню      -¦ ¦
       ¦¦      He¦Variables                ¦                        -¦ ¦
       ¦¦    end;¦Module...          F3    ¦                        -¦ ¦
       ¦¦  var   ¦File...                  ¦       -------------¬   -¦ ¦
       ¦¦    Head¦CPU                      ¦       ¦--Inspect---¦   -¦ ¦
       ¦¦    i:  ¦Dump                     ¦       ¦  Watch     ¦   -¦ ¦
       ¦¦    s:  ¦Registers                ¦       ¦------------¦   -¦ ¦
       ¦¦> begin ¦Numeric processor        ¦       ¦  Module    ¦   -¦ ¦
       ¦¦    Head¦Execution history        ¦       ¦  File...   ¦   -¦ ¦
       ¦¦    for ¦Hierarchy                ¦       ¦------------¦   -¦ ¦
       ¦¦    begi¦Windows messages         ¦       ¦  Previous  ¦   -¦ ¦
       ¦¦      { ¦Clipboard                ¦       ¦  Line...   ¦   -¦ ¦
       ¦¦      s:¦Another                 >¦       ¦  Search... ¦   -¦ ¦
       ¦¦        L--------------------------       ¦  Next      ¦   v¦ ¦
       ¦¦<--------------------локальное
меню ->----¦  Origin    ¦-->-¦ ¦
       ¦L------------------------------------------¦  Goto...   ¦----- ¦
       ¦--Watches----------------------------------¦  Edit      ¦----¬ ¦
       ¦¦                                          L-------------    ¦ ¦


       ¦L------------------------------------------------------------- ¦
       ¦Alt:F2-BkptF3-CloseF4-BreakF5-UserF6-UndoF7-InstrF8-RtnF9-To...¦
       L----------------------------------------------------------------
            Рис. 2.1 Глобальные и локальные меню
            Сравните следующее:

       TDeb 3.0 #1-3                = 37 =
                               Глобальные меню
       -----------------------------------------------------------------
           - К  глобальным (спускающимся) меню вы получаете доступ нажа-
             тием клавиши F10 и использованием клавиш со  стрелками  или
             набором первой буквы имени меню.
           - Спускающиеся меню доступны всегда и видны в верхней
             строке экрана.
           - Их содержимое никогда не изменяется.
           - Некоторые команды меню могут вызываться нажатием  соответс-
             твующих  функциональных клавиш из любого места Турбо отлад-
             чика TDW.
                               Локальные меню
       -----------------------------------------------------------------
           - К локальным меню вы получаете доступ нажатием клавиш AltF10
             или Ctrl-F10.
           - Положение  и содержимое меню зависит от выбранного текста и
             от положения курсора.
           - Содержимое локального меню может изменяться  (важно  знать,
             что  локальные  команды  появляются почти во всех локальных
             меню,  так что множества команд каждого меню предсказуемо),
             но  даже в этих случаях результат команд с одинаковыми име-
             нами может быть различным в зависимости от контекста.
           - Каждая команда локального меню имеет функциональный эквива-
             лент,  состоящий из нажатия клавиши Ctrl, плюс первой буквы
             команды. Вследствие этого функциональный эквивалент, напри-
             мер,  Ctrl-S,  может  означать в одном контексте одно,  а в
             другом контексте - совершенно другое (как отмечалось выше),


             однако  существует соответствие множества команд в последо-
             вательности локальных всплывающих меню.  Например,  команды
             Goto  (Переход)  или Search (Поиск) всегда делают одно и то
             же, даже вызванные из разных мест.

       TDeb 3.0 #1-3                = 38 =
                                  Протоколы
       -----------------------------------------------------------------
            Меню и контекстная зависимость  -  это  только  два  аспекта
       удобной операционной среды Турбо отладчика TDW. Еще одним удобным
       средством являются протоколы (списки регистрации).
            В соответствии с тем представлением,  что пользователь  дол-
       жен набирать на клавиатуре только абсолютно необходимую  информа-
       цию,  Турбо  отладчик TDW сохраняет все,  что вы вводите в рамках
       подсказки,  и выводит этот текст,  когда вы вызываете  эту  рамку
       (окно) подсказки снова.
            Например, чтобы   выполнить   поиск   функции    с    именем
       MyPercentage,  вам придется набирать это слово целиком. Предполо-
       жим затем,  что вы ищете переменную с именем  ReturnOnInvestment.
       Когда  вы теперь увидите окно подсказки,  вы заметите,  что в нем
       появится ReturnOnInvestment.  При поиске другой текстовой  строки
       обе  введенных строки сохраняются.  При последующем использовании
       команды Search (Поиск) этот список будет расти.
            Окно ввода при поиске может выглядеть следующим образом:
       ----------------------------------------------------------------¬
       ¦   File Edit View Run Breakpoint Data Option Window Help   MENU¦
       ¦--[*]- Module:  TPDEMO File: TPDEMO.PAS 219 ---------1-[ ][ ]¬ ¦
       ¦¦        end                                                ^¦ ¦
       ¦¦    Writeln;                                               -¦ ¦
       ¦¦  end; { ParmsOnHeap }                                     -¦ ¦
       ¦¦                                                           -¦ ¦


       ¦¦> begin { program }                                        -¦ ¦
       ¦¦    Init;                                                  -¦ ¦
       ¦¦    Buffer := GetLine;                                     -¦ ¦
       ¦¦    while Buffer <> '' do                                  -¦ ¦
       ¦¦    begin                                                  -¦ ¦
       ¦¦      ProcessLine(Buffer);                                 -¦ ¦
       ¦¦      Buffer := --[*]---Enter search string-----¬          -¦ ¦
       ¦¦    end;        ¦ GetLine                      ^¦          -¦ ¦
       ¦¦    ShowResults;¦ NumLetters                   -¦          -¦ ¦
       ¦¦    ParmsOnHeap;¦ IsLetter                     -¦          -¦ ¦
       ¦¦ end.           ¦ NumLines                     -¦          -¦ ¦
       ¦¦                ¦                              -¦          v¦ ¦
       ¦¦<---------------¦                              v¦--------->-¦ ¦
       ¦L----------------¦ OK         Cancel      Help   ¦------------ ¦
       ¦--Watches--------¦                               ¦-----------¬ ¦
       ¦¦                L--------------------------------           ¦ ¦
       ¦L------------------------------------------------------------- ¦
       ¦-Enter-item-promted-for-in-dialog-title------------------------¦
       L----------------------------------------------------------------
            Рис. 2.2 Протокол в окне ввода
                 Примечание: Первый  элемент  в  списке  поиска   всегда

       TDeb 3.0 #1-3                = 39 =
            представляет собой слово, на которое указывает курсор в окне
            Module (Модуль).
            Для перемещения по протоколу можно использовать  стрелки или
       "мышь". Чтобы начать поиск,  нажмите клавишу Enter. При использо-
       вании записи из протокола она копируется в вершину списка.
            Можно также редактировать записи.  Для этого можно использо-
       вать клавиши стрелок,  переместив курсор  в подсвеченный текст, и


       отредактировать строку обычным образом.  При редактировании можно
       использовать клавиши Del или Backspace.  Например, вы можете выб-
       рать MyPercentage и изменить это имя на HisPercentage, вместо то-
       го, чтобы целиком вводить новый текст.  Если вы начинаете вводить
       новый элемент,  когда запись подсвечена, то старая запись затира-
       ется.
            В протоколе содержится последние 10 строк, которые вы вводи-
       ли (это  число  можно  изменить  с  помощью  программы  установки
       TDINST).
            Для большинства окон ввода Турбо отладчик  хранит  отдельный
       протокол. Таким образом, вводимый вами при выполнении перехода на
       отдельную метку или строку текст не забивает окно.
                       Автоматическое дополнение имени
       -----------------------------------------------------------------
            Когда вам дается приглашение на ввод текста в  блоке  ввода,
       вы можете ввести только часть имени идентификатора в программе, а
       затем нажать клавиши Ctrl-N.
                 Предупреждение: Когда в верхнем правом углу экрана  по-
            является слово READY... с тремя точками в конце, это означа-
            ет,  что происходит сортировка таблицы имен идентификаторов.
            Ctrl-N  не  будет работать до тех пор,  пока не исчезнут три
            точки,  что означает готовность таблицы имен идентификаторов
            к использованию для автоматического дополнения имен.
            - Если введено достаточно символов для однозначной идентифи-
              кации имени, Турбо отладчик дополняет имя.
            - Если введенная вами часть имени не принадлежит  ни  одному
              из известных имен идентификаторов, ничего не происходит.
            - Если  введенное  вами соответствует более чем одному имени
              идентификатора, то выводится список таких имен, из которо-
              го вы можете выбрать желаемое.
                         Расширение по соответствию


       -----------------------------------------------------------------
            Для нахождения записей в списке файлов или каталогов  диало-
       гового окна  Турбо отладчик позволяет выполнять расширение по со-

       TDeb 3.0 #1-3                = 40 =
       ответствию. Начните вводить имя файла или  каталога.  Если  Турбо
       отладчик найдет  в  списке такой файл,  строка подсветки перемес-
       титься на это имя,  как только вы  введете  достаточно  символов.
       После этого можно просто выбрать "кнопку" OK.
                            Создание макрокоманд
       -----------------------------------------------------------------
            Когда вы обнаружите, что выполняете повторяющуюся последова-
       тельность действий,  задайте  себе  вопрос:  а не стоит ли задать
       макрокоманду?
            Макрокоманды - это просто определяемые вами оперативные кла-
       виши. Вы  можете присвоить последовательность команд Турбо отлад-
       чика и нажатий клавиш одной клавише и повторять потом ваши  дейс-
       твия.
                 Примечание: О том, как определить макрокоманду, расска-
            зывается в Главе 4.

       TDeb 3.0 #1-3                = 41 =
                            Окна Турбо отладчика
       -----------------------------------------------------------------
            Сегодня многие программные продукты работают  с  окнами,  но
       Турбо  отладчик  делает это лучше.  Турбо отладчик выводит в меню
       (локальных и глобальных) всю информацию и данные, работает с диа-
       логовыми  окнами  (которые используются для задания или ввода ин-
       формации) и другими окнами.  В Турбо отладчике используется  мно-
       жество  различных  типов окон.  Тип окна зависит от того,  какого
       рода информацию он содержит. Открывать и закрывать все окна можно
       с помощью команд меню (или соответствующих им сокращений - опера-
       тивных клавиш).  Большинство окон Турбо отладчика (15 типов окон)


       выводятся из меню View (Обзор).  Другой класс окон, который назы-
       вается окнами проверки (Inspector), выводится при выборе элемента
       меню  Data¦Inspect  (Данные¦Проверка) или команды локального меню
       Inspect.
                               Окна меню View
       -----------------------------------------------------------------
            Перечислим типы окон, которые вы можете открыть из меню View
       (Обзор).
                                  ---------------------¬
            Точки останова        ¦ Breakpoints        ¦
            Стек                  ¦ Stack              ¦
            Регистрация           ¦ Log                ¦
            Выражения просмотра   ¦ Watches            ¦
            Переменные            ¦ Variables          ¦
            Модуль                ¦ Module...       F3 ¦
            Файл                  ¦ File...            ¦
            ЦП                    ¦ CPU                ¦
            Дамп                  ¦ Dump               ¦
            Регистры              ¦ Registers          ¦
            Сопроцессор           ¦ Numeric processor  ¦
            Протокол выполнения   ¦ Execution history  ¦
            Иерархия              ¦ Hierarchy          ¦
            Сообщения
Windows     ¦ Windows messages   ¦
            "Карман"              ¦ Clipboard          ¦
            Другое                ¦ Another           >¦
                                  L---------------------
            Когда вы открываете одно (или более) из этих окон,  их можно
       перемещать, менять размер,  закрывать и выполнять другие операции
       с помощью команд меню Window (Окно) и Ё (System - Система), о ко-
       торых рассказывается в разделе "Работа с окнами".

       TDeb 3.0 #1-3                = 42 =
                                 Окно Module
       -----------------------------------------------------------------
            В окне  Module  (Модуль) на экран выводится код отлаживаемой


       программы. Вы можете перемещаться по этому модулю и просматривать
       данные и код,  позиционирую курсор на именах переменных программы
       и давая соответствующие команды локальных меню.
            В окне Module вы вероятно будете проводить  больше  времени,
       чем в окнах других типов, поэтому стоит потратить время и изучить
       различные команды локальных меню, доступных для этого типа окна.
            Для того, чтобы открыть окно Module, можно также нажать кла-
       вишу F3.
                 Примечание: Более подробно об окне Module и его  коман-
            дах рассказывается в Главе 8.
                                 Окно Wathes
       -----------------------------------------------------------------
            В окне Wathes (Просмотр),  которое называют также окном наб-
       людения, выводятся  переменные и их изменяющиеся значения.  Нажав
       клавиши Ctrl-W при позиционировании курсора на имени переменной в
       окне Module (Модуль), вы можете добавить в окно Watches новую пе-
       ременную.
                 Примечание: Подробнее об окне Watches  рассказывается в
            Главе 6.
                              Окно Breakpoints
       -----------------------------------------------------------------
            В окне  Breakpoints (Точки останова) выводятся установленные
       вами точки останова.  Точка останова определяет то место в  вашей
       программе, где остановлено выполнение программы.  При этом вы мо-
       жете проверить состояние программы. В левой области окна перечис-
       ляются позиции в программе каждой точки останова  (или  показано,
       что это глобальная точка останова). В правой области данного окна
       показаны условия,  при которых срабатывает текущая (подсвеченная)
       точка останова.
            Используйте данное окно для изменения, удаления или добавле-
       ния точек останова.
                 Примечание: Полное описание данного типа окна  и работы


            с точками останова приводится в Главе 7.
                                 Окно Stack
       -----------------------------------------------------------------
            В окне  Stack (Стек) выводится текущее состояние стека.  При

       TDeb 3.0 #1-3                = 43 =
       этом внизу указаны самые первые вызовы функций (в  программах  на
       языке Си и C++ это функция main), а затем - все последующие вызо-
       вы в том порядке, как они выполнялись.
            Вы можете проверить исходный код  любой  указанной  в  стеке
       функции, переведя на нее подсветку и нажав клавиши Ctrl-I.
            Подсветив имя функции в стеке и нажав клавиши Ctrl-I, вы от-
       крываете окно Variables (Переменные),  в котором выводятся  пере-
       менные,  глобальные относительно программы, переменные, локальные
       относительно функции, и аргументы вызова функции.
                 Примечание: Более детально об окне Stack рассказывается
                             в Главе 5.
                                  Окно Log
       -----------------------------------------------------------------
            В окне  Log  (Регистрация)  выводится  содержимое  протокола
       (списка) регистрации сообщений.  Протокол содержит пролистываемый
       список сообщений и информацию, сгенерированную при вашей работе с
       Турбо отладчиком. Там сообщается, например, о том, почему остано-
       вилась ваша программа,  о результатах срабатывания точек останова
       и содержимом окон,  которые вы сохранили в протоколе регистрации.
            Окно Log можно использовать для получения информации об  ис-
       пользовании памяти и модулях прикладной программы Windows.
            Данное окно позволяет вам вернуться назад и  посмотреть, что
       привело к текущему состоянию.
                 Примечание: Более подробно об окне Log рассказывается в
                             Главе 7.
                               Окно Variables
       -----------------------------------------------------------------


            В окне Variables (Переменные) выводятся переменные,  доступ-
       ные в данной точке вашей программы. В верхней области окна содер-
       жатся глобальные переменные.  В нижней области показаны  перемен-
       ные, локальные  по  отношению  к текущей функции или модулю (если
       они есть).
            Данное окно полезно  использовать,  когда  вы  хотите  найти
       функцию или  переменную и знаете,  с каких символов начинается ее
       имя (например,  "abc"),  но  не помните точного имени.  Вы можете
       войти в область глобальных идентификаторов данного окна  и быстро
       найти то, что вам требуется.
                 Примечание: Подробнее окно Variables описывается в Гла-
                             ве 5.
                                  Окно File
       -----------------------------------------------------------------
            В окне  File (Файл) выводится содержимое файла на диске.  Вы

       TDeb 3.0 #1-3                = 44 =
       можете просматривать содержимое  файла  в  виде  непосредственных
       шестнадцатиричных байт или в виде кода ASCII (текстовый вид).  Вы
       можете выполнить поиск конкретного текста  или последовательности
       байтов, а также непосредственно скорректировать любую часть файла
       на диске.
            Это средство полезно использовать, если вы отлаживаете прог-
       рамму, использующую файлы на диске,  и хотите изменить содержимое
       программы,  изменив  содержимое одного из ее файлов.  Можно также
       исправить ошибку в содержимом файла, либо проверить файл, создан-
       ный программой, чтобы убедиться в правильности его содержимого.
                 Примечание: Более  подробно об этом окне рассказывается
            в Главе 7.
                                  Окно CPU
       -----------------------------------------------------------------
            Окно CPU (ЦП) показывает текущее состояние центрального про-
       цессора (ЦП).


Это окно содержит пять областей, в одной из которых
       показаны шестнадцатиричные байты данных, в другой выводится в не-
       посредственном виде (шестнадцатиричные байты) содержимое стека, в
       третьей -  содержимое  регистров ЦП,  в четвертой - машинные инс-
       трукции, а в пятой - содержимое флагов ЦП.
            Если вы используете TDW,  то в окне CPU выводится шестая об-
       ласть, в  которой показываются селекторы памяти защищенного режи-
       ма.
            Окно CPU полезно использовать,  когда вы хотите  просмотреть
       точную последовательность инструкций, которую образует строка ис-
       ходного кода программы,  или структуру данных.  Если вы знакомы с
       кодом Ассемблера,  это  может  помочь  вам выявить трудноуловимые
       ошибки. Однако для отладки большинства программ данное  окно  вам
       не понадобиться.
            Иногда Турбо отладчик открывает окно CPU автоматически, если
       ваша программа останавливается на инструкции  в  середине  строки
       исходного кода.
                 Примечание: Окно CPU и отладка на уровне Ассемблера об-
            суждаются подробно в Главе 11.
                                  Окно Dump
       -----------------------------------------------------------------
            В окне  Dump (Дамп) выводится в непосредственном виде содер-
       жимое области памяти.  (Это окно эквивалентно области данных окна
       CPU.) Вы можете выводить данные в виде символов,  шестнадцатирич-
       ных байт,  слов,  двойных слов,  или в любом формате с  плавающей

       TDeb 3.0 #1-3                = 45 =
       точкой. Данное окно можно использовать для просмотра в непосредс-
       твенном виде некоторых данных,  когда вам не требуются  остальные
       части окна CPU. В локальном меню этого окна имеются команды, поз-
       воляющие вам модифицировать выводимые данные,  изменять формат их
       вывода, а также манипулировать блоками данных.
                 Примечание: Более подробно о данном окне рассказывается


            в Главе 11 при описании отладки на уровне Ассемблера.
                               Окно Registers
       -----------------------------------------------------------------
            В окне Registers (Регистры) выводится содержимое регистров и
       флагов процессора (ЦП). Данное окно содержит две области, которые
       эквивалентны областям регистров и флагов окна CPU (ЦП).  Это окно
       можно использовать,  когда вам нужно просмотреть  содержимое  ре-
       гистров,  и вас не интересует прочая информация о состоянии цент-
       рального процессора. Значение любого регистра или флага можно из-
       менить с помощью команды локального меню.
                 Примечание: Более  углубленно о данном окне рассказыва-
            ется в Главе 11,  где описывается отладка на уровне  Ассемб-
            лера.
                           Окно Numeric Processor
       -----------------------------------------------------------------
            В окне  Numeric Processor (Арифметический сопроцессор) выво-
       дится текущее состояние арифметического  сопроцессора.  Это  окно
       содержит три области. В одной из областей показывается содержимое
       регистров с плавающей точкой,  в другом выводятся значения  флага
       состояния, а в третьей - значения управляющих флагов.
            Данное окно может помочь вам выявить ошибки в программе, ра-
       ботающей с числами с плавающей точкой.  Вы должны иметь углублен-
       ное представление о внутренней работе математического сопроцессо-
       ра. Только в этом случае данное окно принесет вам пользу.
                 Примечание: Более  подробно  о  работе  с окном Numeric
            Processor рассказывается в Главе 12.
                           Окно Execution History
       -----------------------------------------------------------------
            В окне Execution History (Протокол выполнения) выводится код
       Ассемблера и и исходные строки вашей программы, вплоть до послед-


       ней выполняемой строки.  Верхняя область содержит выполненный код
       Ассемблера (вы можете пройти его повторно).  В нижней области вы-
       водится следующее:
            1. Выполняете вы трассировку или выполнение по шагам.
            2. Строка  исходного кода для следующей выполняемой инструк-

       TDeb 3.0 #1-3                = 46 =
               ции.
            3. Номер строки исходного кода.
            Вы можете анализировать содержимое данного окна или  исполь-
       зовать его для выполнения вашей программы до конкретной точки.
                 Примечание: Подробнее об окне Execution History расска-
            зывается в Главе 5.
                               Окно Hierarchy
       -----------------------------------------------------------------
            В окне Hierarchy (Иерархия) выводится дерево  иерархии  всех
       объектов или типов классов,  используемых в текущем модуле.  Окно
       содержит две области. Одна область используется для вывода списка
       типов объектов/классов.  Другая - для вывода дерева иерархии объ-
       ектов/классов. (Если  вы выполняете отладку программ на языке С++
       с множественным наследованием,  то открывается также третье окно,
       где показывается порождающий класс для данного типа классов.)
            Данное окно показывает вам взаимосвязь объектов или классов,
       используемых в текущем модуле.  Оно также позволяет вам проверить
       любой объект или тип класса,  а также являющиеся его компонентами
       поля данных или элементы и методы или функции-элементы (для этого
       используются команды локального меню).
                 Примечание: Подробнее  о  данном  окне рассказывается в
            Главе 10.
                  Окно сообщений Windows (Windows Messages)
       -----------------------------------------------------------------
            Это окно выводит список сообщений, передаваемых между окнами
       в вашей прикладной программе для Microsoft Windows.


Это окно име-
       ет три области:
            - левая область показывает,  для каких процедур или логичес-
              ких номеров вы отслеживаете сообщения;
            - правая область показывает тип отслеживаемых сообщений.
            - в нижней области отображаются сами сообщения.
                 Примечание: Использование средств окна Windows Messages
            описано в Главе 17.
                               Окно Clipboard
       -----------------------------------------------------------------
            В этом окне выводятся элементы,  которые забраны в буфер вы-
       резанного изображения ("карман"), показаны их типы. Это позволяет
       проверить или удалить элемент и сохранить в "кармане" любое  зна-

       TDeb 3.0 #1-3                = 47 =
       чение элемента.
            Подробнее об окне Clipboard рассказывается ниже.

       TDeb 3.0 #1-3                = 48 =
                               Окна-дубликаты
       -----------------------------------------------------------------
            Вам предоставляется  также возможность открыть дубликаты для
       трех типов окон - Dump,  File или Module. Это можно сделать с по-
       мощью выбора пункта меню View¦Another (Просмотр¦Другое).
                                   -------------------¬
                        Модуль     ¦ Module...        ¦
                        Дамп       ¦ Dump             ¦
                        Другое     ¦ File...          ¦
                                   L-------------------
            Это позволяет  вам  отслеживать несколько отдельных областей
       для кода  Ассемблера,  различных  используемых  или  генерируемых
       программой файлов, или нескольких модулей разных программ  однов-
       ременно.
            Не беспокойтесь о том, если вдруг Турбо отладчик сам откроет
       одно из этих окон.  В некоторых случаях он будет делать это в от-
       вет на команду.
                             Экран пользователя


       -----------------------------------------------------------------
            Экран пользователя  - это экран вывода вашей программы. Этот
       экран будет иметь точно такой же вид, какой он имел бы при выпол-
       нении вашей  программы  без  Турбо отладчика (непосредственно под
       DOS).
            Вы можете использовать данный экран для того,  чтобы  прове-
       рить, что  выводит  ваша программа,  и соответствует ли это тому,
       что должно быть на экране.  Для переключения в экран пользователя
       выберите пункт меню Window¦User Screen (Окно¦Экран пользователя).
       После просмотра экрана пользователя  нажмите  любую  клавишу  для
       возврата обратно в экран отладчика.
                 Примечание: Клавиша Alt-F5 - это  оперативная  клавиша,
            которая позволяет  переключаться между операционной средой и
            экраном пользователя.
                                Окно проверки
       -----------------------------------------------------------------
            В окне  Inspector (Проверка) выводится текущее значение выб-
       ранной переменной.  Его  можно  открыть,  выбрав в локальном меню
       пункт (команду) Data¦Inspect (Данные¦Проверка). Обычно данное ок-
       но  выбирается  с  помощью нажатия клавиши Esc или кнопки "мыши".
       Если вы откроете последовательно  несколько  окон  проверки  (что
       часто происходит при  проверке сложных структур данных),  то уда-
       лить все окна проверки можно с помощью клавиш Alt-F3  или команды
       Window¦Close (Окно¦Закрытие).

       TDeb 3.0 #1-3                = 49 =
            Вы можете открыть окно  Inspector  для  просмотра  элементов
       массива или содержимого переменной или выражения.  Число областей
       в окне зависит от характера проверяемых вами данных. Окно провер-
       ки адаптируется  к тому типу данных,  который выводится на экран.
       Оно может поддерживать не только  простые  скалярные  типы  (int,


       float и т.д.),  но и указатели, массивы, записи, структуры и объ-
       единения. Каждый тип элементов данных выводится в таком виде, ко-
       торый максимально соответствует использованию его в исходном коде
       программы.
            Дополнительные окна проверки можно создать просто  с помощью
       выбора команды Inspect (Проверка),  в то время как дополнительные
       окна Module,  File или CPU можно создать только,  выбрав  элемент
       (команду) меню View¦Another (Обзор¦Другое окно).

       TDeb 3.0 #1-3                = 50 =
                                Активное окно
       -----------------------------------------------------------------
            Хотя в Турбо отладчике  допускается  открывать  одновременно
       много окон,  активным может быть только одно окно.  Активное окно
       соответствует следующим критериям:
            - Активное окно имеет двойную рамку, а не одинарную.
            - Активное окно содержит курсор или строку подсветки.
            - Если окна перекрываются, активное окно находится перед ни-
              ми (первое окно).
            Когда вы даете команды,  вводите текст  или  "прокручиваете"
       содержимое окна, это влияет только не текущее окно и не влияет на
       другие открытые окна.
       -------------------------------------------------------------------¬
       ¦Ё  File Edit View Run Breakpoint Data Option Window Help      MENU¦
       ¦------ Module:  TPDEMO File: TPDEMO.PAS 219 ---------1----------¬ ¦
       ¦¦        end ------- Stack ------5--------¬                     ¦ ¦
       ¦¦    Writeln;¦ TPDEMO                     ¦                     ¦ ¦
       ¦¦  end; { Par¦   ------ Log -------------------4----¬           ¦ ¦
       ¦¦            ¦   ¦                                  ¦           ¦ ¦
       ¦¦> begin { pr¦   ¦                                  ¦           ¦ ¦
       ¦¦    Init;   ¦   ¦                                  ¦           ¦ ¦


       ¦¦    Buffer :L---¦                                  ¦           ¦ ¦
       ¦¦    whilг==[*]==Dump=================3====[ ][ ]¬  ¦           ¦ ¦
       ¦¦    begi¦ ds: 0000 CD 20 00 A0 00 9A F0 FE = & U*^  ¦           ¦ ¦
       ¦¦      Pr¦ ds:0008 A4 02 D3 01 C5 41 90 01 .^.Ayo-  ¦           ¦ ¦
       ¦¦      Bu¦ ds:0010 C5 41 8D 02 DE 38 D7 2D .Afe!`----           ¦ ¦
       ¦¦    end;¦ ds:0018 01 01 01 00 03 FF FF FF oooo. v              ¦ ¦
       ¦¦    ShowL<------------------------------------>--              ¦ ¦
       ¦¦    ParmsOnHeap;     ^                                         ¦ ¦
       ¦¦ end.                ¦                                         ¦ ¦
       ¦¦                     L------- активное окно                    ¦ ¦
       ¦¦                                                               ¦ ¦
       ¦L---------------------------------------------------------------- ¦
       ¦--Watches-------------------------------------------------------¬ ¦
       ¦¦                                                               ¦ ¦
       ¦L---------------------------------------------------------------- ¦
       ¦Alt:F2-BkptF3-ClF4-BackF5-UserF6-UndoF7-InstrF8-RtnF9-ToF1-Local  ¦
       L-------------------------------------------------------------------
            Рис. 2.3 Активное окно
                            Что выводится в окне?
       -----------------------------------------------------------------
            Окно всегда содержит большинство из следующих элементов, ко-
       торые  дают  вам  информацию  об окне и позволяют выполнить в нем
       различные действия.

       TDeb 3.0 #1-3                = 51 =
            пиктограммы переключения и переформатирования окна -----¬
                                                                    ¦
          -пиктограмма -- заголовок           номер окна -----¬     ¦
          ¦  закрытия  ¦                                      ¦     ¦
          v            v                                      v     v


       г=[*]==Module: TCDEMO File: tcdemo.c (modified) 31=====1=[ ][ ]=¬
       ¦   static void showargs(int argc, char *argv[]);               ^
       ¦                                                               -
       ¦   /* program entry point                                      -
       ¦      */                                                       -
       ¦>  int main(int argc, char **argv) {                           -
       ¦       unsigned int nlines, nwords, wordcount;                 -
       ¦       unsigned long totalcharacters;                          -
       ¦                                        полоса
прокрутки ----->-
       ¦       nlines = 0;                                             -
       ¦       nwords = 0;                                             -
       ¦       totalcharacters = 0;                                    -
       ¦       showargs(argc, argv);                                   -
       ¦       while (readline() != 0) {                               v
       ¦             wordcount = makeintowords(buffer);                ¦
       L<------------------------------------------------------------->-
            ^                                                          ^
            ¦                                                          ¦
            L------ полоса "прокрутки"            изменение размера ----
            Рис. 2.4 Типичное окно
            В окне можно видеть:
            - Контур (рамку) окна (рамка двойная,  если окно активное, и
              одинарная в противном случае).
            - Заголовок, расположенный в левой верхней части окна.
            - полоса  "прокрутки"  (справа и внизу) выводится в том слу-
              чае, если окно содержит информацию, которая не вмещается в
              текущее поле окна.  Перемещать информацию в окне с помощью
              полосы "прокрутки" можно,  используя "мышь".
                 а) Щелкните кнопкой "мыши", переместив указатель на ко-


                    нец полосы "прокрутки" (со стрелкой).  Этим вы пере-
                    местите изображение в заданном направлении  на  одну
                    позицию.
                 б) Для перемещения одного из размеров окна  в  заданном
                    направлении  щелкните кнопкой мыши,  переведя указа-
                    тель в "серую" область полосы "прокрутки".
                 в) Перемещайте рамку прокрутки настолько и том  направ-
                    лении, как это необходимо.
            - В  нижнем  левом углу окна находится пиктограмма изменения

       TDeb 3.0 #1-3                = 52 =
              размера.  "Зацепив" ее с помощью "мыши" и перемещая, можно
              сделать окно больше или меньше.
            - Номер окна в левом верхнем углу отражает порядок,  в кото-
              ром было открыто окно.
            - В правой верхней части окна находятся пиктограммы переклю-
              чения и переформатирования окна.  Пиктограмма переключения
              (слева) позволяет вам с помощью  "мыши"  увеличить  размер
              окна до всего поля экрана,  восстановить предыдущий размер
              окна,  а рамка переформатирования -  изменить  его  размер
              (пропорционально). Для выполнения этих функций нужно уста-
              новить на одну из пиктограмм указатель "мыши"  и  щелкнуть
              кнопкой.
            - В  вернем  левом  углу окна находится пиктограмма закрытия
              окна.  Для закрытия окна нужно установить на нее указатель
              мыши и щелкнуть кнопкой.
                               Работа с окнами
       -----------------------------------------------------------------
            При наличие такой развитой системы окон вы,  вероятно, захо-
       тите открыть на экране одновременной несколько окон. Турбо отлад-
       чик позволяет  вам  легко  переходить  из  одного  окна в другое,


       перемещать их, открывать их одно за другим, сжимать их или расши-
       рять, а также закрывать.
            Большинство команд   управления  окнами  содержится  в  меню
       Windows (Окна). Еще несколько команд можно найти в системном меню
       Ё (System).  Это  меню  отмечено символом Ё в левой чести верхней
       строки меню.
                 Примечание: Для  того,  чтобы  открыть  системное меню,
            нажмите клавиши Alt-пробел или Alt-W.
                      Переход от одного окна к другому
       -----------------------------------------------------------------
            Каждое открываемое вами окно содержит номер в верхнем правом
       углу. Обычно,  окно  Module  (Модуль) - это окно номер 1,  а окно
       Watches (Просмотр) - это окно номер 2.  Следующему окну,  которое
       вы откроете, будет присвоен номер 3, и т.д.
            Эта система  нумерации  предоставляет  вам быстрое и простое
       средство перемещения от одного окна к другому.  Вы можете  с  по-
       мощью клавиши Alt в сочетании с номером окна сделать активным лю-
       бое из первых 9 окон. Например, при нажатии клавиш Alt-2 активным
       станет окно Watches.  При этом любая выбираемая далее команда бу-
       дет влиять на данное окно и на элементы в нем.

       TDeb 3.0 #1-3                = 53 =
            Вы можете также циклически переходить от окна  к  окну,  ис-
       пользуя команду меню Window¦Next (Окно¦Следующее) или оперативную
       клавишу F6.  Это удобно использовать, если номер окна скрыт, и вы
       не знаете, какую цифру использовать для перехода к нему.
            Кроме того, для активизации окна можно использовать "мышь".
            Для вывода  списка всех открытых окон выберите в строке меню
       команду Window (Окно).  В нижней части меню Window выводится до 9
       открытых окон, из которых вы можете сделать выбор.
            Если у вас открыто более 9 окон,  можно использовать команду


       Pick (Выбор),  по которой на экран выведется всплывающее меню  со
       всеми открытыми окнами.
            Если окно  разбито  на области (каждая область резервируется
       для данных конкретного типа),  то от одной области к другой можно
       переходить с помощью команды Window¦Next Pane (Окно¦Следующая об-
       ласть) или клавиш Tab (либо Shift-Tab).
            Переходить из одной области в другую можно также  с  помощью
       "мыши".
            Больше всего областей (6 областей при использовании TDW) со-
       держит окно CPU (ЦП).
            При переходе  от  одной области к другой вы можете заметить,
       что в некоторых областях появляется мерцающий курсор,  а в других
       - строка подсветки.  Если появляется курсор, то вы можете переме-
       щаться по тексту с помощью стандартных клавиатурных команд  (нап-
       ример, команды PgUp, Ctrl-Home и Ctrl-PgUp перемещают курсор, со-
       ответственно,  вверх на один экран, к вершине области или к концу
       списка. Для перемещения в области окна можно  также  использовать
       оперативные клавиши,  аналогичные тем, которые используются в ре-
       дакторе WordStar (список используемых в областях клавиатурных ко-
       манд приведен в Главе 13).
            Если вместо курсора в области появляется  строка  подсветки,
       то вы,  тем не менее, можете использовать стандартные клавиши пе-
       ремещения курсора. Но используется также пара специальных клавиш.
       В алфавитных списках вы,  например, можете выполнять выбор по на-
       бору. При нажатии каждой буквы строка  подсветки  перемещается  к
       элементу, начинающемуся  с нажатой вами буквы.  Позиция курсора в
       подсвеченном элементе показывает,  какая часть имени уже набрана.
       Когда полоса  подсветки установится на нужный элемент,  поиск за-
       вершен. Такой поиск по возрастанию (см. ранее) или выбор по набо-
       ру позволяет минимизировать число символов, которые нужно вводить


       для выбора элемента из списка.
            После того,  как нужный элемент в списке будет выбран (подс-
       вечен), вы  можете нажать клавиши Alt-F10 или Ctrl-F10 для выбора
       для него соответствующей команды локального меню. Во многих спис-
       ках после  выбора элемента можно просто нажать клавишу Enter. Она

       TDeb 3.0 #1-3                = 54 =
       действует, как оперативная клавиша. Точная функция этой клавиши в
       каждом случае описывается в Главе 13.
            Наконец, некоторые  области позволяют вам начать ввод нового
       значения или строки поиска,  не выбирая сначала  команду.  Обычно
       это относится  к  наиболее часто используемым командам локального
       меню в области или окне,  типа  команды  Goto  (Переход)  в  окне
       Module, команды  Search  (Поиск) в окне File,  или команды Change
       (Изменение) в окне Registers.
                   Перемещение окон и изменение их размера
       -----------------------------------------------------------------
            Когда вы в Турбо отладчике открываете новое окно,  оно появ-
       ляется вблизи текущей позиции курсора и имеет размер,  использую-
       щийся по умолчанию для данного типа окон. Если вы сочтете положе-
       ние или  размер окна неудобным,  для их настройки можно использо-
       вать команду Window¦Size/Move (Окно¦Размер/Перемещение).
            При перемещении окна или изменении его размера рамка текуще-
       го окна изменяется и становится одинарной. При этом вы можете для
       перемещения окна  использовать  клавиши стрелок,  а для изменения
       его размера - клавишу Shift совместно с клавишами  стрелок. Когда
       вы будет  удовлетворены  полученным результатом,  нажмите клавишу
       Enter.
                 Примечание: Команде Window¦Size/Move соответствуют опе-
            ративные клавиши Ctrl-F5.
            При наличии  "мыши"  перемещение окон и изменение их размера
       еще более облегчается:


            - Захватите "мышью" пиктограмму изменения размера  в  нижнем
              правом углу окна и измените его размер.
            - Для перемещения окна захватите заголовок окна за любой его
              край и переместите окно.
            Если вы хотите быстро увеличить ("распахнуть") или уменьшить
       размер окна, выберите команду Window¦Zoom (Окно¦Переключение раз-
       мера)  или  нажмите кнопку "мыши",  переместив указатель на рамку
       переформатирования или переключения размера окна в правом верхнем
       его углу.
                 Примечание: Команде Window¦Zoom соответствуют оператив-
            ная клавиша F5.
            Наконец, если  вы хотите временно избавиться от окна,  но не
       хотите его закрывать,  сделайте его активным,  а  затем  выберите
       команду Window¦Iconsize/Restore (Окно¦Сжатие/Восстановление). Ок-
       но сожмется до маленького прямоугольника,  при этом  будут  видны
       только его имя,  пиктограмма закрытия и пиктограмма переключения.
       Для восстановления окна выберите  команду Window¦Iconsize/Restore

       TDeb 3.0 #1-3                = 55 =
       еще раз, или щелкните кнопкой "мыши", установив указатель на пик-
       тограмму переключения размера.
                       Закрытие и восстановление окон
       -----------------------------------------------------------------
            При работе в окне его можно закрыть с помощью команды Window
       ¦Close (Окно¦Закрытие) или нажатия оперативных клавиш Alt-F3.
            При наличии "мыши" вы можете также щелкнуть  кнопкой "мыши",
       установив указатель  в  пиктограмме закрытия окна в левом верхнем
       углу.
                 Примечание: Команде Window¦Close  соответствуют  опера-
            тивные клавиши Alt-F3.
            Если вы закрыли окно по ошибке, его можно восстановить с по-
       мощью команды Window¦Undo Close (Окно¦Отменить закрытие) или  на-


       жатия клавиш  Alt-F6 (это относится только к последнему закрытому
       вами окну).
            Вы можете также восстановить для экрана Турбо  отладчика  ту
       схему, которая у него была, когда первоначально вошли в Турбо от-
       ладчик. Это можно сделать с помощью  команды  системного меню  Ё¦
       Restore Standard (Система¦Восстановление стандартной схемы).
                 Примечание: Команде   Window¦Undo  Close  соответствуют
            оперативные клавиши Alt-F6.
            Наконец, если  ваша  программа  затерла  своим выводом экран
       операционной среды (из-за выключенного переключения  экранов), вы
       можете  очистить  его с помощью команды системного меню Ё¦Repaint
       Desktop (Система¦Восстановление оперативной области экрана).
                   Сохранение используемой вами схемы окон
       -----------------------------------------------------------------
            Для сохранения выбранной вами схемы окон используйте команду
       Options¦Save options (Параметры¦Сохранение параметров).  В диало-
       говом окне Save Configuration (Сохранение конфигурации) перейдите
       с помощью клавиши Tab на переключатель Layout (Схема) и для вклю-
       чение его нажмите клавишу пробела. После этого, если конфигурация
       сохранена в файле TDCONFIG.TD, при каждом запуске Турбо отладчика
       из  среды операционной системы DOS он будет выводить экран с выб-
       ранной вами  схемой  окон.  С  помощью  команды   Options¦Restore
       options (Параметры¦Восстановление  параметров) можно также загру-
       зить другую конфигурацию,  если она была сохранена в файле конфи-
       гурации с другим именем.
                            Копирование и вставка
       -----------------------------------------------------------------
            Турбо отладчик  содержит  расширенное средство копирования и

       TDeb 3.0 #1-3                = 56 =
       вставки, которое  называется  буфером   вырезанного   изображения


       (Clipboard) или "карманом". С помощью кармана вы можете выполнять
       копирование и вставку между окнами  Турбо отладчика и диалоговыми
       окнами.
            Копируемые в  карман  элементы являются динамическими.  Если
       элемент имеет соответствующее значение, то в кармане хранится те-
       кущее значение по мере его изменения в программе.
            Для копирования  элемента в карман установите курсор на эле-
       менте или установите на нем подсветку с помощью клавиши Ins,  за-
       тем нажмите клавиши Shift-F3.  Чтобы вставить что-либо из кармана
       в окно или в диалоговое окно,  нажмите клавиши Shift-F4  или  ис-
       пользуйте для вывода диалогового окна Clipboard "кнопку" Clip.
            Примечание: Для  отметки нескольких элементов в списке можно
       использовать клавишу Ins.
            Нажимая клавиши Shift-F4, вы можете выполнять вставку в поле
       подсказки  диалогового  окна  (любое место диалогового окна,  где
       можно вводить текст),  даже если окно не содержит  "кнопки"  Clip
       (Вырезать). Вы можете также выполнять вставки в диалоговые окна с
       несколькими полями подсказки.

       TDeb 3.0 #1-3                = 57 =
                          Диалоговое окно Clipboard
       -----------------------------------------------------------------
            При нажатии  клавиш  Shift-F4  или активизации "кнопки" Clip
       выводится содержимое диалогового окна C[ipboard,  и  показываются
       категории, которые  вы можете использовать для вставки элемента в
       диалоговое окно.
       г=[*]============================Pick (C)=======================¬
       ¦                                                               ¦
       ¦ Clipboard                                                     ¦
       ¦ -@#TCDEMO#36-------------------------     (.) String          ¦
       ¦ -------------------------------------     ( ) Location        ¦


       ¦ -------------------------------------     ( ) Context         ¦
       ¦ -------------------------------------                         ¦
       ¦ -------------------------------------                         ¦
       ¦    OK    Paste   Cancel     Help                              ¦
       ¦    ---   -----   ------     ------                            ¦
       L===============================================================-
            Рис. 2.5 Диалоговое окно Clipboard Paste
            String - строка;  Location - адрес; Context - содержимое; OK
       - нормально; Paste - вставка; Cancel - отмена; Help - справка
            В данном  диалоговом  окне  выводится  прокручиваемый список
       элементов кармана.  Оно позволяет вам  интерпретировать  элемент,
       как вставляемый  одним из трех способов:  как строку,  как адрес,
       или как содержимое по адресу.  Категории,  которые вы можете  ис-
       пользовать для вставки элемента, зависят от его типа и назначения
       (см. далее).
            Например, если вы вырежете текст из окна  Log (Регистрация),
       его можно  вставить только как строку.  Если вы вырежете текст из
       окна Module (Модуль),  то его можете вставить где-либо как строку
       или как адрес, но не как содержимое. Если вы извлечете переменную
       из  окна  Inspector (Проверка), то его можно вставить как строку,
       как адрес  или как содержимое (если это не регистровая переменная
       Си - в этом случае вы можете вставить ее как строку или  как  со-
       держимое, но не как адрес).
            Для вставки элемента в диалоговое окно,  подсветите элемент,
       выделите соответствующую категорию,  затем нажмите клавишу  Enter
       или активизируйте "кнопку" Paste (Вставка), какой эффект вы хоти-
       те получить в диалоговом окне.
            - Нажатие клавиши Enter просто вставляет элемент и возвраща-
              ет вас в диалоговое окно.
            - Активизация  "кнопки"  Paste  вставляет элемент и передает


              клавишу Enter, что приводит к выполнению функции.
                               Окно Clipboard

       TDeb 3.0 #1-3                = 58 =
       -----------------------------------------------------------------
            Для того,  чтобы  вы   могли   увидеть   содержимое   буфера
       Clipboard,   имеется   окно  View  (Обзор).  Выбор  команды  View
       ¦Clipboard (Обзор¦ Буфер вырезанного изображения) выводит на экран
       окно Clipboard,  в котором перечисляются все вырезанные элементы.
             г=[*]=Clipboard=========================================¬
             ¦ Module          : @#TCDEMO#36 nlines                  ^
             ¦ Inspector       : nlines                  0 (0x0)     -
             ¦ Module----------:-@#TCDEMO#38-totalcharacters-------- -
             ¦ Inspector       : totalcharacters         0 (0x0)     -
             ¦                                                       v
             L<----------------------------------------------------->-
            Рис. 2.6 Окно Clipboard
            В левом  поле этого окна описывается тип записи,  за которым
       следует двоеточие и вырезанный (забранный в карман) элемент. Если
       вырезанный  элемент  представляет  собой  выражение из окна Watch
       (Просмотр),  переменную из окна Inspector (Проверка) или  данные,
       регистр или флаг из окна CPU то за элементом следует его значение
       или значения.

       TDeb 3.0 #1-3                = 59 =
                        Типы элементов окна Clipboard
       -----------------------------------------------------------------
            Когда вы забираете из окна элемент,  Турбо отладчик присваи-
       вает ему  тип и помогает идентифицировать источник элемента. Типы
       Clipboard показаны в следующей таблице:
                           Типы элементов Clipboard          Taблица 2.2
       -----------------------------------------------------------------
       Тип                Описание


       -----------------------------------------------------------------
       String             Текстовая строка, например, отмеченный блок из
                          окна File.
       Module             Содержимое модуля, включая позицию в  исходном
                          коде, аналогично переменной из окна Module.
       File               Позиция в файле (в окне File), которая не  яв-
                          ляется модулем в программе.
       CPU code           Адрес и список байт выполняемых инструкций  из
                          области кода окна CPU (ЦП).
       CPU data           Адрес и список байт данных в памяти из области
                          данных в окне CPU или в окне Dump (Дамп).
       CPU stack          Исходная позиция и кадр стека из области стека
                          окна CPU.
       CPU register       Имя  регистра  и значение из области регистров
                          окна CPU или окна Register.
       CPU flag           Значение флага ЦП из области флагов окна CPU.
       Inspector          Одно из следующих:
                              - имя переменной из окна Inspector;
                              - значение константы  из  окна  Inspector
                                или Watch;
                              - регистровая переменная окна Inspector;
                              - битовое поле окна Inspector.
       Address            Адрес без соответствующих данных или кода.
       Expression         Выражение из окна Watches.
       Coprocessor        Регистр арифметического сопроцессора 80х87.
       Control flag       Значение управляющего флага сопроцессора.
       Status flag        Значение флага состояния сопроцессора 80х87.
       -----------------------------------------------------------------

       TDeb 3.0 #1-3                = 60 =
                        Локальное меню окна Clipboard
       -----------------------------------------------------------------
            Если, находясь в окне Clipboard,  вы нажмете клавиши Alt-F10


       или щелкните  правой кнопкой "мыши",  то слева увидите меню.  Для
       выполнения команды вы можете также нажать клавишу Ctrl и  подсве-
       тить клавишу локального меню.
                         -------------------¬
            Проверка     ¦ Inspect          ¦
            Удаление     ¦ Remove           ¦
            Удалить все  ¦ Delete all       ¦
            "Заморозить" ¦ Freeze           ¦
                         L-------------------

       TDeb 3.0 #1-3                = 61 =
                Команды локального меню окна Clipboard Таблица 2.3
       -----------------------------------------------------------------
       Команда           Описание
       -----------------------------------------------------------------
       Inspect           Позиционирует курсор в то окно, из которого был
                         извлечен элемент.
       Remove            Удаляет подсвеченный элемент или элементы.  Тот
                         же эффект для подсвеченного элемента имеет кла-
                         виша Del.
       Delete all        Удаляет все в буфере Clipboard.
       Freeze            Приостанавливает динамическое  обновление  эле-
                         мента Clipboard.
       -----------------------------------------------------------------
                           Динамическое обновление
       -----------------------------------------------------------------
            Clipboard динамически обновляет любой элемент с соответству-
       ющим значением,  например,  выражение из окна Wathes,  переменную
       окна Inspector или регистр окна CPU.  При желании вы  можете  ис-
       пользовать окно Clipboard также как окно Watch, и можете по свое-
       му усмотрению "замораживать" любой элемент.
                 Примечание: О выражения просмотра окна Watch более под-
            робно рассказывается в Главе 6.
            Например, вы можете поместить в окно Clipboard выражение ок-


       на Watches.  Для этого перейдите сначала в  окно  Watches,  затем
       нажмите клавиши Shift-F3 для копирования в окно Clipboard. Значе-
       ние элемента после этого будет изменяться точно так же,  как если
       бы он находился в окне Watches,  пока для запрещения точки  прос-
       мотра вы не используете команду Freeze.
            Одно из  преимуществ  наблюдения  за   выражением   в   окне
       Clipboard заключается в том,  что вы можете  приостановить обнов-
       ление определенного значения,  затем продолжить выполнение  прог-
       раммы и  сравнить  прежнее значение с измененным значением в окне
       Watches.

       TDeb 3.0 #1-3                = 62 =
                  Замечания по использованию окна Clipboard
       -----------------------------------------------------------------
            Способы использования  окна Clipboard слишком многочисленны,
       чтобы их можно было здесь перечислить.  Вы можете,  например, де-
       лать следующее:
            - вырезать элементы окна Module,  отмечая адреса,  к которым
              вы можете возвратиться с помощью команды  локального  меню
              Goto (вставив адрес в выводимое по этой команде диалоговое
              окно);
            - наблюдать за выражением (см. предыдущий раздел);
            - вставлять новые значения в переменные с помощью диалогово-
              го окна Data¦Evaluate (Данные¦Вычисление)  или диалогового
              окна  команды Change (Изменение) окна Inspector (Проверка)
              или окна Watches (Просмотр);
            - вставка строк в окно Log (Регистрация),  что  поможет  вам
              отслеживать, что вы делали в процессе сеанса отладки;
            - вставлять  адрес  (категория элемента location) в любое из
              тех мест,  где запрашивается адрес (например, поле Address
              диалогового  окна Breakpoint¦Options (Точка останова¦Пара-
              метры) или диалоговое окно Run¦Execute To  (Выполнение¦Вы-


              полнение до...)).
            - вставлять выражения в условия точек останова  и  действия,
              выполняемые по точкам останова;
            - вставлять параметры в диалоговое окно Run¦Arguments (Выпо-
              лнение¦Аргументы);
            - вставлять имя процедуры Windows или имя объекта OWL в окно
              Windows Messages;
            - вставлять строку в команде Search (Поиск) окна Module (Мо-
              дуль);
            - копировать данные из области данных окна CPU  и  вставлять
              их в это окно;
            - копировать  код  из  одной части окна CPU в другую и затем
              выполнять программу с этим кодом.
                       Получение справочной информации
       -----------------------------------------------------------------
            Как вы видите,  Турбо отладчик делает все,  чтобы  облегчить
       вам процесс отладки.  Вам не нужно помнить различные команды,  он
       сохраняет то, что вы вводите, на тот случай, если вы захотите это

       TDeb 3.0 #1-3                = 63 =
       повторить. Он  предлагает  также исчерпывающее управление окнами.
       При этом Турбо отладчик представляет собой развитую  программу со
       множеством средств  и команд.  Чтобы избежать возможной путаницы,
       Турбо  отладчик предлагает следующие справочные средства:
            - Индикатор активности в левом правом углу экрана всегда по-
              казывает текущее состояние. Например, если курсор находит-
              ся в окне,  в индикаторе активности выводится  READY  (Го-
              тов).  Если выводится меню, в нем указывается MENU, а если
              вы находитесь в диалоговом окне - PROMPT (Подсказка). Если
              вы,  запутаетесь и не можете понять,  что происходит в от-
              ладчике, взгляните на индикатор  активности.  (В  качестве
              примеров режима индикатора активности можно привести также
              SIZE¦MOVE (Размер¦Перемещение),  MOVE (Перемещение), ERROR


              (Ошибка),  RECORDING  (Запись),  WAIT (Ожидание),  RUNNING
              (Выполнение), MENU (Меню), HELP (Справка), STATUS (Состоя-
              ние) и PLAYBACK (Обратное выполнение).
            - Активное  окно  всегда находится на переднем плане и имеет
              двойную рамку.
            - С помощью клавиши F1 вы можете получить доступ  к развитой
              контекстной справочной системе. По данной клавише на экран
              выводится список тем, из которых вы можете выбрать необхо-
              димую.
            - В  строке  состояния  в  нижней части экрана всегда дается
              краткая информация об используемых  клавиатурных командах.
              При нажатии клавиши Alt или Ctrl данная строка изменяется.
              Когда вы находитесь в системе меню,  эта строка предлагает
              вам оперативное описание текущей команды меню.
            Более подробная информация о последних двух средствах содер-
       жится в следующих двух разделах.

       TDeb 3.0 #1-3                = 64 =
                             Оперативная помощь
       -----------------------------------------------------------------
            В Турбо  отладчике,  как и в других продуктах фирмы Borland,
       встроен контекстно-зависимый оперативный справочник.  Он доступен
       как при  работе  в  системе  меню,  так и при выводе сообщения об
       ошибке или подсказки.
            Для вывода справочного экрана с информацией,  относящийся  к
       текущему контексту (окну или меню) нажмите клавишу F1.  При нали-
       чие "мыши" вы можете вывести справочный экран, выбрав F1 в строке
       состояния. Некоторые справочные экраны содержат подсвеченные сло-
       ва, которые позволяют вам получить дополнительную  информацию  по
       данной теме. Для перемещения к нужным ключевым словам используйте
       клавиши Tab  или Shift-Tab и нажмите клавишу Enter. Для перемеще-
       ния к первому или последнему слову на экране  используйте клавиши


       Home и End.
            Доступ к оперативным  справочным  средствам  можно  получить
       также с  помощью команды Help (Справка) из строки меню (оператив-
       ные клавиши Alt-H).
                                         ---------------------------¬
              Индекс                     ¦ Index           Shift-F1 ¦
              Предыдущая тема            ¦ Previous topic    Alt-F1 ¦
              Информация по справочнику  ¦ Help on help             ¦
                                         L---------------------------
            Если вы хотите вернуться к предыдущему  справочному  экрану,
       нажмите клавиши Alt-F1 или выберите команду Previous (Предыдущий)
       из меню Help (Справка).  В справочной системе для просмотра  пос-
       ледних 20  экранов можно пользоваться клавишей PgUp (клавиша PgDn
       работает, когда вы находитесь в группе  связанных  экранов).  Для
       доступа к   индексному   указателю   справочной  системы  нажмите
       Shift-F1 (или F1 в справочной системе) или выберите команду Index
       в меню Help.  Для получения информации о самой справочной системе
       выберите в меню Help команду Help¦Help.  Для выхода из справочной
       системы нажмите клавишу Esc.
            Если вы используете Турбо Паскаль или Borland C++  и  хотите
       получать  справочную  информацию по зарезервированным словам этих
       языков и их функциям (как во встроенных  отладчиках  данных  язы-
       ков),  это можно сделать с помощью резидентной в памяти программы
       с именем THELP.COM,  которая  поставляется  с  Турбо  Паскалем  и
       Borland C++. Чтобы использовать ее, необходимо:
            1. Скопировать в ваш каталог Турбо отладчика или  в каталог,
               указанный  в  маршруте, файлы THELP.COM и соответствующий
               справочный файл компилятора (TURBO.HLP в  Турбо  Паскале,
               TCHELP.TCH в  Турбо Си и Borland C++,  TASM.TAH для Турбо
               Ассемблера).


            2. Наберите THELP и нажмите Enter.

       TDeb 3.0 #1-3                = 65 =
            3. Перейдите в Турбо отладчик.
            4. Для  получения  справочной  информации  (открытия  экрана
               Help)  по одному из зарезервированных слов позиционируйте
               курсор под этим словом и нажмите 5 на числовой (вспомога-
               тельной) клавиатуре.
            5. После этого вы можете пользоваться справочной информацией
               также, как в интегрированном отладчике, используя клавиши
               Alt-F10 для возврата к предыдущему экрану, и нажимая кла-
               вишу Enter для вывода справочной информации по выбранному
               слову.
            6. Для  выхода  из  справочного  экрана HRLP нажмите клавишу
               Esc.
            Более подробно о THELP  рассказывается  в  файле  THELP.DOC,
       поставляемой с соответствующим компилятором.
                              Строка состояния
       -----------------------------------------------------------------
            При работе в Турбо отладчике в нижней части экрана выводится
       краткая справочная строка. В этой строке состояния кратко описаны
       клавиши или команды меню для текущего контекста.
                                    В окне
            Когда вы  находитесь  в  окне,  в  строке состояния показаны
       обычно команды, которые выполняются по функциональным клавишам:
       -----------------------------------------------------------------
       F1 - Help  F2 - Bkpt  F3 - Mod  F4 - Here  F5 - Zoom  F6 - Next
       F7 - Trace  F8 - Step  F9 - Run  F10 - Menu
       -----------------------------------------------------------------
            Рис. 2.7 Обычная строка состояния
       (F1 - Справка;  F2 - Точки останова; F3 - Режим; F4 - Здесь; F5 -
       Переключение;  F6 - Следующий;  F7 - Трассировка;  F8 - Шаг; F9 -
       Выполнение; F10 - Меню.)
            Если вы  нажмете клавишу Alt и удержите ее в таком состоянии


       секунду-другую, то на экран  выведутся  команды,  выполняемые  по
       клавише Alt:
       -----------------------------------------------------------------
       Alt: F2 - Bkpt to F3 - Close  F4 - Back  F5 - User  F6 - Undo  F7
       - Instr  F8 - Rtn F9 - To  F10 - Local
       -----------------------------------------------------------------

       TDeb 3.0 #1-3                = 66 =
            Рис. 2. 8 Строка состояния при нажатой клавише Alt
       (Alt: F2 - Точка останова; F3 - Закрыть; F4 - Обратно; F5 - Поль-
       зователь;  F6 - Отменить; F7 - Инструкции; F8 - Возврат; F9 - На;
       F10 - Локальный.)
            Если вы нажмете у будете удерживать клавишу Ctrl,  то на эк-
       ран выведутся команды, выполняемые при нажатии клавиши Ctrl и со-
       ответствующей буквы. Эта строка состояния изменяется в зависимос-
       ти от текущего окна и области и показывает сокращенные эквивален-
       ты  команд  текущего  локального меню.  Вы можете просмотреть все
       доступные команды локального меню, нажав клавиши Alt-F10 или Ctrl
       -F10 (при этом выведется все меню).
       -----------------------------------------------------------------
       Ctrl:I-Inspect W-Watch M-Module F-File P-Previous L-Line S-Search
       N-Next
       -----------------------------------------------------------------
            Рис. 2.9 Строка состояния при нажатой клавише Ctrl
       (Ctrl: I - Проверка; W - Просмотр; M - Модуль; F - Файл; P - Пре-
       дыдущий; L - Строка; S - Поиск; N - Следующий.)
            При наличии "мыши" для выполнения нужной команды нужно уста-
       новить курсор в соответствующей позиции строки состояния и нажать
       кнопку "мыши".
                         В меню или диалоговом окне
            Когда вы находитесь в меню или в диалоговом окне,  в  строке
       состояния кратко описано,  что делает текущий элемент.  Например,
       если подсвечена команда  View¦Registers  (Обзор¦Регистры),  то  в


       строке состояния говорится: Open a CPU registers window (открыва-
       ет окно регистров ЦП).
            Когда вы находитесь в локальном или глобальном  меню, строка
       состояния дает вам справочную информацию по меню.

       TDeb 3.0 #1-3                = 67 =
                          Глава 3. Небольшой пример
       -----------------------------------------------------------------
            Если вам  не терпится использовать Турбо отладчик,  но вы не
       относитесь к разряду тех людей,  которые перед этим подробно изу-
       чат сначала все руководство,  то в данной главе вы найдете доста-
       точно информации для отладки своей  первой  программы.  Когда  вы
       изучите описанные здесь основные принципы, интегрированный интер-
       фейс с пользователем и контекстную справочную систему, это позво-
       лит вам продолжить обучение самостоятельно.
            В данной  главе  описываются все основные средства Турбо от-
       ладчика. После изучения примеров программ (одна из которых реали-
       зована на языке Си, а другая - на Паскале), тексты которых имеют-
       ся  на  дистрибутивном  диске,  вы  увидите,  как  можно   делать
       следующее:
            - запускать и останавливать программу;
            - проверять содержимое переменных программы;
            - просматривать сложные объекты данных, такие, как массивы и
              структуры;
            - изменять значение переменных.
                              Примеры программ
       -----------------------------------------------------------------
            Примеры программ (TCDEMO.C на языке Си и TPDEMO.PAS на  Пас-
       кале) служат введением, с помощью которого вы сможете изучить две
       основные вещи,  необходимые при отладке программ: как запускать и
       останавливать программу,  и как анализировать переменные и струк-
       туры данных  программы.  Сами  программы  не  представляют  собой
       что-то  действительно  полезное,  некоторые  их части и структуры


       данных присутствуют исключительно ради  демонстрации возможностей
       Турбо отладчика.
            Демонстрационные программы позволяют  вам  ввести  несколько
       строк текста, а затем подсчитать число введенных букв и цифр. При
       завершении работы каждая из программ выводит некоторую статистику
       по  тексту,  включая  среднее число строк на строке и частоту ис-
       пользования каждой буквы.
            Убедитесь, что ваш текущий каталог содержит два файла, необ-
       ходимых для демонстрации работы данных программ. Для языка Си вам
       понадобятся файлы TCDEMO.C и TCDEMO.EXE, а для примера на Паскале
       необходимы файлы TPDEMO.PAS и TPDEMO.EXE (они содержатся на дист-
       рибутивных дискетах).
                               Запуск программы
            Для запуска программы на языке Си введите:

       TDeb 3.0 #1-3                = 68 =
               TC TCDEMO
            Для запуска программы на Паскале введите команду:
               TD TPDEMO
            Турбо отладчик  загружает демонстрационную программу и пози-
       ционирует курсор на начале программы.
       ----------------------------------------------------------------¬
       ¦Ё  File Edit View Run Breakpoint Data Option Window Help  READY¦
       ¦г=[*]=Module: TCDEMO  file: TCDEMO.C 32===============1=[ ][ ]¬¦
       ¦¦                                                             ^¦
       ¦¦static word showargs(int argc, char *argv[]_;                -¦
       ¦¦                                                             -¦
       ¦¦/* точка входа программы */                                  -¦
       ¦¦>int main(int argc, char **argv) {                           -¦
       ¦¦          unsigned int nlines, nwords, wordcount;            -¦
       ¦¦          unsigned long totalcharacters;                     -¦
       ¦¦                                                             -¦
       ¦¦          nlines  =  0;                                      -¦


       ¦¦          nwords  =  0;                                      -¦
       ¦¦          totalcharacters = 0;                               -¦
       ¦¦          showargs(argc,argv);                               -¦
       ¦¦          while (readaline() != 0) {                         -¦
       ¦¦                 wordcount = makeintwords(buffer);           -¦
       ¦¦                 nwords += wordcount;                        -¦
       ¦¦                 totalcharacters += analyzewords(buffer);    -¦
       ¦¦                 nlines++;                                   -¦
       ¦¦          }                                                  v¦
       ¦L<----------------------------------------------------------->-¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦                                                             ¦¦
       ¦L--------------------------------------------------------------¦
       ¦F1=HelpF2=BkptF3=CloseF4=HereF5=ZoomF6=NextF7=TraceF8=StepF9=R.¦
       L----------------------------------------------------------------
            Рис. 3. 1 Начальный экран при работе с программой на языке Си
       TCDEMO
            Оперативные клавиши:  F1=Help - cправка; F2=Bkpt - точка ос-
       танова; F3=Close - закрыть; F4=Here - здесь; F5=Zoom - переключе-
       ние  окон;  F6=Next - дальше;  F7=Trace - трассировка;  F8=Step -
       шаг; F9=Run - выполнить; F10=Menu - меню.
            Основное меню (верхняя строка):  Ё - системное меню;  File -
       файл; Edit  -  редактирование  View  -  обзор;  Run - выполнение;
       Breakpoints - точки останова; Data - данные; Options - параметры;
       Window - окно; Help - справка.
            Данный экран состоит из основной строки  меню,  окон  Module
       (Модуль) и Watches (Просмотр) и справочной строки.

       TDeb 3.0 #1-3                = 69 =
                               Завершение работы
            Чтобы выйти из отладчика в любой момент и вернуться в опера-


       ционную среду DOS,  нажмите клавиши Alt-X. Если при работе с при-
       мером вы безнадежно "заблудились",  нажатие клавиш Ctrl-F2 позво-
       лит вам перезагрузить  программу  и  начать  выполнение  сначала.
       Однако  при  нажатии данных клавиш не сбрасываются точки останова
       или просматриваемые величины. Чтобы сделать это, нужно воспользо-
       ваться клавишами Alt-F O (клавиши Alt-B D также позволяют удалить
       все точки останова, но иногда быстрее  перезагрузиться  с помощью ї
       Alt-F O).
                              Получение подсказки
            Когда вам  понадобиться получить справочную информацию о те-
       кущем окне, для этого нажмите клавишу F1. Вы можете получить раз-
       нообразную  информацию (на английском языке),  проходя по системе
       меню и нажимая клавишу F1 (будет выводиться краткий перечень  то-
       го, что делает каждая команда).

       TDeb 3.0 #1-3                = 70 =
                        Использование Турбо отладчика
       -----------------------------------------------------------------
            Далее следует описание по использованию отладчика.
                                    Меню
       -----------------------------------------------------------------
            В верхней части экрана показана строка меню. Для вывода меню
       с помощью данной строки, нажмите клавишу F10, используйте клавиши
       стрелок для выбора пункта меню, и нажмите клавишу Enter, или наж-
       мите клавишу Alt в сочетании с первой буквой  одного  из  пунктов
       меню.
       -----------------------------------------------------------------
        Ё  File Edit View Run Breakpoint Data Option Window Help  READY
       -----------------------------------------------------------------
            Рис. 3.2 Строка меню
            Нажмите клавишу F10.  Обратите внимание, что при этом курсор
       исчезает  из окна Module,  а команда (Ё) главного меню становится


       выделенной. Нижняя строка экрана также изменяется, показывая, ка-
       кие команды содержит системное меню (Ё).
            Для перемещения в системе меню используйте  клавиши стрелок.
       При нажатии "стрелки вниз" раскроется меню для подсвеченного эле-
       мента.
            Если у вас есть "мышь" то с ее помощью также можно открывать
       меню, установив указатель на соответствующий элемент меню (коман-
       ду) и нажав кнопку "мыши".
            Чтобы возвратиться на предыдущий уровень системы меню,  наж-
       мите клавишу Esc.  Когда в главном меню подсвечен один из элемен-
       тов меню,  то нажатие клавиши Esc возвращает вас в окно Module, а
       главное меню становится неактивным.
                              Строка состояния
       -----------------------------------------------------------------
            В нижней строке экрана показаны соответствующие функциональ-
       ные клавиши  и  выполняемые  ими функции.
       --------------------------------- ...
       F1=Help F2=Bkpt F3=Close F4=Here
       --------------------------------- ...
            ... ------------------------------------------------
                F5=Zoom F6=Next F7=Trace F8=Step F9=Run F10=Menu
            ... ------------------------------------------------
            Рис. 3.3 Строка состояния

       TDeb 3.0 #1-3                = 71 =
            Эта строка (справочная строка или строка состояния)  изменя-
       ется в зависимости от того,  что вы вводите (команды меню,  ответ
       на подсказку и т.д.). Например, нажмите клавишу Alt и удерживайте
       ее в таком состоянии одну или две секунды. Обратите внимание, что
       нижняя строка изменилась,  и в ней показаны функциональные клави-
       ши, которые вы можете использовать совместно с клавишей Alt.
            Теперь нажмите таким же образом клавишу Ctrl. Команды, пока-
       занные в нижней строке экрана,  представляют собой сокращения ко-


       манд  локальных  меню для текущей области окна.  Они изменяются в
       зависимости от того,  в каком окне и в какой области  окна  вы  в
       данный момент находитесь. Далее мы расскажем об этом подробнее.
            Когда вы входите в систему меню,  строка состояния снова из-
       меняется и отражает функции подсвеченного в данный момент элемен-
       та меню.  Для  перехода в строку меню нажмите клавишу F10,  затем
       стрелку вправо для выбора пункта File (Файл).  В строке состояния
       теперь говориться: "File oriented functions" (функции, ориентиро-
       ванные на работу с файлами). Для просмотра возможностей меню File
       используйте клавишу "стрелка вниз".  Затем нажмите клавишу Esc или
       выберите с помощью "мыши" окно Module, чтобы выйти из системы ме-
       ню.

       TDeb 3.0 #1-3                = 72 =
                                    Окна
       -----------------------------------------------------------------
            Область окон занимает большую часть экрана. В окнах вы може-
       те просматривать части программы (наблюдая их в различных окнах и
       областях).
            Работа начинается с вывода двух окон: окна Module (Модуль) и
       окна  Watches  (Просмотр). Пока вы не откроете другие окна или не
       измените (настроите) данные,  эти окна будут полными. Это означа-
       ют, что они заполняют весь экран без перекрытия. Новые окна авто-
       матически перекрывают существующие, пока вы по ним перемещаетесь.
       ----------------------------------------------------------------¬
       ¦Ё Edit File View Run Breakpoints Data Options Window Help READY¦
       ¦г=[*]=Module: TCDEMO  file: TCDEMO.C 3 ===============1=[ ][ ]¬¦
       ¦¦ program DoNuthin;                                           ^¦
       ¦¦                                                             -¦
       ¦¦> begin                                                      -¦


       ¦¦  end.                                                       -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦          Это окно Module                                    -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             v¦
       ¦L<----------------------------------------------------------->-¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦           Это окно Watches                                  ¦¦
       ¦L--------------------------------------------------------------¦
       ¦F1=HelpF2=BkptF3=CloseF4=HereF5=ZoomF6=NextF7=TraceF8=StepF9=R.¦
       L----------------------------------------------------------------
            Рис. 3.4 Неперекрывающиеся окна Module и Watches
            Оперативные клавиши:  F1=Help - cправка; F2=Bkpt - точка ос-
       танова; F3=Close - закрыть; F4=Here - здесь; F5=Zoom - переключе-
       ние  окон;  F6=Next - дальше;  F7=Trace - трассировка;  F8=Step -
       шаг; F9=Run - выполнить; F10=Menu - меню.
            Основное меню (верхняя строка):  Ё - системное меню;  File -
       файл; View - обзор; Run - выполнение; Breakpoints - точки остано-
       ва; Data - данные;  Options - параметры;  Window - окно;  Help  -
       справка.
            Заметим, что окно Module имеет двойную рамку  и подсвеченный
       заголовок.  Это означает,  что данное окно является активным.


Для
       перемещения в текущем окне вы можете использовать стрелки  управ-

       TDeb 3.0 #1-3                = 73 =
       ления курсором,  а также клавиши Home, End, PgUp и т.д.). Для пе-
       рехода в другое окно нажмите клавишу F6. При этом активным стано-
       вится  окно Watches (оно будет иметь двойную рамку и подсвеченный
       заголовок).
            Для создания  новых окон используйте команду меню View¦Stack
       (Обзор¦Стек). При выборе данной команды на окно Module накладыва-
       ется окно Stack (Стек).
            Для удаления текущего окна нажмите клавиши Alt-F3.  Если  вы
       сделаете это сейчас, то окно Stack исчезнет.
            Турбо отладчик запоминает последние закрытые  окна,  поэтому
       при  необходимости  вы  можете их восстановить.  Если вы случайно
       закрыли окно,  нажмите клавиши Alt-W, чтобы перейти в меню Window
       (Окно).  Нажмите U для выбора команды Undo Close (Отменить закры-
       тие) или  используйте  команду меню Window¦Undo Close (Окно¦Отме-
       нить закрытие). При этом вновь появится окно Stack. Чтобы восста-
       новить  последнее  закрытое окно,  вы можете также нажать клавиши
       Alt-F6.
            Меню Window  (Окно) содержит команды,  которые позволяют вам
       настраивать окна,  уже имеющиеся на экране. Вы можете как переме-
       щать окно по экрану,  так и изменять его размер. (Для этого можно
       также использовать клавишу Ctrl-F5).
            Для позиционирования текущего окна используйте команду  меню
       Window¦Size/Move (Окно¦Размер/Перемещение),   затем   используйте
       клавиши стрелок для позиционирования текущего окна (в данном слу-
       чае  окна  Staсk)  на экране.  Для настройки размера окна нажмите
       клавишу Shift и (удерживая клавишу Shift в нажатом положении) од-
       ну  из клавиш стрелок.  Когда вы выберете нужную позицию и размер
       окна, нажмите клавишу Enter.
            Теперь для подготовки  к  следующему  разделу  удалите  окно


       Stack (Стек), нажав клавишу Alt-F3. В зависимости от того, загру-
       зили вы программу на языке Паскаль или на языке Си,  вам  следуют
       перейти к разделу,  относящемуся к программе на Паскале,  или пе-
       рейти к следующему разделу,  где описывается работа с  программой
       на языке Си.
                 Использование примера программы на языке Си
       -----------------------------------------------------------------
            Закрашенная стрелка  (>) в левом столбце окна Module показы-
       вает,  где Турбо отладчик остановил выполнение  вашей  программы.
       Если вы еще не запускали свою программу,  стрелка находится на ее
       первой строке.  Для трассировки одной исходной  строки  программы
       нажмите  клавишу  F7.  Стрелка  и курсор переместятся при этом на
       следующую выполняемую строку.
            Посмотрите на правую границу заголовка окна Module (Модуль).
       В  ней показана строка,  в которой находится курсор.  Переместите

       TDeb 3.0 #1-3                = 74 =
       курсор с помощью клавиш управления  курсором  (стрелки)  вверх  и
       вниз  и обратите внимание на изменение номера строки в заголовке.
                 Примечание: Чтобы  позиционировать  курсор  на строку в
            окне Module,  нажмите клавиши Ctrl-G, введите номер строки и
            нажмите Enter.
            Как можно видеть,  войдя в меню Run (Выполнение), существует
       несколько способов  запуска программы на выполнение. Предположим,
       к примеру, что вы хотите выполнить программу до строки 39.
            Чтобы запустить программу на выполнение, пока она не достиг-
       нет строки 39,  переместите курсор на эту строку, а затем нажмите
       клавишу F4.  Теперь, когда курсор находится на строке 39, нажмите
       клавишу  F7 для выполнения еще одной строки исходного кода.  Пос-
       кольку выполняемая вами строка представляет  собой  вызов  другой
       функции, то стрелка теперь позиционируется на первой строке функ-


       ции showargs. Курсор немедленно переходит к строке 151, где нахо-
       дится определение showargs.
            Продолжайте нажимать клавишу F7,  пока вы не выполните функ-
       цию  showargs  и  не  вернетесь  на строку,  следующую за вызовом
       (строка 40).  Вместо этого можно нажать клавиши Alt-F8.  При этом
       программа остановится, когда текущая функция возвратит управление
       (вы также перейдете на строку 40).  Эту команду полезно использо-
       вать, когда вы не хотите медленно проходить по шагам всю функцию.

       TDeb 3.0 #1-3                = 75 =
            Если на  строке  39 вместо клавиши F7 вы нажмете клавишу F8,
       то  вместо перехода в функцию вы перейдете  сразу  к  строке  40.
       Клавиша F8 аналогична клавише F7,  которая выполняет функцию,  но
       она не выполняет по шагам код функции.
       ----------------------------------------------------------------¬
       ¦Ё File Edit View Run Breakpoints Data Options Window Help READY¦
       ¦г=[*]=Module: TCDEMO  file: TCDEMO.C 32===============1=[ ][ ]¬¦
       ¦¦           unsigned int nlines, nwords, wordcount;           ^¦
       ¦¦           unsigned long totalcharacters;                    -¦
       ¦¦                                                             -¦
       ¦¦           nlines  =  0;                                     -¦
       ¦¦           nwords  =  0;                                     -¦
       ¦¦           totalcharacters = 0;                              -¦
       ¦¦           showargs(argc,argv);                              -¦
       ¦¦>          while (readaline() != 0) {                        -¦
       ¦¦                  wordcount = makeintwords(buffer);          -¦
       ¦¦                  nwords += wordcount;                       -¦
       ¦¦                  totalcharacters += analyzewords(buffer);   -¦
       ¦¦                  nlines++;                                  -¦
       ¦¦           }                                                 -¦


       ¦¦           printstatistics(nlines, nwords, totalcharacters); -¦
       ¦¦           return(0);                                        -¦
       ¦¦    }                                                        -¦
       ¦¦    ¦* Чтобы превратить буфер в список завершающихся нулем   -¦
       ¦¦       слов, удалить пустое место                            v¦
       ¦L<----------------------------------------------------------->-¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦                                                             ¦¦
       ¦L--------------------------------------------------------------¦
       ¦F1=HelpF2=BkptF3=CloseF4=HereF5=ZoomF6=NextF7=TraceF8=StepF9=R.¦
       L----------------------------------------------------------------
            Рис. 3. 5 Программа остановилась после  возврата  из  функции
       showargs
            Чтобы выполнить программу до тех пор,  пока не будет достиг-
       нуто  заданное  место,  вы можете непосредственно указать функцию
       или номер строки,  не перемещая на данную строку курсор,  а затем
       выполнить программу до этой точки. Чтобы задать метку, до которой
       вы хотите выполнить программу,  нажмите клавиши Alt-F9. Выведется
       диалоговое окно. Введите readaline и нажмите клавишу Enter. Прог-
       рамма начнет выполнение и остановится в начале  функции readaline
       (строка 142).

       TDeb 3.0 #1-3                = 76 =
           Задание точек останова в примере программы на языке Си
       -----------------------------------------------------------------
            Другой способ управлять остановкой программы состоит  в  ис-
       пользовании точек останова.  Простейший способ задать точки оста-
       нова заключается в использовании клавиши F2.  Переместите  курсор
       на строку 44 и нажмите клавишу F2.  Турбо  отладчик  подсвечивает
       строку, показывая, что на ней установлена точка останова.
            Для переключения (установки и отмены) точек останова в прог-


       рамме можно также использовать "мышь".  Для этого  надо  щелкнуть
       кнопкой "мыши",  находясь в первых двух позициях окна Module (Мо-
       дуль).
       ----------------------------------------------------------------¬
       ¦Ё File Edit View Run Breakpoints Data Options Window Help READY¦
       ¦г=[*]=Module: TCDEMO  file: TCDEMO.C 44===============1=[ ][ ]¬¦
       ¦¦           unsigned int nlines, nwords, wordcount;           ^¦
       ¦¦           unsigned long totalcharacters;                    -¦
       ¦¦                                                             -¦
       ¦¦           nlines  =  0;                                     -¦
       ¦¦           nwords  =  0;                                     -¦
       ¦¦           totalcharacters = 0;                              -¦
       ¦¦           showargs(argc,argv);                              -¦
       ¦¦           while (readaline() != 0) {                        -¦
       ¦¦                  wordcount = makeintwords(buffer);          -¦
       ¦¦                  nwords += wordcount;                       -¦
       ¦¦                  totalcharacters += analyzewords(buffer);   -¦
       ¦¦>                 nlines++;                                  -¦
       ¦¦           }                                                 -¦
       ¦¦           printstatistics(nlines, nwords, totalcharacters); -¦
       ¦¦           return(0);                                        -¦
       ¦¦    }                                                        -¦
       ¦¦    /* Чтобы превратить буфер в список завершающихся нулем   -¦
       ¦¦       слов, удалить пустое место                            v¦
       ¦L<----------------------------------------------------------->-¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦                                                             ¦¦
       ¦L--------------------------------------------------------------¦


       ¦F1=HelpF2=BkptF3=CloseF4=HereF5=ZoomF6=NextF7=TraceF8=StepF9=R.¦
       L----------------------------------------------------------------
            Рис. 3. 6 Точка останова на строке 44
            Оперативные клавиши:  F1=Help - cправка; F2=Bkpt - точка ос-
       танова; F3=Close - закрыть; F4=Here - здесь; F5=Zoom - переключе-
       ние  окон;  F6=Next - дальше;  F7=Trace - трассировка;  F8=Step -
       шаг; F9=Run - выполнить; F10=Menu - меню.
            Теперь нажмите клавишу F9 для выполнения вашей программы без
       прерывания. Экран переключается в режим экрана программы. Демонс-
       трационная программа при этом работает и ждет,  пока  вы  введете
       строку текста. Наберите символы abc, пробел, der и нажмите клави-

       TDeb 3.0 #1-3                = 77 =
       шу Enter.  На дисплее вновь появится  экран  Турбо  отладчика,  а
       стрелка будет позиционирована на строке 44 (Рис.  3.6), где уста-
       новлена  точка останова,  и прекратила свое выполнение программа.
       Теперь нажмите клавишу F2, чтобы "выключить" (отменить) точку ос-
       танова.
            Полное описание точек останова,  включая условные и глобаль-
       ные точки останова, содержится в Главе 7.

       TDeb 3.0 #1-3                = 78 =
                         Использование окна Watches
       -----------------------------------------------------------------
            В окне Watches (Просмотр) в нижней части экрана показываются
       значения заданных вами переменных. Например, чтобы увидеть значе-
       ние переменной nwords,  переместите курсор на имя  переменной  на
       строке 42  и выберите команду Watch (Просмотр) из локального меню
       окна Module.  Можно использовать также сокращение  этой  команды.
       Для этого нажмите клавиши Alt-F10 для выбора сокращенного вариан-
       та,  затем нажмите клавиши Ctrl-W (строка состояния).  Это сокра-
       щенный вариант команды локального меню Alt-F10 W.


            Если у вас есть "мышь", то переместитесь на Ctrl-Win в стро-
       ке состояния и нажмите кнопку "мыши".
       ----------------------------------------------------------------¬
       ¦ Ё File Edit View Run Breakpoints Data Options Window Help READY¦
       ¦г=[*]=Module: TCDEMO  file: TCDEMO.C 32===============1=[ ][ ]¬¦
       ¦¦            nwords  =  0;                                    ^¦
       ¦¦            totalcharacters = 0;                             -¦
       ¦¦            showargs(argc,argv);                             -¦
       ¦¦            while (readaline() != 0) {                       -¦
       ¦¦                   wordcount = makeintwords(buffer);         -¦
       ¦¦                   nwords += wordcount;                      -¦
       ¦¦                   totalcharacters += analyzewords(buffer);  -¦
       ¦¦>                  nlines++;                                 -¦
       ¦¦            }                                                -¦
       ¦¦            printstatistics(nlines, nwords, totalcharacters);-¦
       ¦¦            return(0);                                       -¦
       ¦¦     }                                                       -¦
       ¦¦     ¦* Чтобы превратить буфер в список завершающихся нулем  -¦
       ¦¦        слов, удалить пустое место                           -¦
       ¦¦      *¦                                                     -¦
       ¦¦     static int makeintwords(char *bufp) {                   -¦
       ¦¦             unsigned int nwords;                            -¦
       ¦¦       слов, удалить пустое место                            v¦
       ¦L<----------------------------------------------------------->-¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦nwords                  unsigned int 0 (Ox2)                 ¦¦
       ¦L--------------------------------------------------------------¦
       ¦F1=HelpF2=BkptF3=CloseF4=HereF5=ZoomF6=NextF7=TraceF8=StepF9=R.¦


       L----------------------------------------------------------------
            Рис. 3.7 Переменная в окне Watches
            Переменная nword  появилась теперь в окне Watches (Просмотр)
       в нижней части экрана,  где указаны также ее тип (unsigned int) и
       значение.  По  мере  выполнения программы Турбо отладчик изменяет
       это значение и отражает текущее значение переменной.

       TDeb 3.0 #1-3                = 79 =
            Анализ простых объектов данных программы на языке Си
       -----------------------------------------------------------------
            Когда вы останавливаете выполнение своей программы,  сущест-
       вует много способов просмотра данных с  помощью  команды  Inspect
       (Проверка). Это очень мощное средство позволяет вам анализировать
       структуры данных таким же образом,  как если бы вы визуально наб-
       людали их при разработке программы.
            Команды Inspect  (в  различных локальных меню и в меню Data)
       позволяют вам наблюдать за любой заданной  переменной.  Предполо-
       жим, вы хотите взглянуть на значение переменной nlines.Перемести-
       те курсор таким образом, чтобы он оказался под одной из букв име-
       ни nlines,  и выберите команду Inspect (Проверка) локального меню
       окна Module (Модуль),  для чего нажмите клавиши Ctrl-I.  При этом
       будет выведено окно Inspector (Проверка).
       ----------------------------------------------------------------¬
       ¦Ё File Edit View Run Breakpoints Data Options Window Help READY¦
       ¦--[*]-Module: TCDEMO  file: TCDEMO.C 44-----------------------¬¦
       ¦¦            nwords  =  0;                                    ¦¦
       ¦¦            totalcharacters = 0;                             ¦¦
       ¦¦            showargs(argc,argv);                             ¦¦
       ¦¦>           while (readaline() != 0) {                       ¦¦
       ¦¦                   wordcount = makeintwords(buffer);         ¦¦


       ¦¦                   nwords += wordcount;                      ¦¦
       ¦¦                   гInspecting nlines====3=[ ][ ]¬(buffer);  ¦¦
       ¦¦                   ¦@793E:FFCO                   ¦           ¦¦
       ¦¦            }      ¦unsigned-int-------0-(Ox0)---¦           ¦¦
       ¦¦            printstL=============================-haracters);¦¦
       ¦¦            return(0);                                       ¦¦
       ¦¦     }                                                       ¦¦
       ¦¦     /* Чтобы превратить буфер в список завершающихся нулем  ¦¦
       ¦¦        слов, удалить пустое место                           ¦¦
       ¦¦      */                                                     ¦¦
       ¦¦     static int makeintwords(char *bufp) {                   ¦¦
       ¦¦             unsigned int nwords;                            ¦¦
       ¦¦       слов, удалить пустое место                            ¦¦
       ¦L--------------------------------------------------------------¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦nwords                  unsigned int 0 (Ox2)                 ¦¦
       ¦L--------------------------------------------------------------¦
       ¦F1=HelpF2=BkptF3=CloseF4=HereF5=ZoomF6=NextF7=TraceF8=StepF9=R.¦
       L----------------------------------------------------------------
            Рис. 3.8 Окно Inspector
            В первой строке (заголовке) этого окна вам  сообщается адрес
       данной переменной в памяти.  Третья строка показывает,  какой тип
       данных хранится в переменной nlines (это тип unsigned  int  языка
       Си). Справа указано текущее значение переменной.
            Теперь, проверив  значение этой переменной,  нажмите клавишу

       TDeb 3.0 #1-3                = 80 =
       Esc для того,  чтобы закрыть окно Inspector.  Для этого (как и во
        всех других  окнах) можно также воспользоваться клавишами Alt-F3,
       либо закрыть окно с помощью "мыши".


            Давайте рассмотрим, что вы в действительности здесь сделали.
       Нажав клавишу Ctrl, вы выбрали сокращенный вариант команд локаль-
       ных меню в окне Module.  Нажатие клавиши I задало команду Inspect
       (Проверка).
            Для проверки  элемента  данных,  который  не  виден  в  окне
       Module, выберите команду Data¦Inspect (Данные¦Проверка). Выводит-
       ся рамка  подсказки  (диалоговое окно),  где вы можете ввести имя
       переменной, которую требуется проверить.  Наберите имя letterinfo
       и нажмите клавишу Enter.  Появляется окно проверки, где выводятся
       значения элементов массива letterinfo.  В заголовке окна проверки
       показывается имя проверяемых данных. Первая строка под заголовком
       -  это  адрес  в  оперативной  памяти  первого  элемента  массива
       letterinfo. Для просмотра (с помощью "прокрутки" окна) 26 элемен-
       тов,  входящих в letterinfo, используйте клавиши стрелок (в заго-
       ловке окна проверки выводится имя и тип проверяемых  вами данных,
       которые в точности соответствуют описанию этих данных, содержаще-
       муся в исходном файле). В следующем разделе рассказывается о том,
       как можно проверять такие сложные объекты данных.

       TDeb 3.0 #1-3                = 81 =
            Анализ сложных объектов данных программы на языке Си
       -----------------------------------------------------------------
            Сложные (составные) объекты данных,  такие,  как массивы или
       структуры,  содержат несколько компонентов. Переместитесь на чет-
       вертый элемент массива letterinfo  (элемент,  указанный  индексом
       [3]).  Для  вывода  локального меню для окна Inspector (Проверка)
       нажмите клавиши Alt-F10 и I.  Появляется новое окно  проверки,  в
       котором показывается содержимое элемента  массива.  В  этом  окне
       Inspector показано содержимое структуры типа linfo.
       ----------------------------------------------------------------¬


       ¦ Ё File Edit View Run Breakpoints Data Options Window Help READY¦
       ¦--[*]-Module: TCDEMO  file: TCDEMO.C 44-----------------------¬¦
       ¦¦           letterindex = toupper(*bufp) - 'A'; /* index  from¦¦
       ¦¦           if (first) {                                      ¦¦
       ¦¦                  letterinfo[letterindex].firstletter++;     ¦¦
       ¦¦           -Inspecting letterinfo------------3¬              ¦¦
       ¦¦           ¦@793E:0852                        ¦;  /* count   ¦¦
       ¦¦           ¦[0]                         {1,1) ¦              ¦¦
       ¦¦           ¦[1]                         {1,0) ¦              ¦¦
       ¦¦           ¦[2]                         {1,0) ¦              ¦¦
       ¦¦           ¦[3]                         {1,1) ¦              ¦¦
       ¦¦    }      ¦[4]                         {1,0) ¦              ¦¦
       ¦¦    wordcou¦[5]                         {1,0} ¦              ¦¦
       ¦¦    bufp++;+----------------------------------+              ¦¦
       ¦¦           ¦struct linfo                      ¦              ¦¦
       ¦¦  return(chL-----------------------------------              ¦¦
       ¦¦> }         г=Inspecting Letterinfo[3]==4=[ ][ ]¬            ¦¦
       ¦¦            ¦@793E:085E                         ¦            ¦¦
       ¦¦  /* вывести¦count                    1 (Ox1)   ¦            ¦¦
       ¦¦     всю ста¦firstletter              1 (Ox1)   ¦            ¦¦
       ¦¦            ¦<--------------------------------->¦            ¦¦
       ¦¦            ¦struct linfo                       ¦            ¦¦
       ¦L------------L===================================--------------¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦nwords                  unsigned int 0 (Ox2)                 ¦¦
       ¦L--------------------------------------------------------------¦
       ¦F1=HelpF2=BkptF3=CloseF4=HereF5=ZoomF6=NextF7=TraceF8=StepF9=R.¦


       L----------------------------------------------------------------
            Рис. 3.9 Проверка структуры
            Когда вы поместите курсор на одном из имен элементов  струк-
       туры, тип  данных  этого  элемента появится в нижней области окна
       проверки.  Если один из этих элементов представляет собой, в свою
       очередь,  составной  объект данных,  вы также можете дать команду
       проверку и еще более углубиться в структуру данных.
            Для удаления  окна  Inspector  (Проверка)  и возврата в окно
       Module (Модуль) нажмите  клавиши  Alt-F3.  (Клавиши  Alt-F3  дают
       удобный способ  удаления нескольких окон проверки сразу.  Если вы
       нажмете Esc, то будет удалено только последнее окно проверки.)

       TDeb 3.0 #1-3                = 82 =
              Изменение значений данных в программе на языке Си
       -----------------------------------------------------------------
            Итак, вы  теперь  узнали,  как  можно просматривать данные в
       программе.  Давайте теперь попробуем изменить  значение  элемента
       данных.
            С помощью  клавиш со стрелками перейдите на строку 38 исход-
       ного файла.  Поместите курсор на переменную totalcharacters и для
       проверки ее значения нажмите клавиши Ctrl-I.  После того, как бу-
       дет открыто окно Inspector,  нажмите для вывода  локального  меню
       окна Inspector  клавиши  Alt-F10 и выберите команду Change (Изме-
       нить).  (Это можно сделать также непосредственно,  нажав  клавиши
       Ctrl-C.) Появляется  подсказка  (диалоговое окно),  запрашивающая
       новое значение.
       ----------------------------------------------------------------¬
       ¦Ё File Edit View Run Breakpoints Data Options Window HelpPROMPT¦
       ¦--[*]-Module: TCDEMO  file: TCDEMO.C 38-----------------------¬¦
       ¦¦           nlines = 0;                                       ¦¦
       ¦¦           nwords = 0;                                       ¦¦


       ¦¦           totalcharacters = 0;                              ¦¦
       ¦¦           г[*]Inspecting totalcharacters==3=[ ][ ]¬         ¦¦
       ¦¦           ¦@788E:FFC6                             ¦         ¦¦
       ¦¦           ¦unsigned-long-----------6L-(Ox60)------¦ffer);   ¦¦
       ¦¦           L<------------------------------------->-         ¦¦
       ¦¦    г[*]= Enter new value for unsigned long totalcharacters==¬¦¦
       ¦¦    ¦ totalcharacters + 4                                   ¦¦¦
       ¦¦    ¦                                                       ¦¦¦
       ¦¦    ¦  OK       Cancel        Help                          ¦¦¦
       ¦¦    L=======================================================-¦¦
       ¦¦  }                                                          ¦¦
       ¦¦  ¦* Превратить буфер в список завершающихся нулевым символо즦
       ¦¦   * строк, которые завершаются двумя нулями, удалив пустое  ¦¦
       ¦¦   * пространство *¦                                         ¦¦
       ¦¦  static int makeintowords(char *bufp) {                     ¦¦
       ¦L--------------------------------------------------------------¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦                                                             ¦¦
       ¦L--------------------------------------------------------------¦
       ¦Enter item prompted for in dialog title                        ¦
       L----------------------------------------------------------------
            Рис. 3.10 Подсказка команды Change
            В заголовке диалогового окна вам сообщается: Enter new value
       for unsigned long totalcharacters (введите новое значение для пе-
       ременной totalcharacters типа unsigned long),  а в нижней  строке
       экрана говорится:  Enter item prompted by a dialog title (введите
       элемент данных, указанный в заголовке диалогового окна).
            В данный момент вы можете ввести любое выражение  языка  Си,


       при    вычислении    которого    получается    число.    Наберите

       TDeb 3.0 #1-3                = 83 =
       totalcharacters + 4 и нажмите клавишу Enter.  В окне проверки те-
       перь будет показано новое значение - 10L (OxA).
            Для изменения элемента данных,  который не виден  в  текущем
       окне Module (Модуль), выберите команду Data¦Evaluate/Modify (Дан-
       ные¦Вычисление/Модификация). При  этом  будет выведено окно подс-
       казки,  в которой вы можете ввести имя изменяемой переменной. На-
       берите имя argc и нажмите клавишу Enter.  Наберите 123 и  нажмите
       Enter. Результат (во втором окне) изменяется и принимает значение
       int 123 (Ox7B).
       ----------------------------------------------------------------¬
       ¦Ё File Edit View Run Breakpoints Data Options Window HelpPROMPT¦
       ¦--[*]-Module: TCDEMO  file: TCDEMO.C 38-----------------------¬¦
       ¦¦ static void showargs(int argc, char *argv[]);               ¦¦
       ¦¦                                                             ¦¦
       ¦¦ /* program eг[*]==============Evaluate/Modify===========¬   ¦¦
       ¦¦         unsi¦Expression                      ¦   Eval   ¦   ¦¦
       ¦¦         unsi¦ argc                           ¦  ------- ¦   ¦¦
       ¦¦             ¦--------------------------------¦-- Cancel ¦   ¦¦
       ¦¦         nlin¦Result                          ¦  ------- ¦   ¦¦
       ¦¦         nwor¦int 123 (Ox7B)                  ¦   Help   ¦   ¦¦
       ¦¦         tota¦-------------------------------^¦--------- ¦   ¦¦
       ¦¦         show¦New value                      -¦  Modify  ¦   ¦¦
       ¦¦         whil¦ 123                           v¦  ------- ¦   ¦¦
       ¦¦>            L===========================================-   ¦¦
       ¦¦  }                                                          ¦¦
       ¦¦  /* Превратить буфер в список завершающихся нулевым символо즦
       ¦¦   * строк, которые завершаются двумя нулями, удалив пустое  ¦¦


       ¦¦   * пространство */                                         ¦¦
       ¦¦  static int makeintowords(char *bufp) {                     ¦¦
       ¦L--------------------------------------------------------------¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦                                                             ¦¦
       ¦L--------------------------------------------------------------¦
       ¦Enter new value                                                ¦
       L----------------------------------------------------------------
            Рис. 3.11 Диалоговое окно Evaluate/Modify
            Expression - выражение;  Result - результат; New value - но-
       вое значение; Enter new value - введите новое значение.
            Это было краткое введение по использованию  Турбо  отладчика
       для работы с программой на языке Си. Более подробно об этом расс-
       казывается в описании примера сеанса отладки в Главе 14,  где ис-
       пользуется версия данной программы с намеренно введенной ошибкой.
                 Использование примера программы на Паскале
       -----------------------------------------------------------------
            Закрашенная стрелка в левом столбце окна Module (Модуль) по-
       казывает,  где Турбо отладчик остановил выполнение вашей програм-

       TDeb 3.0 #1-3                = 84 =
       мы. Так как вы еще не запускали свою программу, стрелка находится
       на ее первой строке. Для трассировки одной исходной строки нажми-
       те клавишу F7.  Стрелка и курсор переместятся при этом на следую-
       щую строку.
            Посмотрите на правую границу заголовка окна Module (Модуль).
       В ней показана строка,  в которой находится  курсор.  Переместите
       курсор  с помощью клавиш управления курсором  (стрелки)  вверх  и
       вниз и обратите внимание на изменение номера строки в заголовке.
            Чтобы запустить программу на выполнение, пока она не достиг-


       нет строки 221, переместите курсор на эту строку, а затем нажмите
       клавишу F4.  Программа TPDEMO выведет  вам  подсказку  для  ввода
       строки. Наберите несколько символов (ABC,  пробел, DEF) и нажмите
       клавишу Enter.  Теперь, если курсор находится на строке 221, наж-
       мите дважды клавишу F7 для выполнения еще  двух  строк  исходного
       кода.  Поскольку выполняемая вами строка представляет собой вызов
       другой процедуры (функции),  то стрелка теперь позиционируется на
       первой строке функции ProcessLine.  Если вы будете продолжать на-
       жимать клавишу F7, то будет выполняться функция ProcessLine, пока
       управление не  вернется  на  следующую  за вызовом строку (строка
       224). Вместо этого можно нажать клавиши Alt-F8. При этом програм-
       ма остановится,  когда  текущая функция ProcessLine возвратит уп-
       равление.  Эту команду полезно использовать,  когда вы не  хотите
       медленно проходить по шагам всю функцию или процедуру.

       TDeb 3.0 #1-3                = 85 =
            Если на  строке 221 вы вместо клавиши F7 нажмете оперативную
       клавишу F8,  то вместо перехода в функцию курсор переместится  на
       строку 224. Клавиша F8 аналогична клавише F7: она также выполняет
       функции, но не переводит вас в исходный код функции.
       ----------------------------------------------------------------¬
       ¦Ё File Edit View Run Breakpoints Data Options Window Help READY¦
       ¦г=[*]=Module: TPDEMO  file: TPDEMO.PAS 224============1=[ ][ ]¬¦
       ¦¦     while buffer <> '' do                                   ^¦
       ¦¦     begin                                                   -¦
       ¦¦         ProcessLine(Buffer);                                -¦
       ¦¦>        Buffer := GetLine;                                  -¦
       ¦¦     end;                                                    -¦
       ¦¦     ShowResults;                                            -¦


       ¦¦     ParmsOnHeap;                                            -¦
       ¦¦   end.                                                      -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             v¦
       ¦L<----------------------------------------------------------->-¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦                                                             ¦¦
       ¦L--------------------------------------------------------------¦
       ¦F1=HelpF2=BkptF3=CloseF4=HereF5=ZoomF6=NextF7=TraceF8=StepF9=R.¦
       L----------------------------------------------------------------
            Рис. 3. 12 Программа остановилась после возврата из процеду-
       ры
            Чтобы выполнить программу до тех пор,  пока не будет достиг-
       нуто  заданное  место,  вы можете непосредственно указать функцию
       или номер строки,  не перемещая курсор на данную строку курсор, а
       затем выполнить программу до этой точки.  Чтобы задать метку,  до
       которой вы хотите выполнить программу,  нажмите  клавиши  Alt-F9.
       Программа  начнет  выполнение  и  остановится  в  начале  функции
       GetLine.

       TDeb 3.0 #1-3                = 86 =
         Задание точек останова в примере программы на языке Паскаль
       -----------------------------------------------------------------


            Другой способ управлять остановкой программы состоит  в  ис-
       пользовании точек останова.  Простейший способ задать точки оста-
       нова заключается в использовании клавиши F2.  Переместите  курсор
       на  строку 121 и нажмите F2.  Турбо отладчик подсвечивает строку,
       показывая, что на ней установлена точка останова.
            Точки останова  можно  устанавливать  и отменять также с по-
       мощью "мыши".  Для этого нужно переместиться на первую или вторую
       позицию окна Module и нажать кнопку "мыши".
       ----------------------------------------------------------------¬
       ¦Ё File Edit View Run Breakpoints Data Options Window Help READY¦
       ¦г=[*]=Module: TPDEMO  file: TPDEMO.PAS 121============1=[ ][ ]¬¦
       ¦¦    i  :  integer;                                           ^¦
       ¦¦    WordLen : Word;                                          -¦
       ¦¦                                                             -¦
       ¦¦  begin { ProcessLine }                                      -¦
       ¦¦>   Inc(NumLines);                                           -¦
       ¦¦    i := 1;                                                  -¦
       ¦¦    while i <= Length(S) do                                  -¦
       ¦¦    begin                                                    -¦
       ¦¦      { Пропустить не буквы }                                -¦
       ¦¦      while (i <= Length(S)) and not IsLetter(S[i]) do       -¦
       ¦¦       Inc(i);                                               -¦
       ¦¦                                                             -¦
       ¦¦      { Найти конец слова, обработать счетчики букв и слов } -¦
       ¦¦      WordLen := 0;                                          -¦
       ¦¦      while (i <= Length(S)) and IsLetter(S[i]) do           -¦
       ¦¦      begin                                                  -¦
       ¦¦        Inc(NumLetters);                                     -¦


       ¦¦        Inc(LetterTable[UpCase(S[i])].Count);                v¦
       ¦L<----------------------------------------------------------->¬¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦                                                             ¦¦
       ¦L--------------------------------------------------------------¦
       ¦F1=HelpF2=BkptF3=CloseF4=HereF5=ZoomF6=NextF7=TraceF8=StepF9=R.¦
       L----------------------------------------------------------------
            Рис. 3. 13 Точка останова на строке 121
            Теперь нажмите клавишу F9 для выполнения вашей программы без
       прерывания. Экран переключается в режим экрана программы. Демонс-
       трационная  программа  при этом работает и ждет,  пока вы введете
       строку текста. Наберите abc, пробел, def и нажмите клавишу Enter.
       На дисплее появится экран Турбо отладчика,  а стрелка будет пози-
       ционирована на строке 121, где установлена точка останова и прек-
       ратила свое выполнение программа.
            Полное описание точек останова,  включая условные и глобаль-
       ные точки останова, содержится в Главе 7.

       TDeb 3.0 #1-3                = 87 =
                         Использование окна Watches
       -----------------------------------------------------------------
            В окне Watches (Просмотр) в нижней части экрана показываются
       значения заданных вами переменных. Например, чтобы увидеть значе-
       ние переменной NumWords,  переместите курсор на имя переменной на
       строке 144  и  выберите  команду Watch (Просмотр) локального меню
       окна Module. Можно также использовать сокращенный вариант -  кла-
       виши Alt-F10 и клавиши Ctrl-W (строка состояния). Это сокращенный
       вариант команды локального меню.
            Кроме того можно позиционироваться на Ctrl-Win в строке сос-
       тояния и нажать правую кнопку "мыши".
       ----------------------------------------------------------------¬


       ¦ Ё File Edit View Run Breakpoints Data Options Window Help READY¦
       ¦г=[*]=Module: TPDEMO  file: TPDEMO.PAS 121============1=[ ][ ]¬¦
       ¦¦         IncLetterTable(UpCase(S[i])].Count;                 ^¦
       ¦¦         if WordLen = 0 then                                 -¦
       ¦¦           Inc(LetterTable[UpCase(S[i])].FirstLetter;        -¦
       ¦¦           Inc(WordLen);                                     -¦
       ¦¦       end;                                                  -¦
       ¦¦                                                             -¦
       ¦¦       { Обработать счетчик слов }                           -¦
       ¦¦       if WordLen > 0 then                                   -¦
       ¦¦       begin                                                 -¦
       ¦¦         Inc(NumWords);                                      -¦
       ¦¦         if WordLen <= MaxWordLen then                       -¦
       ¦¦           Inc(WordLenTable[WordLen]);                       -¦
       ¦¦       end;                                                  -¦
       ¦¦     end; { while }                                          -¦
       ¦¦  end; { ProcessLine }                                       -¦
       ¦¦                                                             -¦
       ¦¦  function GetLine : BufferStr;                              -¦
       ¦¦        Inc(LetterTable[UpCase(S[i])].Count);                v¦
       ¦L<----------------------------------------------------------->-¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦NumWords                2 ($2) : WORD                        ¦¦
       ¦L--------------------------------------------------------------¦
       ¦F1=HelpF2=BkptF3=CloseF4=HereF5=ZoomF6=NextF7=TraceF8=StepF9=R.¦
       L----------------------------------------------------------------
            Рис. 3.14 Переменная Паскаля в окне Watches
            Переменная NumWords появилась теперь в окне  Watches  (Прос-


       мотр)  в  нижней части экрана,  где указаны также ее тип (word) и
       значение.  По мере выполнения программы Турбо  отладчик  изменяет
       это значение и отражает текущее значение переменной.

       TDeb 3.0 #1-3                = 88 =
          Анализ простых объектов данных программы на языке Паскаль
       -----------------------------------------------------------------
            Когда вы останавливаете выполнение своей программы,  сущест-
       вует  много  способов  просмотра данных с помощью команды Inspect
       (Проверка). Это очень мощное средство позволяет вам анализировать
       структуры данных таким же образом,  как если бы вы визуально наб-
       людали их при разработке программы.
            Команды Inspect (в различных локальных меню и в  меню данных
       Data) позволяют вам наблюдать за любой заданной переменной. Пред-
       положим, вы хотите взглянуть на значение переменной NumLines. Пе-
       реместите  курсор  обратно на строку 121 таким образом,  чтобы он
       оказался под одной из букв имени nlines и нажмите клавиши Ctrl-I.
       При этом будет выведено окно Inspector (Проверка).
       ----------------------------------------------------------------¬
       ¦Ё File Edit View Run Breakpoints Data Options Window Help READY¦
       ¦--[*]-Module: TPDEMO  file: TPDEMO.PAS 121--------------------¬¦
       ¦¦    i  :  integer;                                           ¦¦
       ¦¦    WordLen : Word;                                          ¦¦
       ¦¦                                                             ¦¦
       ¦¦  begin { ProcessLine }                                      ¦¦
       ¦¦>   Inc(NumLines);                                           ¦¦
       ¦¦    i := гInspecting NumLines==3=[ ][ ]==¬                   ¦¦
       ¦¦    while¦@77D1:003E                     ¦                   ¦¦
       ¦¦    begin¦WORD---------------------1-($1)¦                   ¦¦
       ¦¦      { ПL===============================-                   ¦¦


       ¦¦      while (i <= Length(S)) and not IsLetter(S[i]) do       ¦¦
       ¦¦       Inc(i);                                               ¦¦
       ¦¦                                                             ¦¦
       ¦¦      { Найти конец слова, обработать счетчики букв и слов } ¦¦
       ¦¦      WordLen := 0;                                          ¦¦
       ¦¦      while (i <= Length(S)) and IsLetter(S[i]) do           ¦¦
       ¦¦      begin                                                  ¦¦
       ¦¦        Inc(NumLetters);                                     ¦¦
       ¦¦        Inc(LetterTable[UpCase(S[i])].Count);                ¦¦
       ¦L--------------------------------------------------------------¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦NumWords                2 ($2) : WORD                        ¦¦
       ¦L--------------------------------------------------------------¦
       ¦F1=HelpF2=BkptF3=CloseF4=HereF5=ZoomF6=NextF7=TraceF8=StepF9=R.¦
       L----------------------------------------------------------------
            Рис. 3.15 Окно Inspector
            В первой строке окна проверки вам сообщается имя переменной,
       вторая  строка  показывает  ее  показывает  ее адрес в памяти.  В
       третьей строке сообщается, какой тип данных хранится в переменной
       NumLines  (это  тип  Паскаля word),  и выводится текущее значение
       данной переменной.
            Теперь, проверив  значение этой переменной,  нажмите клавишу

       TDeb 3.0 #1-3                = 89 =
       Esc для того,  чтобы закрыть окно проверки Inspector.  Для  этого
       (как и во всех других окнах) можно также воспользоваться клавиша-
       ми ALt-F3 или закрыть его с помощью "мыши".
            Давайте рассмотрим, что вы в действительности здесь сделали.
       Нажав Ctrl,  вы выбрали сокращенный вариант команд локальных меню
       в окне Module. Нажатие I задало команду Inspect (Проверка).


            Для проверки  элемента  данных,  который  не  виден  в  окне
       Module, выберите   команду  локального  меню  Data¦Inspect  (Дан-
       ные¦Проверка). Выводится диалоговое окно,  где вы  можете  ввести
       имя переменной,   которую   требуется   проверить.  Наберите  имя
       LetterTable и нажмите клавишу Enter.  Появляется  окно  проверки,
       где  выводится  значение  LetterTable.  Для  просмотра (с помощью
       "прокрутки" окна) 26 элементов,  входящих в LetterTable,  исполь-
       зуйте клавиши стрелок.  В заголовке окна проверки выводится имя и
       тип проверяемых вами данных,  которые  в  точности  соответствуют
       описанию этих данных, содержащемуся в исходном файле. В следующем
       разделе рассказывается о том,  как можно проверять такие  сложные
       объекты данных.

       TDeb 3.0 #1-3                = 90 =
          Анализ сложных объектов данных программы на языке Паскаль
       -----------------------------------------------------------------
            Сложные (составные) объекты данных,  такие,  как массивы или
       структуры,  содержат несколько компонентов. Переместитесь на чет-
       вертый элемент массива LetterTalk  (элемент,  указанный  индексом
       ['D']).  Для вывода локального меню для окна Inspector (Проверка)
       нажмите клавиши Alt-F10 и и выберите команду  Inspect (Проверка).
       Появляется новое окно проверки, в котором показывается содержимое
       этого элемента массива.  В этом окне проверки показано содержимое
       записи LInfoRec.
       ----------------------------------------------------------------¬
       ¦Ё File Edit View Run Breakpoints Data Options Window Help READY¦
       ¦--[*]-Module: TPDEMO  file: TPDEMO.PAS 121----------1---------¬¦
       ¦¦    i  :  integer;                                           ¦¦
       ¦¦    WordLen : Word;      -Inspecting LetterTable--3---¬      ¦¦
       ¦¦                         ¦@77D1:005A                  ¦      ¦¦


       ¦¦  begin { ProcessLine }  ¦['A']                 (1,1) ¦      ¦¦
       ¦¦>   Inc(NumLines);       ¦['B']                 (1,0) ¦      ¦¦
       ¦¦    i := 1;              ¦['C']                 (1,0) ¦      ¦¦
       ¦¦    while i <= Length(S) ¦['D']                 (1,1) ¦      ¦¦
       ¦¦    begin                ¦гInspecting LetterTable['D']=4=¬   ¦¦
       ¦¦      { Пропустить не буꦦ$77D1:0066--------------------¦   ¦¦
       ¦¦      while (i <= Length(¦¦COUNT                  1 ($1) ¦   ¦¦
       ¦¦       Inc(i);           L¦FIRSTLETTER            1 ($1) ¦   ¦¦
       ¦¦                          ¦<---------------------------->¦   ¦¦
       ¦¦      { Найти конец слова,¦LINFOREC                      ¦ } ¦¦
       ¦¦      WordLen := 0;       L==============================-   ¦¦
       ¦¦      while (i <= Length(S)) and IsLetter(S[i]) do           ¦¦
       ¦¦      begin                                                  ¦¦
       ¦¦        Inc(NumLetters);                                     ¦¦
       ¦¦        Inc(LetterTable[UpCase(S[i])].Count);                ¦¦
       ¦L--------------------------------------------------------------¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦NumWords                2 ($2) : WORD                        ¦¦
       ¦L--------------------------------------------------------------¦
       ¦F1=HelpF2=BkptF3=CloseF4=HereF5=ZoomF6=NextF7=TraceF8=StepF9=R.¦
       L----------------------------------------------------------------
            Рис. 3.16 Просмотр записи
            Когда вы поместите курсор на одном из  имен  элементов,  тип
       данных  этого  элемента  появится в нижней области окна проверки.
       Если один из этих элементов представляет собой,  в свою  очередь,
       составной объект данных,  вы также можете дать команду проверки и
       еще более углубиться в структуру данных.
            Для удаления окна Inspector (Проверка)  и  возврата  в  окно


       Module (Модуль) нажмите  клавиши  Alt-F3.  (Клавиши  ALt-F3  дают
       удобный способ удаления нескольких проверок сразу. Если вы нажме-
       те Esc, то будет удалена только последняя проверка.)

       TDeb 3.0 #1-3                = 91 =
           Изменение значений данныx в программе на языке Паскаль
       -----------------------------------------------------------------
            Итак, вы теперь узнали,  как можно  просматривать  данные  в
       программе.  Давайте  теперь  попробуем изменить значение элемента
       данных.
            С помощью клавиш со стрелками перейдите на строку 103 исход-
       ного файла.  Поместите курсор на переменную NumLetters и для про-
       верки ее значения нажмите клавиши Ctrl-I.  После того,  как будет
       открыто  окно Inspector,  нажмите для вывода локального меню окна
       Inspector клавиши  Alt-F10.  Нажмите клавишу C для выбора команды
       Change (Изменить).  (Это можно сделать также непосредственно, на-
       жав клавиши Ctrl-C.) Появляется подсказка (диалоговое окно), зап-
       рашивающая новое значение.
       ----------------------------------------------------------------¬
       ¦Ё File Edit View Run Breakpoints Data Options Window HelpPROMPT¦
       ¦--[*]-Module: TPDEMO  file: TPDEMO.PAS 103--------------1-----¬¦
       ¦¦                                                             ¦¦
       ¦¦  procedure Init;                                            ¦¦
       ¦¦  begin                                                      ¦¦
       ¦¦    NumLines := 0; NumWords := 0; NumLetters := 0;           ¦¦
       ¦¦    FillChar(LetterTable, -=Inspecting NumLetters=3=[ ][ ]¬  ¦¦
       ¦¦    FillChar(WordLenTable,¦$77D1:0042                ¦    ¦  ¦¦
       ¦¦    WriteLn('Введите строк¦LONGINT-------------6-($6)¦    ¦  ¦¦
       ¦¦  end; { Init }           L===============================-  ¦¦
       ¦¦          г[*]=Enter new value for numletters : LONGINT====¬ ¦¦


       ¦¦  procedur¦ Numletters + 4                                 ¦ ¦¦
       ¦¦          ¦   OK      Cancel      Help                     ¦ ¦¦
       ¦¦  function¦   --      ------      ----                     ¦ ¦¦
       ¦¦  begin   L================================================- ¦¦
       ¦¦    IsLetter := UpCase(ch);                                  ¦¦
       ¦¦  end; { IsLetter }                                          ¦¦
       ¦¦                                                             ¦¦
       ¦¦  var                                                        ¦¦
       ¦¦    i : integer;                                             ¦¦
       ¦L--------------------------------------------------------------¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦NumWords                2 ($2) : WORD                        ¦¦
       ¦L--------------------------------------------------------------¦
       ¦ Enter item prompted for in dialog title                        ¦
       L----------------------------------------------------------------
            Рис. 3.17 Диалоговое окно команды Change
            В заголовке диалогового окна вам сообщается: Enter new value
       for unsigned long totalcharacters (введите новое значение для пе-
       ременной totalcharacters типа unsigned long),  а в нижней  строке
       экрана говорится:  Enter item prompted by a dialog title (введите
       элемент данных, указанный в заголовке диалогового окна).
            В данный момент вы можете ввести  любое  выражение  Паскаля,

       TDeb 3.0 #1-3                = 92 =
       при вычислении которого получается число. Наберите NumLetters+4 и
       нажмите клавишу Enter.  В окне проверки теперь будет показано но-
       вое значение 10.
            Для изменение  элемента  данных,  который не виден в текущем
       окне Module, выберите команду Data¦Evaluate/Modify (Данные¦Вычис-
       ление/Модификация) локального меню окна Module (Модуль).


При этом
       будет выведено диалоговое окно,  в котором вы можете  ввести  имя
       изменяемой  переменной.  Наберите  имя NumLines и нажмите клавишу
       Enter.  Нажмите дважды клавишу Tab,  затем наберите 123 и нажмите
       Enter.

       TDeb 3.0 #1-3                = 93 =
       ----------------------------------------------------------------¬
       ¦Ё File Edit View Run Breakpoints Data Options Window HelpPROMPT¦
       ¦--[*]-Module: TPDEMO  file: TPDEMO.PAS 103--------------1-----¬¦
       ¦¦                                                             ¦¦
       ¦¦  procedure Init;                                            ¦¦
       ¦¦  begin                                                      ¦¦
       ¦¦    NumLinea:г[*]==============Evaluate¦Modify=============¬ ¦¦
       ¦¦    FillChar(¦Expression                      ¦   Eval     ¦ ¦¦
       ¦¦    FillChar(¦ NumLines                       ¦   ------   ¦ ¦¦
       ¦¦    Writeln('¦--------------------------------¦   Cancel   ¦ ¦¦
       ¦¦  end; { Init¦Result                          ¦   ------   ¦ ¦¦
       ¦¦             ¦123 ($7B) : WORD                ¦   Help     ¦ ¦¦
       ¦¦  procedure P¦-------------------------------^¦   ------   ¦ ¦¦
       ¦¦             ¦New value                      -¦   Modify   ¦ ¦¦
       ¦¦  function Is¦ 123                           v¦   ------   ¦ ¦¦
       ¦¦  begin      L=============================================- ¦¦
       ¦¦    IsLetter := UpCase(ch);                                  ¦¦
       ¦¦  end; { IsLetter }                                          ¦¦
       ¦¦                                                             ¦¦
       ¦¦  var                                                        ¦¦
       ¦¦    i : integer;                                             ¦¦
       ¦L--------------------------------------------------------------¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦NumWords                2 ($2) : WORD                        ¦¦


       ¦L--------------------------------------------------------------¦
       ¦Enter new value                                                ¦
       L----------------------------------------------------------------
            Рис. 3.18 Диалоговое окно команды Evaluate/Mоdify
            Expression - выражение;  Result - результат; New value - но-
       вое значение; Enter new value - введите новое значение.
            Этим мы  завершаем  краткое  введение по использованию Турбо
       отладчика для работы с программой на языке Паскаль. Более подроб-
       но  об  этом  рассказывается  в описании примера сеанса отладки в
       Главе 14.

       TDeb 3.0 #1-3                = 94 =
                       Глава 4. Запуск Турбо отладчика
       -----------------------------------------------------------------
            В данной главе рассказывается,  как можно подготовить  прог-
       раммы для отладки.  Мы покажем вам, как можно запустить Турбо от-
       ладчик в ответ на командную строку DOS и настроить его  параметры
       таким образом,  чтобы они соответствовали отлаживаемой вами прог-
       рамме.  Мы объясним также,  как можно сохранить эти  параметры  в
       файле конфигурации. Вы узнаете также, как можно из Турбо отладчи-
       ка во время сеанса работы с  ним  запускать  командный  процессор
       DOS, и, наконец, как возвратиться в DOS, когда вы закончили рабо-
       ту.
                       Подготовка программ для отладки
       -----------------------------------------------------------------
            Когда вы выполняете компиляцию и компоновку с помощью одного
       из Турбо языков фирмы Borland,  вам следует указать  компилятору,
       что  нужно  генерировать  полную информацию для отладки.  Если вы
       скомпилируете объектные модули своей программы без информации для
       отладки, вам  придется  перекомпилировать  все эти модули,  чтобы
       можно было полностью использовать все средства отладки  на уровне


       исходного кода.  Можно также сгенерировать информацию для отладки
       только для отдельных модулей (это позволит сократить объем  прог-
       раммы), но потом будет крайне неприятно попасть в модуль, где ин-
       формация для отладки недоступна.  Поэтому мы рекомендуем переком-
       пилировать все модули, если, конечно, вам это позволяет имеющаяся
       память. В случае нехватки памяти или уверенности в правильной ра-
       боте  отдельных модулей можно перекомпилировать только конкретные
       модули.
                       Подготовка программ Borland C++
       -----------------------------------------------------------------
            Если вы   используете   интегрированную   среду  компилятора
       Borland C++ (BC.EXE), сделайте следующее:
            1. Выберите    диалоговое    окно     отладчика     (команда
               Options¦Compiler¦Advanced Code Generation (Параметры¦Ком-
               пилятор¦Генерация эффективного кода)) и установите перек-
               лючатель  Debug  Info  in  OBJs (Информация для отладки в
               объектных модулях).
            2. Выберите команду  Options¦Debugger (Параметры¦Отладчик) и
               установите параметр Standalone (Автономная отладка).
            3. Выберите команду  Options¦Save  (Параметры¦Сохранение)  и
               сохраните установленные параметры.
            Если вы используете автономный компилятор,  работающей с ко-
       мандной строкой (BCC), задайте параметр -v командной строки.
            Если вы используете автономный компоновщик TLINK, для добав-

       TDeb 3.0 #1-3                = 95 =
       ления информации для отладки в конец выполняемого файла .EXE нуж-
       но использовать параметр /v.
            Вы можете также при желании запретить оптимизацию.  В случае
       оптимизированного кода имеются отдельные случаи,  когда Турбо от-
       ладчик не сможет находить некоторые переменные.
                      Подготовка программ Турбо Паскаля


       -----------------------------------------------------------------
            Во-первых, вам  необходимо использовать версию Турбо Паскаля
       5.0 или более позднюю. В более ранних версиях отсутствует возмож-
       ность встраивать  информацию  для  отладки,  которой  затем может
       пользоваться отладчик, в файлы .EXE.
            Если вы используете интегрированную интерактивную среду Тур-
       бо Паскаля (TURBO.EXE), то вы должны перейти в меню Debug (Отлад-
       ка) и изменить параметр Standalole Debugging (Автономная отладка)
       в значение On  (Включено).  Переключатель  Options¦Compiler¦Debug
       Information  (Параметры¦Компилятор¦Информация  для отладки) нужно
       также перевести в значение On.  Если вы хотите иметь  возможность
       ссылаться на локальные идентификаторы (те идентификаторы, которые
       описываются внутри процедур или функций),  то нужно также устано-
       вить  параметр Options¦Compiler¦Local Symbols (Параметры¦Компиля-
       тор¦Локальные идентификаторы) в значение On,  или поместить в на-
       чале  своей программы директиву {$L+}.  Затем вы можете выполнить
       компиляцию программы.
            Если вы  используете  версию компилятора,  работающего с ко-
       мандной строкой (TPC.EXE),  то вы должны выполнять  компиляцию  с
       параметром /v.  По умолчанию при этом будет генерироваться инфор-
       мация для отладки и локальные идентификаторы.  Если вы не  хотите
       их  использовать,  то запретить это можно с помощью параметра ко-
       мандной строки /s.
                    Подготовка программ Турбо Ассемблера
       -----------------------------------------------------------------
            При использовании  Турбо Ассемблера для получения полной ин-
       формации для отладки задайте параметр командной строки /zi.
            При компоновке вашей программы с помощью компоновщика TLINK,
       используйте параметр /v для добавления в конец выполняемого файла


       .EXE информации для отладки.

       TDeb 3.0 #1-3                = 96 =
                           Запуск Турбо отладчика
       -----------------------------------------------------------------
            Чтобы запустить Турбо отладчик,  в ответ  на  подсказку  DOS
       введите  TD,  далее  -  необязательный набор аргументов командной
       строки, и нажмите клавишу Enter. Аргументы командной строки могут
       включать в себя имя отлаживаемой программы и параметры отладчика.
            Если вы просто введете TD и нажмете клавишу Enter, Турбо от-
       ладчик использует параметры, принятые по умолчанию.
            Таким образом, формат командной строки имеет следующий вид:
               TD [параметры] [имя_программы [аргументы_программы]]
            Элементы, заключенные в квадратные скобки, являются необяза-
       тельными.  Если вы их используйте, то набирать их нужно без квад-
       ратных скобок.  "Имя_программы" - это имя той программы,  которую
       требуется  отладить.  За этим именем вы можете указать аргументы.
       Приведем некоторые примеры командных строк:
       -----------------------------------------------------------------
       Команда             Действие
       -----------------------------------------------------------------
       td -sc prog1 a b    Запускает отладчик с параметром -sc и  загру-
                           жает программу prog1 с двумя аргументами  ко-
                           мандной строки a и b.
       td prog2 -x         Запускает отладчик с параметрами по умолчанию
                           и загружает программу  prog2 с одним аргумен-
                           том x.
       -----------------------------------------------------------------
            Если вы просто нажмете клавишу Enter,  Турбо отладчик загру-
       жается и использует параметры, назначенные по умолчанию.
            Заметим, что при запуске Турбо  отладчика  вам  должен  быть
       доступен как выполняемый файл .EXE с включенной в него отладочной


       информацией, так и исходные файлы программы.  Турбо отладчик ищет
       исходные файлы сначала в том каталоге,  где их находит компилятор
       при выполнении компиляции, затем в каталоге, заданном в параметре
       Options¦Path  (Параметры¦Маршрут)  команды  Source  (Исходный мо-
       дуль),  затем в текущем каталоге, и, наконец, в каталоге, где на-
       ходятся файлы .EXE.
            Перед использованием  Турбо  отладчика вы должны также иметь
       скомпилированный выполняемый файл с полной отладочной  информаци-
       ей.
            Чтобы использовать  Турбо  отладчик   с   продуктами   фирмы
       Borland, вы должны использовать  версию  Турбо  Паскаля  5.0  или
       старше, языки С++ семейства компиляторов Borland, версию Турбо Си
       2.0 или старше,  или версию Турбо Ассемблера 1.0 или  старше.

       TDeb 3.0 #1-3                = 97 =
            Если вы запускаете программу в ответ на подсказку DOS и  за-
       мечаете ошибку, то перед выполнением отладки нужно выйти из прог-
       раммы и перезагрузить ее с отладчиком.
                         Параметры командной строки
       -----------------------------------------------------------------
            Все параметры командной строки начинаются со знака минус (-)
       и отделяются друг от друга и от команды TD по крайней  мере одним
       пробелом.  Вы можете явным образом "выключить" параметр командной
       строки,  если укажете за параметром еще один минус. Например, па-
       раметр -vg- запрещает полное сохранение графики (графического вы-
       вода). Этим  можно  воспользоваться,  если  параметр сохранен для
       постоянного использования в  файле  конфигурации.  Модифицировать
       файл  конфигурации можно с помощью программы конфигурации TDINST,
       работа с которой описана в Приложении D.
            Далее описываются  все имеющиеся параметры командной строки.
       Их список приведен также в Приложении A,  которым удобно  пользо-


       ваться в качестве оперативного справочника.
                  Загрузка файла конфигурации (параметр -c)
       -----------------------------------------------------------------
            Данный параметр загружает указанный файл конфигурации. Между
       параметром -c и именем файла конфигурации не должно  быть  пробе-
       лов.
            Если параметр -c не указывается,  то загружается и использу-
       ется файл TDCONFIG.TD. Приведем пример:
               TD -cMYCONF.TD TCDEMO
            По этой команде будет загружен файл конфигурации MYCONF.TD и
       исходный код для TCDEMO.
           Параметры, управляющие выводом на экран (параметры -d)
       -----------------------------------------------------------------
            Все параметры -d влияют на то,  каким образом  будет  обнов-
       ляться вывод на дисплей.
                                Параметр -do
       -----------------------------------------------------------------
            Запускает отладчик  на вспомогательном дисплее (втором мони-
       торе).  При этом выводимая программой  информация  появляется  на
       основном дисплее.
                                Параметр -dp
       -----------------------------------------------------------------

       TDeb 3.0 #1-3                = 98 =
            Этот параметр используется по умолчанию для цветных  диспле-
       ев. Отладчик выводит информацию на одну страницу дисплея, а отла-
       живаемая программа - на другую. Это позволяет минимизировать вре-
       мя переключения  экранов  (которое  называют  также переключением
       страниц). Данный параметр можно использовать только  для  цветных
       дисплеев с несколькими страницами.  Его можно также использовать,
       если программа,  которую вы отлаживаете, сама работает с несколь-
       кими дисплейными страницами.
                                Параметр -ds
       -----------------------------------------------------------------
            Этот параметр  используется  по  умолчанию  для  монохромных


       дисплеев.  Он обеспечивает поддержку отдельного образа экрана для
       отладчика  и для отлаживаемой программы,  для чего при выполнении
       программы или возобновлении работы отладчика из памяти загружает-
       ся  весь  экран.  Такой метод вывода двух образов экрана наиболее
       расточителен по времени,  но он работает на любом  дисплее  и  им
       можно  пользоваться для отладки программ,  осуществляющих нестан-
       дартный вывод на дисплей.
        Параметры получения справочной информации (параметры -h и -?)
       -----------------------------------------------------------------
            Эти параметры позволяют вывести на экран справочную информа-
       цию,  описывающую синтаксис командной строки и параметры отладчи-
       ка.
         Параметр переключения идентификатора процесса (параметр -i)
       -----------------------------------------------------------------
            Данный параметр разрешает переключения  идентификатора  про-
       цесса.  Не  пользуйтесь этим параметром при отладке во внутренней
       среде DOS,  или когда активны системные вызовы DOS. Более подроб-
       ная  информация по этому средству содержится в Приложении В.  При
       отладке большинства программ об этом  параметре  беспокоиться  не
       следует.
                 Параметр записи макрокоманды (параметр -k)
       -----------------------------------------------------------------
            Данный параметр разрешает запись клавиатурных  макрокоманд в
       области записи  нажатий  клавиш  окна Execution History (Протокол
       выполнения).
            При указании данного параметра все клавиши, которые вы нажи-
       мали во время сеанса отладки, будут записываться в файл на диске.
       При этом вы сможете восстановить предыдущее состояние, перезагру-
       зив свою  программу с помощью Турбо отладчика и повторив записан-
       ные нажатия клавиш. Турбо отладчик записывает как те клавиши, ко-
       торые вы  нажали  при  работе  в среде Турбо отладчика,  так и те


       клавиши, которые вы нажимаете при работе с программой  (когда она
       выполняется).

       TDeb 3.0 #1-3                = 99 =
                  Параметр режима Ассемблера (параметр) -l
       -----------------------------------------------------------------
            Этот параметр  приводит к инициализации в режиме Ассемблера,
       показывая средство  просмотра инструкций и состояния центрального
       процессора (окно CPU).  Код инициализации компилятора не выполня-
       ется. Это  означает,  что  вы не сможете выполнять (проходить) по
       шагам код инициализации. Обычно этот код выполняется автоматичес-
       ки при загрузке программы.
            Если вы используете Турбо отладчик  с  программой  удаленной
       отладки Windows WREMOTE,  использование при запуске отладчика па-
       раметра -l означает,  что для любых запускаемых вашей  программой
       динамически компонуемых  библиотек  DLL  вы можете отлаживать код
       инициализации на Ассемблере.  Подробнее об этом рассказывается  в
       других частях руководства.
         Параметр задания размера динамической памяти (параметр -m)
       -----------------------------------------------------------------
            Устанавливает динамически распределяемую рабочую область па-
       мяти в n килобайт. Синтаксис параметра следующий:
               -mN
       где N - число килобайт.  Пробел между параметром  -m  и  числовым
       значение указываться не должен. Приведем пример:
               TD -m10 ВCDEMO.EXE
            По умолчанию используется размер 18К (нижняя граница  - 7К).
       Если вам требуется память, используйте данный параметр для умень-
       шения объема динамически распределяемой области памяти, использу-
       емой  отладчиком.  При  отладке  небольших программ этот параметр
       можно использовать для увеличения объема динамически распределяе-
       мой области памяти. Данный параметр позволяет отладчику сохранять
       временную рабочую информацию, например, список (протокол) исполь-


       зованных команд.
            Если вы задаете нулевой  размер  динамически  распределяемой
       области памяти  (с помощью параметра -m0),  то Турбо отладчик ис-
       пользует максимально доступный размер (обычно 18К).
                       Поддержка "мыши" (параметр -p)
       -----------------------------------------------------------------
            Этот параметр  разрешает поддержку манипулятора типа "мышь".
       Поскольку Турбо отладчик поддерживает "мышь" по умолчанию, вам не
       нужно использовать данный параметр, если вы не запретите по умол-
       чанию поддержку "мыши" с помощью программы установки TDINST. Если
       вы хотите  запретить  поддержку "мыши",  можно также использовать
       параметр -p-.

       TDeb 3.0 #1-3               = 100 =
                 Параметры удаленной отладки (параметры -r)
       -----------------------------------------------------------------
            Все параметры -r влияют на удаленные коммуникации отладчика.
                                 Параметр -r
       -----------------------------------------------------------------
            Данный параметр разрешает отладку на удаленной системе через
       последовательную связь.  Для этого  используется  назначенный  по
       умолчанию последовательный  порт  (COM1)  и скорость (38400 бод),
       если только они не были изменены с помощью программы TDINST.
                               Параметр -rpN
       -----------------------------------------------------------------
            Устанавливает значение коммуникационного порта в N.  N может
       принимать значения 1 или 2,  что  соответствует  порту  COM1  или
       COM2.
                               Параметр -rsN
       -----------------------------------------------------------------
            Задает скорость обмена для удаленной коммуникации.  N  может
       иметь значение 1 (скорость 9600 бод), 2 (38400 бод) или 3 (115000


       бод).
              Параметры обработки исходного кода (параметры -s)
       -----------------------------------------------------------------
            Параметры -s  влияют на метод обработки Турбо отладчиком ис-
       ходного кода и идентификаторов программы.
                                Параметр -sc
       -----------------------------------------------------------------
            Параметр -sc  приводит  к игнорированию регистра (строчные и
       прописные буквы) при вводе имен идентификаторов,  даже если  ваша
       программа скомпонована с разрешением различимости строчных и про-
       писных букв.
            Без параметра -sc Турбо отладчик будет  игнорировать регистр
       только в том случае,  если ваша программа скомпонована с парамет-
       ром игнорирования регистра.
                 Примечание: Данный параметр не оказывает никакого влия-
            ния при отладке программы на Турбо Паскале,  поскольку Турбо
            Паскаль всегда игнорирует регистр.
                                Параметр -sd
       -----------------------------------------------------------------

       TDeb 3.0 #1-3               = 101 =
            Этот параметр  задает  один  или более каталогов,  в которых
       нужно искать исходные файлы. Он имеет следующий синтаксис:
               -sdимя_каталогах[;имя_каталога...]
            Чтобы задать несколько каталогов,  разделите их  в  каталоге
       точкой с запятой,  либо используйте несколько параметров -sd. По-
       иск в каталогах выполняется в том порядке, в котором они указаны.
       "Имя_каталога"  может  представлять собой относительный или абсо-
       лютный маршрут и включать в себя буквенную метку диска.  Если ка-
       кой-либо из каталогов (или их список) задается в файле конфигура-
       ции,  то каталог, задаваемый в параметре -sd, добавляется к концу
       этого списка.
                                Параметр -smN
       -----------------------------------------------------------------


            Данный параметр  устанавливает  для  таблицы идентификаторов
       зарезервированный объем памяти. За ним указывается, сколько кило-
       байт вы хотите зарезервировать, например:
               -smN
       где N - число килобайт.  Используйте данный параметр, если вы хо-
       тите загрузить таблицу идентификаторов "вручную" с помощью коман-
       ды File¦Symbol  Load  (Файл¦Загрузка идентификаторов).  Вы можете
       поэкспериментировать, задавая разный объем памяти.
                  Параметры видеоаппаратуры (параметры -v)
       -----------------------------------------------------------------
            Все параметры -v влияют на то, как Турбо отладчик работает с
       видеоаппаратурой.
                                Параметр -vg
       -----------------------------------------------------------------
            Сохраняет полный графический  образ  экрана  программы.  При
       этом требуется дополнительно 8К памяти,  но это позволяет отлажи-
       вать программы с отдельными режимами графического вывода.  Попро-
       буйте использовать данный параметр,  если графический вывод вашей
       программы нарушается при работе с Турбо отладчиком.
                                Параметр -vn
       -----------------------------------------------------------------
            Запрещает использование дисплея в режиме 43/50 строк.  Зада-
       ние данного параметра позволяет сэкономить  некоторое  количество
       памяти. Используйте данный параметр, если вы работаете с дисплеем
       EGA или VGA и знаете,  что вам не потребуется при работе с отлад-
       чиком переходить в режим 43 или 50 строк.
                                Параметр -vp

       TDeb 3.0 #1-3               = 102 =
       -----------------------------------------------------------------
            Разрешает сохранения палитры графического адаптера EGA.
            Параметр удаленной отладки для Microsoft Windows (-w)
       -----------------------------------------------------------------


            Указывает, что работает программа удаленной отладки WREMOTE,
       используемая  для  удаленной  отладки  прикладных  программ   для
       Microsoft Windows.
       Параметры, определяющие размер оверлейного буфера (параметры -y)
       -----------------------------------------------------------------
            Эти параметры используются для задания  размера  оверлейного
       буфера (в оперативной или в расширенной памяти).
                                Параметр -yN
       -----------------------------------------------------------------
            Данный параметр задает размер оверлейного буфера в оператив-
       ной памяти.  При  этом  используется следующий синтаксис (где N -
       число килобайт, которые вы хотите зарезервировать):
               -yN
            Обычно Турбо отладчик использует для буферного пула 80К. На-
       именьший размер, который вы можете установить - это 20К, наиболь-
       ший - 200К.
            Для установки постоянного размера  буфера  оверлейного  кода
       используйте утилиту TDINST.
            Используйте параметр  -yN,  если у вас не хватает памяти для
       загрузки программы с Турбо отладчиком,  или если  вы  отлаживаете
       маленькую программу и хотите улучшить производительность отладчи-
       ка. При минимальном размере буфера  Турбо  отладчик  будет  часто
       загружать с  диска  программные  оверлеи  и увеличит время ответа
       (реакции). При большом размере буфера будет доступно меньше памя-
       ти для  отлаживаемой программы,  но Турбо отладчик будет работать
       быстрее.

       TDeb 3.0 #1-3               = 103 =
                                Параметр -yeN
       -----------------------------------------------------------------
            Данный параметр  задает размер буфера в памяти EMS.  Исполь-
       зуйте данный параметр,  если вам нужно освободить некоторый объем
       расширенной памяти для отлаживаемой программы. Он имеет следующий


       синтаксис:
            -yeN
       где N определяет число страниц (по 16К) EMS,  которые  вы  хотите
       зарезервировать.
            Например, параметр -ye4 устанавливает для оверлейного буфера
       размер 4 страницы. По умолчанию используется 16 страниц расширен-
       ной памяти.
            Параметр -ye0 запрещает использовать оверлейный буфер в рас-
       ширенной памяти.
                             Файлы конфигурации
       -----------------------------------------------------------------
            Турбо отладчик использует файл конфигурации для  отмены  ис-
       пользуемых по умолчанию параметров командной строки.  Для задания
       используемых по умолчанию параметров,  которые будут действовать,
       когда  файл  конфигурации  отсутствует,  или для построения файла
       конфигурации  можно  использовать  программу  TDINST.
            Турбо отладчик  ищет файл конфигурации TDCONFIG.TD сначала в
       текущем каталоге,  затем в каталоге  TURBO,  заданном  с  помощью
       программы установки TDINST,  а затем в каталоге,  содержащем файл
       TD.EXE. Если вы работаете в DOS версии 2.0,  то отладчик не будет
       искать файл конфигурации в каталоге, где находится TD.EXE.
                 Примечание: Глава  17 описывает использование программы
            TDINST для  создания  файла конфигурации Турбо отладчика для
            Windows (TDW).
            Если Турбо  отладчик  находит файл конфигурации,  заданные в
       этом файле значения отменяют значения, используемые по умолчанию.
       Все задаваемые вами в командной строке при запуске Турбо отладчи-
       ка параметры будут отменять параметры,  значения которых установ-
       лены по умолчанию.
                 Приложение: В  Приложении D описывается,  как использо-
            вать программу установки для создания файлов конфигурации.

       TDeb 3.0 #1-3               = 104 =
                                Меню Options
       -----------------------------------------------------------------


            Меню Options (Параметры) позволяет вам задавать или настраи-
       вать параметры,  которые управляют работой Турбо отладчика и тем,
       как выглядит выводимая им информация на экране.  В следующих раз-
       делах описывается каждая команда и дается информация о  том,  где
       вы можете  найти более подробное описание в других частях данного
       руководства.
                                              ------------------------¬
            Язык                              ¦ Language...    Source ¦
            Макрокоманды                      ¦ Macros              > ¦
            Параметры дисплея                 ¦ Display options...    ¦
            Маршрут доступа к исходному файлу ¦ Path for source...    ¦
            Параметры сохранения              ¦ Save options...       ¦
            Параметры восстановления          ¦ Restore options...    ¦
                                              L------------------------
                              Команда Language
       -----------------------------------------------------------------
            О том,  как задать текущий язык, используемый при вычислении
       выражений, и как он влияет на способ ввода выражений  рассказыва-
       ется в Главе 9.
                                 Меню Macros
       -----------------------------------------------------------------
                                 -----------------------¬
            Создать              ¦ Create          Alt= ¦
            Остановить запись    ¦ Stop recording  Alt- ¦
            Удалить              ¦ Remove               ¦
            Удалить все          ¦ Delete all           ¦
                                 L-----------------------
            По команде Macros (Макрокоманды) выводится другое меню,  ко-
       торое позволяет вам определить  новые  макрокоманды,  выполняемые
       при нажатии клавиш, или отменить те из них, которые уже присвоены
       клавише. Она содержит следующие подкоманды.


                               Команда Create
       -----------------------------------------------------------------
            По команде  Create (Создание) начинается запись нажатий кла-
       виш, которые должны быть  присвоены  клавише  (например,  Alt-M).
       Сначала вам выводится подсказка, где запрашивается, какой клавише
       вы хотите присвоить значения (нажатия клавиш).  Чтобы начать  за-
       пись, выберите  команду Options¦Macros¦Create (Параметры¦Макроко-
       манды¦Создание). После вывода указанной выше подсказки  и  ответа
       на нее вы можете нажимать клавиши,  которые хотите записать.  При

       TDeb 3.0 #1-3               = 105 =
       записи макрокоманды в правом верхнем углу экрана выводится  сооб-
       щение RECORDING (запись).
            Для начала записи макрокоманды используются оперативные кла-
       виши Alt-=.
                           Команда Stop Recording
       -----------------------------------------------------------------
            Эта команда прекращает запись нажатий клавиш (запись  макро-
       команды), которые будут присвоены клавише. Используйте данную ко-
       манду после команды Options¦Macros¦Create (Параметры¦Макрокоманды
       ¦Создание) для присваивания клавише значений нажатий клавиш (мак-
       рокоманды). Завершить  макрокоманду  можно  с помощью сокращенной
       команды (клавиши Alt-минус).
            Не используйте для завершения  записи  макрокоманды  команду
       меню Options¦Macro¦Stop Recording,  так как эти клавиши будут до-
       бавлены в вашу макрокоманду (данный элемент меню  добавлен только
       для того, чтобы напомнить вам о клавишах Alt-минус).
                               Команда Remove
       -----------------------------------------------------------------
            Команда Remove  (Удалить) удаляет макрокоманду,  присвоенную
       клавише. Вам будет выведена подсказка с указанием нажать клавишу,
       макрокоманду которой вы хотите удалить.


                             Команда Delete All
       -----------------------------------------------------------------
            Команда Delete All (Удалить  все)  удаляет  все  определения
       макрокоманд  для клавиш и присваивает им первоначальные значения.

       TDeb 3.0 #1-3               = 106 =
                           Команда Display Options
       -----------------------------------------------------------------
            Команда Display  Options  (Вывести  параметры) позволяет вам
       открыть диалоговое окно, в котором вы можете задать некоторые па-
       раметры, управляющие режимом вывода Турбо отладчика. Эти парамет-
       ры перечислены далее.
       ----------------------------------------------------------------¬
       ¦Ё File Edit View Run Breakpoints Data Options Window HelpPROMPT¦
       ¦г=[*]=Module: TPDEMO  file: TPDEMO.PAS 217============1=[ ][ ]¬¦
       ¦¦      end;                                                   ^¦
       ¦¦    Writeln;    г[*]==============Display options==========¬ -¦
       ¦¦  end; { ParmsOn¦ Display swapping       Integer format    ¦ -¦
       ¦¦                ¦                         ( )  Hex         ¦ -¦
       ¦¦> begin { progra¦  (.) Smart              ( ) Decimal      ¦ -¦
       ¦¦    Init;       ¦  ( ) Always             (.) Both         ¦ -¦
       ¦¦    Buffer := Ge¦                                          ¦ -¦
       ¦¦    whil[e Buffe¦ Screen lines           Tab size          ¦ -¦
       ¦¦    begin       ¦  (.) 25   ( ) 43/50     8                ¦ -¦
       ¦¦     ProcessLine¦     OK         Cancel       Help         ¦ -¦
       ¦¦     Buffer := G¦     --         ------       ----         ¦ -¦
       ¦¦    end;        L==========================================- -¦
       ¦¦    ShowResults;                                             -¦
       ¦¦    ParmsOnHeap;                                             -¦
       ¦¦  end.                                                       -¦


       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             v¦
       ¦L<----------------------------------------------------------->-¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦                                                             ¦¦
       ¦L--------------------------------------------------------------¦
       ¦Accept current settings and proceed                            ¦
       L----------------------------------------------------------------
            Рис. 4.1 Диалоговое окно Display Options
            Display swapping - переключение  экрана;  Integer  format  -
       формат целых чисел; Screen lines - строки экрана; Tab Size - раз-
       мер табуляции;  Accept current settings and proceed -  воспринять
       текущие установки и обработать.
                        Переключатель Diplay Swapping
       -----------------------------------------------------------------
            Селективный переключатель  Display  Swapping   (Переключение
       дисплея)  позволяет  вам выбрать один из трех способов управления
       переключением между экраном Турбо отладчика и экраном вашей прог-
       раммы, а именно:
        None      (отсутствует)   Нет переключения между  экранами.  Ис-
                                  пользуйте данный параметр, если вы от-

       TDeb 3.0 #1-3               = 107 =
                                  лаживаете программу,  которая не выво-
                                  дит никакой информации на экран.
        Smart     (эффективное)   Переключение на экран пользователя вы-
                                  полняется только  тогда,  когда  может
                                  произойти вывод на экран. Турбо отлад-
                                  чик будет выполнять переключение экра-
                                  нов  всякий  раз  когда  вы  проходите


                                  программу  или  выполняете  инструкцию
                                  исходного кода,  в которых осуществля-
                                  ется чтение или запись  в видеопамять.
                                  Этот  параметр используется по умолча-
                                  нию.
        Always    (постоянное)    Переключение в экран пользователя про-
                                  исходит при каждом выполнении програм-
                                  мы пользователя.  Используйте этот па-
                                  раметр,   если   параметр   Smart   не
                                  позволяет перехватить все случаи выво-
                                  да  информации на экран вашей програм-
                                  мой.  Если вы выберете этот  параметр,
                                  экран  будет "мерцать" при каждом шаге
                                   выполнения вашей программы, так как на
                                  короткое  время  экран Турбо отладчика
                                  будет заменяться на экран вашей  прог-
                                  раммы.

       TDeb 3.0 #1-3               = 108 =
                        Переключатель Integer Format
       -----------------------------------------------------------------
            Селективный переключатель  Integer  Format (Формат целых чи-
       сел) позволяет вам определить один из трех  форматов, управляющих
       выводом целых чисел:
               Decimal (Десятичный)         Целые числа  выводятся,  как
                                            обычные десятичные значения.
               Hex     (Шестнадцатиричный)  Целые числа   выводятся    в
                                            шестнадцатиричном   виде   в
                                            формате,  принятом  в  соот-
                                            ветствующем языке.
               Both    (Оба)                Целые числа  выводятся и как


                                            десятичные, и как шестнадца-
                                            тиричные  значения  (которые
                                            указываются в  скобках после
                                            шестнадцатиричных значений).
                         Переключатель Screen Lines
       -----------------------------------------------------------------
            Селективный переключатель Screen Lines (Размер экрана) можно
       использовать для того,  чтобы определить, использует ли Турбо от-
       ладчик обычный 25-строчный режим экрана или 40-  или  50-строчный
       режим, доступный при использовании адаптеров EGA и VGA.
                              Параметр Tab Size
       -----------------------------------------------------------------
            Параметр Tab  Size  (Размер  табуляции) позволяет определить
       позиции при каждой табуляции.  Вы можете уменьшить число  позиций
       табуляции, чтобы можно было видеть больше исходного текста в фай-
       лах,  выравнивание кода выполнено с помощью табуляции. Размер по-
       зиции табуляции можно установить в значения от 1 до 32.
                           Команда Path for Source
       -----------------------------------------------------------------
            Команда Path for Source (Маршрут доступа к  исходному файлу)
       задает  каталоги,  в которых Турбо отладчик будет искать исходные
       файлы.  Более подробно эта команда описывается  в  Главе  8,  где
       рассказывается об окне Module (Модуль).

       TDeb 3.0 #1-3               = 109 =
                            Команда Save Options
       -----------------------------------------------------------------
            Команда Save Options (Сохранить параметры) открывает  диало-
       говое окно,  с помощью которого вы можете сохранить текущие пара-
       метры на диске в файле конфигурации. В этом файле сохраняются:
            - ваши макрокоманды;


            - текущая схема окон и форматы областей окон;
            - все значения параметров, заданные в меню Options (Парамет-
              ры).
       ----------------------------------------------------------------¬
       ¦ Ё File Edit View Run Breakpoints Data Options Window HelpPROMPT¦
       ¦г=[*]=Module: TPDEMO  file: TPDEMO.PAS 217===========1=[ ][ ]=¬¦
       ¦¦     end;                                                    ^¦
       ¦¦   Writeln;                                                  -¦
       ¦¦ end; { ParmsOnHeap }         г[*]===Save configuration=====¬-¦
       ¦¦                              ¦ [X] Options           OK    ¦-¦
       ¦¦ begin { program }            ¦ [ ] Layout            Cancel¦-¦
       ¦¦   Init;                      ¦ [ ] Macros            ----- ¦-¦
       ¦¦   Buffer := GetLine;         ¦                             ¦-¦
       ¦¦   whil[e Buffer <> '' do     ¦ Save to               Help  ¦-¦
       ¦¦   begin                      ¦  tdconfig.tdw         ----- ¦-¦
       ¦¦    ProcessLine(Buffer);      L=============================--¦
       ¦¦    Buffer := GetLine;                                       -¦
       ¦¦   end;                                                      -¦
       ¦¦   ShowResults;                                              -¦
       ¦¦   ParmsOnHeap;                                              -¦
       ¦¦ end.                                                        -¦
       ¦¦                                                             -¦
       ¦¦                                                             -¦
       ¦¦                                                             v¦
       ¦L<----------------------------------------------------------->-¦
       ¦-Watches-----------------------------------------------------2¬¦
       ¦¦                                                             ¦¦
       ¦L--------------------------------------------------------------¦


       ¦Save all configuration information                             ¦
       L----------------------------------------------------------------
            Рис. 4.2 Диалоговое окно Save Options
            Save configuration - сохранение конфигурации;  Options - па-
       раметры; Layout  - схема окон;  Macros - макрокоманды;  Save to -
       сохранить в...;  Save all configuration information  -  сохраняет
       всю информацию о конфигурации;  OK - выбрать;  Cancel - отменить;
       Help - справка.
            Турбо отладчик позволяет вам сохранить все или выбранные па-
       раметры, в зависимости от ваших установок:

       TDeb 3.0 #1-3               = 110 =
            Options - сохраняются все  значения,  установленные  в  меню
                      Options.
            Layout  - сохраняется только схема окон.
            Macros  - сохраняются только текущие (определенные) макроко-
                      манды.
                           Команда Restore Options
       -----------------------------------------------------------------
            Команда Restore  Options  (Восстановить параметры) позволяет
       восстановить параметры из файла на диске.  Вы можете создать нес-
       колько файлов конфигурации, записав в них различные макрокоманды,
       схемы окон и т.д. Требуется задавать файл параметров, созданный с
       помощью команды  Save  Options  (Сохранить параметры) или утилиты
       TDINST.
                      Выполнение в Турбо отладчике DOS
       -----------------------------------------------------------------
            При отладке программы иногда возникает необходимость исполь-
       зовать другую программу или утилиту.  Это можно сделать с помощью
       команды File¦DOS Shell (Файл¦Среда операционной системы).
            Когда вы запускаете командный  процессор  DOS,  отлаживаемая
       вами программа при необходимости перекачивается на диск. Это поз-
       воляет вам выполнить команды DOS,  даже если вы отлаживаете прог-


       рамму,  занимающую всю доступную память.  Конечно, при этом пере-
       качка вашей программы на диск или обратно в память может привести
       к задержке в несколько секунд.
                 Предупреждение: При временном выходе в DOS не загружай-
            те над Турбо отладчиком резидентных программ.
            Когда вы закончите вводить команды DOS, для возврата в сеанс
       отладки введите команду EXIT и нажмите клавишу Enter.
                  Возврат в операционную систему DOS
       -----------------------------------------------------------------
            В любой  момент (за исключением того момента,  когда активно
       диалоговое окно) с помощью нажатия клавиш Alt-X вы можете  завер-
       шить  сеанс отладки и вернуться в DOS.  Для этого можно также ис-
       пользовать команду File¦Quit (Файл¦Выход).  Если открыто диалого-
       вое окно, вы сначала должны закрыть его, нажав клавишу Esc.
            При выходе из Турбо отладчика вся ранее выделенная для отла-
       живаемой программы память освобождается.  Если программа, которую
       вы отлаживаете,  выделяла память с помощью процедур DOS выделения
       блока памяти, эта память также освобождается.

       TDeb 3.0 #1-3               = 111 =
                  Глава 5. Управление выполнением программы
       -----------------------------------------------------------------
            При отладке программы вы обычно выполняете части программы и
       проверяете, что в точках останова она ведет себя правильно. Турбо
       отладчик  предоставляет вам много способов управления выполнением
       программы. Вы можете:
            - выполнять  одну машинную инструкцию или одну строку исход-
              ного кода;
            - "пропускать" вызовы процедур или функций;
            - выполнять непрерывную ("автоматическую") трассировку;
            - выполнять программу, пока текущая процедура или функция не
              возвратит управление в вызывающую программу;


            - выполнять программу до определенного адреса;
            - выполнять программу до точки останова.
            - выполнять  программу  в  обратном направлении (отмена инс-
              трукций).
            Сеанс отладки состоит из чередующихся периодов работы отлад-
       чика и вашей программы. Когда работает отладчик, вы можете запус-
       тить вашу программу, выбрав одну из команд меню Run (Выполнение),
       или  нажав  эквивалентную ей оперативную клавишу.  При выполнении
       программы отладчик запускается,  когда  будет  выполнен  заданный
       участок вашей программы, когда вы прерываете выполнение с помощью
       специальной  последовательности клавиш,  или она приостанавливает
       выполнение, когда Турбо отладчик встретит точку останова.
            В данной главе мы покажем вам, как можно проверить состояние
       программы, когда  управление  получает Турбо отладчик.  Мы обучим
       вас различным способам выполнения частей вашей программы, а также
       покажем вам,  как можно прервать ее выполнение. Наконец, мы пере-
       числим способы, с помощью которых можно восстановить сеанс отлад-
       ки (той же или другой программы).
                      Анализ текущего состояния программы
       -----------------------------------------------------------------
            "Состояние" вашей программы включает в себя  следующие  эле-
       менты:
            - аргументы командной строки DOS для этой программы;
            - стек активных функций или процедур;
            - текущее положение в исходном или машинном коде;

       TDeb 3.0 #1-3               = 112 =
            - значения регистров;
            - содержимое памяти;
            - причину,  по которой отладчик остановил  выполнение  вашей
              программы;
            - значение переменных вашей программы.
            О том, как проверить и изменить значения переменных и данных
       вашей  программы подробнее рассказывается в Главе 6.  В следующих


       разделах описываются  окно  Variables  (Переменные),  окно  Stack
       (Стек), локальные меню областей глобальных и статических перемен-
       ных, команда Origin (Начало) и команда Get Info (Получение инфор-
       мации).

       TDeb 3.0 #1-3               = 113 =
                               Окно Variables
       -----------------------------------------------------------------
            В этом окне показаны все переменные, которые доступны из те-
       кущего места программы. Его можно использовать, чтобы найти пере-
       менные,  написание  имен  которых вы не помните.  Для дальнейшего
       анализа или изменения их значений можно использовать команды  ло-
       кальных меню.  Это окно можно также использовать для проверки пе-
       ременных, локальных по отношению к любой вызванной функции.
              г[*]=Variables=========================3=[ ][ ]=¬
              ¦ TPDEMO.SHORESULTS              @7129:01fA     ¦
              ¦ TPDEMO.INIT                    @7129:0402     ¦
              ¦ TPDEMO.PROCESSLINE             @7129:04B5     ¦
              ¦ TPDEMO.GETLINE                 @7129:05A5     ¦
              ¦ TPDEMO.PARMSONHEAP             @7129:0651     ¦
              ¦ TPDEMO.NUMLINES                1 ($1)         ¦
              ¦ TPDEMO.NUMWORDS                0 ($0)         ¦
              ¦<--------------------------------------------->¦
              ¦ CH                             'A'            ¦
              ¦ ISLETTER                       True           ¦
              ¦ S                              'ABC DEF'      ¦
              ¦ I                              1 ($1)         ¦
              ¦ WORDLEN                        28969          ¦
              L==============================================--
            Рис. 5.1 Окно Variables
            При отладке программы на Турбо Паскале переменные  не  будут
       упорядочиваться по алфавиту.
            Окно Variables (Переменные) можно открыть, выбрав в основном


       меню команду View/Variables  (Обзор/Переменные).  Окно  Variables
       содержит две области:
            - Область  глобальных  переменных, которая находится вверху,
              показывает все глобальные идентификаторы  вашей программы.
            - Область статических/локальных переменных (внизу) показыва-
              ет  все  статические  переменные (идентификаторы) текущего
              модуля,  которым является модуль, соответствующий текущему
              адресу программы (CS:IP),  и все идентификаторы, локальные
              по отношению к текущей функции.
            В обеих областях выводится имя переменной (слева) и ее  зна-
       чение (справа). Если Турбо отладчик не может найти никакой инфор-
       мации о типе данных идентификаторов,то он выводит четыре вопроси-
       тельных знака (????).
            Как и во всех других локальных меню,  нажатие клавиш Alt-F10
       приводит к выводу локального меню области глобальных данных. Если
       разрешено использование сокращений с клавишей Ctrl, то для досту-
       па к команде можно нажать клавишу Ctrl с первой  буквой описанной

       TDeb 3.0 #1-3               = 114 =
       команды.
            Если ваша программа содержит функции,  которые выполняют ре-
       курсивные вызовы, или вы хотите просмотреть переменные, локальные
       по отношению к вызванной функции, то вы можете проверить значение
       конкретных локальных данных функции.  Сначала с  помощью  команды
       View/Stack  (Обзор/Стек) создайте окно Stack (Стек),  затем пере-
       местите подсветку на вызов нужной функции.  Затем нажмите клавиши
       Alt-F10 для выбора команды Locals (Локальные). При этом в области
       статических данных окна Variables (Переменные) выведутся значения
       для данного конкретного вхождения функции.
                Локальное меню области глобальных переменных
       -----------------------------------------------------------------
            В этом  локальном  меню   имеется   три   команды:   Inspect


       (Проверка), Change (Изменение) и Watch (Просмотр).
                          --------------¬
                          ¦ Ispect      ¦      Проверка
                          ¦ Change      ¦      Изменение
                          ¦ Watch       ¦      Просмотр
                          L--------------
                               Команда Inspect
       -----------------------------------------------------------------
            Данная команда открывает окно Inspector (Проверка),  в кото-
       ром показано значение выбранной глобальной переменной.
            Если переменная, которую необходимо проверить, является име-
       нем функции,  в окне будет показан ее исходный текст,  либо (если
       исходный текст  недоступен) в окне процессора (CPU) будет показан
       дисассемблированный код.
                 Примечание: Работа с  окном  Inspector  более  подробно
            описана в Главе 6.
            Если имеется  локальная переменная,  имя которой совпадает с
       проверяемой глобальной переменной,  будет показано значение  гло-
       бальной переменной, а не локальной. Такое поведение немного отли-
       чается от обычного поведения окна Inspector, которое обычно пока-
       зывает значение переменной,  связанное с текущей точкой программы
       (CS:IP). Благодаря этому, пользователь может просматривать значе-
       ния  глобальных переменных,  имена которых используются и для ло-
       кальных переменных.
                               Команда Change
       -----------------------------------------------------------------
            Данная команда заменяет значение выбранной (выделенной) гло-

       TDeb 3.0 #1-3               = 115 =
       бальной переменной значением,  которое вводит пользователь в окне
       диалога Change. Турбо отладчик выполняет любое необходимое преоб-
       разование типов данных точно так же,  как если бы  для  изменения
       значения использовался оператор присваивания исходного языка.


                 Примечание: Более подробная информация о присваивании и
            преобразовании типов данных приведена в Главе 9.
            Кроме этого,  можно изменить значение выбранной  переменной,
       просто  открыв окно Inspector и начав вводить новое значение. При
       этом появляется такой же блок диалога,  как если бы сначала  была
       выбрана команда Change (Изменение).
                                Команда Watch
       -----------------------------------------------------------------
            Эта команда открывает окно Watches (Просмотр) и  помещает  в
       него текущее выбранное (выделенное) имя глобального идентификато-
       ра.  Данная команда просто помещает в окно Watches строку  симво-
       лов.
                 Примечание: Информацию об окне Watches см. в Главе 6.
            Окно Watches не отслеживает, является ли переменная глобаль-
       ной  или локальной.  Если в окно вы поместили командой Watch гло-
       бальную переменную, а затем вам встретится локальная переменная с
       тем же именем, то пока вы будете находиться в блоке локальной пе-
       ременной,  последняя будет иметь преимущество.  Другими  словами,
       окно Watches всегда показывает значение переменной с точки зрения
       текущего исполнительного адреса программы (CS:IP).
           Локальное меню области статических/локальных переменных
       -----------------------------------------------------------------
            Для вывода локального меню области статических/локальных пе-
       ременных  нажмите  клавиши Alt-F10.  Если разрешено использование
       сокращений с клавишей Ctrl, то для доступа к команде можно нажать
       клавишу Ctrl с подсвеченной буквой нужной команды.
            Область статических/локальных переменных содержит четыре ко-
       манды локального меню:  Inspect (Проверка),  Change  (Изменение),
       Watch (Просмотр) и Show (Вывод).
                          --------------¬
                          ¦ Ispect      ¦      Проверка


                          ¦ Change      ¦      Изменение
                          ¦ Watch       ¦      Просмотр
                          ¦ Show        ¦      Вывод
                          L--------------
                               Команда Inspect

       TDeb 3.0 #1-3               = 116 =
       -----------------------------------------------------------------
            Команда Inspect (Проверка)  открывает  окно  проверки  (окно
       Inspector), в котором выводится содержимое подсвеченного в данный
       момент локального идентификатора.
                 Примечание: Более  подробно  о  поведении окна проверки
            рассказывается в Главе 6.
                               Команда Change
       -----------------------------------------------------------------
            Команда Change (Изменение) изменяет  значение  выбранного  в
       данный  момент  (подсвеченного)  локального  идентификатора на то
       значение, которое вы введете в ответ на подсказку. Турбо отладчик
       выполняет все необходимые преобразования типов данных так  же как
       это делается в операторе присваивания в используемом языке.
                 Примечание: Более  подробно о присваивании и преобразо-
            вании типов данных рассказывается в Главе 9.
            Вы можете также изменить значение  текущего  (подсвеченного)
       идентификатора, просто  начав  вводить  новое значение.  Когда вы
       сделаете это,  появляется такая же подсказка,  как и после  ввода
       команды Change.
                                Команда Watch
       -----------------------------------------------------------------
            Открывает окно  Watches  и помещает в него текущее выбранное
       (выделенное) имя статического или локального идентификатора.
                 Примечание: Более  подробно работа с окном Watches опи-
            сана в Главе 6.

       TDeb 3.0 #1-3               = 117 =
                                Команда Show


       -----------------------------------------------------------------
            При выборе  команды  Show  (Вывод)  появляется  окно диалога
       Local Display, позволяющее изменить область определения показыва-
       емых переменных (статические,  локальные динамические или и те, и
       другие) и модуль, из которого эти переменные выбираются.
            В диалоговом окне вам предлагается сделать выбор  при помощи
       следующих селективных переключателей:
            Static   Показывать только статические переменные.
            Auto     Показывать  только  локальные  переменные   данного
                     блока.
            Both     Показывать оба типа переменных (по умолчанию).
            Module   Изменить текущий модуль.  Выводит окно  диалога  со
                     списком модулей  программы,  в  котором  вы  можете
                     вызвать новый модуль.
                    г[*]======Local Display=======3=[ ][ ]¬
                    ¦                                     ¦
                    ¦ ( ) Static                 OK       ¦
                    ¦ ( ) Auto                   Cancel   ¦
                    ¦ (*) Both                   Help     ¦
                    ¦ ( ) Module                 ------   ¦
                    ¦                                     ¦
                    L=====================================-
            Рис. 5.2 Диалоговое окно Local Display
                                 Окно Stack
       -----------------------------------------------------------------
            Окно Stack  (Стек)  вы  можете  создать  с  помощью  команды
       View¦Stack (Обзор¦Стек).  В окне стека выводится список всех  ак-
       тивных процедур и функций.  Первой в списке указывается последняя
       вызванная процедуры,  за которой следует вызвавшая ее процедура и
       предыдущая процедура, и так до самой первой процедуры или функции
       программы (основная (main) программа в Паскале,  в Си эта функция


       обычно называется main()).  Для любой процедуры или функции можно
       видеть значение каждого параметра, с которым она вызывалась.
                    г[*]==Stack==============3====[ ][ ]=¬
                    ¦TPDEMO.PROCESSLINE.ISLETTER('A')    ¦
                    ¦TPDEMO.PROCESSLINE('ABCDEF')--------¦
                    ¦                                    ¦
                    ¦                                    ¦
                    L<---------------------------------->-
            Рис. 5.3 Окно Stack

       TDeb 3.0 #1-3               = 118 =
            Для программ,  реализующих  методы объектно-ориентированного
       программирования, окно Stack показывает  имена  методов  объектов
       или функции-элементов классов,  перед  которыми  указывается  имя
       объекта или тип класса, определяющие метод или функцию:
               SHAPES.ACIRCLE(174, 360, 75.0)   { Турбо Паскаль }
            Для вывода  локального  меню  окна  стека  нажмите   клавиши
       Alt-F10  или  клавишу  Ctrl с первой буквой желаемой команды (что
       позволит получить непосредственный доступ к команде).
                          Локальное меню окна Stack
       -----------------------------------------------------------------
            Локальное меню  окна  Stack  содержит  две команды:  Inspect
       (Проверка) и Locals (Локальные переменные).
                   --------------¬
                   ¦ Inspect     ¦     Проверка
                   ¦ Locals      ¦     Локальные переменные
                   L--------------

       TDeb 3.0 #1-3               = 119 =
                               Команда Inspect
       -----------------------------------------------------------------
            Команда Inspect (Проверка) открывает окно  Module  (Модуль),
       позиционированное на активную строку в текущей подсвеченной функ-
       ции.  Если подсвеченная функция находится в вершине  списка  (это
       последняя вызванная функция), то в окне Module показывается теку-


       щий адрес программы (CS:IP). Если подсвечена одна из функций, ко-
       торые  вызывали последнюю функцию,  то окно позиционируется на ту
       строку в функции, которая будет выполняться после того, как вызы-
       ваемая функция возвратит управление.
            Вы можете также вызвать эту команду, позиционировав подсвет-
       ку на функции и нажав клавишу Enter.
                               Команда Locals
       -----------------------------------------------------------------
            Команда Locals   (Локальные   переменные)   открывает   окно
       Variables (Переменные),  в котором выводятся идентификаторы,  ло-
       кальные  по отношению к текущему модулю,  а также идентификаторы,
       локальные по отношению к подсвеченной в  данный  момент  функции.
       Если функция вызывает рекурсивно сама себя,  то в окне стека име-
       ется несколько вхождений данной функции. С помощью позиционирова-
       ния подсветки на функции, данная команда позволяет вам просматри-
       вать локальные переменные для данного вхождения функции.
                       Команда локального меню Origin
       -----------------------------------------------------------------
            Окно Module  и область Code (Код) окна CPU (Центральный про-
       цессор) содержат в составе локального меню команду Origin  (Нача-
       ло). Команда Origin позиционирует курсор по текущему адресу прог-
       раммы (CS:IP).  Это может  оказаться  очень  полезным,  когда  вы
       просмотрели вашу программу и хотите вернуться обратно к тому мес-
       ту, где она остановилась.
                Анализ состояния выполнения: команда Get Info
       -----------------------------------------------------------------
            Вы можете выбрать команду File¦Get Info (Файл¦Получение  ин-
       формации)  для  анализа  использования памяти и определения того,
       почему получил управление отладчик. Эта и другая информация отоб-
       ражается в текстовом блоке,  который удаляется с экрана при нажа-


       тии клавиши Enter, пробела или Esc. В этом окне отображается сле-
       дующая информация,  в зависимости от того,  отлаживаетесь ли вы в
       DOS, или в Windows.

       TDeb 3.0 #1-3               = 120 =
                                Формат DOS
       -----------------------------------------------------------------
            Если вы отлаживаете программу для DOS,  то  в  блоке  System
       Information будет выведена следующая информация:
          - имя отлаживаемой вами программы;
          - описание причины остановки программы;
          - объемы памяти,  используемой DOS,  Турбо отладчиком и  вашей
            программой;
          - если  у вас имеется расширенная память (EMS) то ее использо-
            вание показывается справа от использования основной памяти;
          - список прерываний, перехваченных отлаживаемой программой;
          - версия DOS, под управлением которой вы работаете;
          - обрабатываются  ли точки останова целиком программным путем,
            или имеются вспомогательные аппаратные средства.
                    г[*]====System Information============¬
                    ¦Program: D:\PASCAL\EXAMPLES\EMS.EXE  ¦
                    ¦Status:  Stopped at #TCDEMO#38       ¦
                    ¦                                     ¦
                    ¦______Memory____ ______EMS__________ ¦
                    ¦ DOS     : 177Kb DOS:     :    464Kb ¦
                    ¦ Debugger: 282Kb Debugger :    272Kb ¦
                    ¦ Symbols :   1Kb Program  :      0Kb ¦
                    ¦ Program :  83Kb Avaliable:    788Kb ¦
                    ¦ Avaliable:  94Kb                    ¦
                    ¦                                     ¦
                    ¦ User Interrupt:  00h  02h           ¦
                    ¦                                     ¦
                    ¦ DOS Version    : 5.00               ¦
                    ¦ BreakPoints    : Software           ¦
                    ¦ 7-9-1988  12:45 pm                  ¦


                    ¦               OK                    ¦
                    ¦              ----                   ¦
                    L=====================================-
            Рис. 5. 4 Текстовое окно команды Get Info для DOS
            Debugger -  отладчик;  Symbols  - идентификаторы;  Program -
       программа; Memory - память; EMS - расширенная память; Avaliable -
       доступно памяти; User interrupt - прерывание пользователя; Status
       - состояние;  Stopped at...  - остановлено на...;  DOS Version  -
       версия DOS; BreakPoints - точки останова; Software - программные.
            На второй строке данного окна, где описывается причина оста-
       новки программы, могут выводиться следующие сообщения:

       TDeb 3.0 #1-3               = 121 =
            Stopped at_ (остановлена на...)
            Ваша программа  остановлена  в результате выполнения команды
       RUN¦Execute To (Запуск¦Выполнение до...),  Run¦Go to Cursor  (Вы-
       полнение¦Переход к курсору),  или Run¦Until Return (Выполнение¦До
       возврата управления).  В этой строке состояния  выводится  также,
       где была сначала загружена ваша программа,  и выполнялся ли в ва-
       шей программе код инициализации компилятора для перехода на нача-
       ло исходного кода.
            No program loaded (программа не загружена)
            Вы запустили Турбо отладчик без программы. Невозможно выпол-
       нить никакой код,  пока вы не загрузите целиком программу или  не
       ассемблируете  некоторые  инструкции с помощью команды локального
       меню Assemble  (Ассемблирование)  области  Code  (Код)  окна  CPU
       (Центральный процессор).
            Control Break (клавиша Ctrl-Break)
            Вы прервали  выполнение  программы с помощью Ctrl-Break (или
       другой клавиши, которой было присвоено это значение после переоп-
       ределения клавиши Break).
            Trace (трассировка)
            Вы выполняете  с  помощью  клавиши  F7 или команды Run¦Trace


       (Выполнение¦Трассировка) трассировку по  одной  строке  исходного
       кода или машинной инструкции.
            Breakpoint at_ (точка останова на...)
            В вашей программе встретилась точка останова, которая приве-
       ла к ее остановке.  Текст после "at" представляет собой  адрес  в
       программе, где расположена точка останова.
            Terminated, exit code_ (выполнение прекращено,  код заверше-
            ния...)
            Ваша программа  завершила  выполнение.  Текст после "code" -
       это числовое значение кода завершения,  возвращаемого вашей прог-
       раммой DOS.  Если ваша программа не возвращает явное значение, то
       на экран может выводиться произвольное значение ("мусор").  Прог-
       рамму нельзя запустить, пока вы не перезагрузите ее с помощью ко-
       манды Run¦Program Reset (Выполнение¦Сброс программы).
            Loaded (загружена)
            Вы загрузили Турбо отладчик и задали программу  и  параметр,
       который  предотвращает  выполнение кода инициализации компилятора
       (sturtup code).  В этот момент никаких инструкций еще не выполне-
       но, включая те, которые управляют первоначальной установкой ваше-

       TDeb 3.0 #1-3               = 122 =
       го стека и сегментных регистров.  Это означает,  что при  попытке
       проверить какие-либо данные в вашей программа, вы можете получить
       некорректные значения.
            Step (шаг)
            Вы выполняете программу по одной строке исходного  кода  или
       машинной инструкции,  пропуская вызовы функций (с помощью клавиши
       F8 или команды Run¦Step (Выполнение¦Шаг)).
            Interrupt (прерывание)
            Вы нажали   клавишу   прерывания   (обычно    это    клавиши
       Ctrl-Break), чтобы получить управление. Ваша программа немедленно
       прерывает выполнение и управление получает отладчик.
            Exception_ (особая ситуация)
            Вы использовали TD386,  когда  встретилась  особая  ситуация


       процессора. Это обычно случается, когда программа пытается выпол-
       нить недопустимый для данного процессора код операции. В докумен-
       тации  по процессору Intel каждая особая ситуация описана подроб-
       но.
            Hardware deviсe driver stuck (конфликт с драйвером  аппарат-
            ного устройства отладки)
            Вы используете аппаратный отладчик и  установили  аппаратную
       точку останова для стековой  переменной,  конфликтующую  с  Турбо
       отладчиком. Прежде  чем пойти дальше,  вы должны убрать эту аппа-
       ратную точку останова.
            Divide by zero (деление на ноль)
            Ваша программа выполнила команду деления,  в которой  встре-
       тился нулевой делитель.
            Global breakpoint _ at__ (глобальная точка останова _ в _)
            Встретилась глобальная точка останова.  Вам сообщен ее номер
       и адрес в программе.

       TDeb 3.0 #1-3               = 123 =
                               Формат Windows
       -----------------------------------------------------------------
            Если вы отлаживаете программу для Windows, то в блоке System
       Information будет выведена следующая информация:
            -  имя отлаживаемой программы;
            -  описание причин останова программы;
            -  информация о глобальной памяти в системе;
            -  текущая версия DOS;
            -  текущие дата и время.
                г[*]====System Information===================¬
                ¦Program: C:\TCW\TCWDEMO.EXE                 ¦
                ¦Status: Window message breakpoint at wndproc¦
                ¦                                            ¦
                ¦______Global Memory________                 ¦
                ¦                                            ¦
                ¦ Mode    :       Non-EMS                    ¦
                ¦ Banked  :            0Kb                   ¦
                ¦ Not banked :    12006Kb                    ¦


                ¦ Largest :       177Kb                      ¦
                ¦                                            ¦
                ¦                                            ¦
                ¦                                            ¦
                ¦ DOS Version    : 5.00                      ¦
                ¦                                            ¦
                ¦ 7-9-1991  12:45 pm                         ¦
                ¦               OK           Help            ¦
                ¦              ----         -----            ¦
                L============================================-
            Рис. 5. 5 Текстовое окно Windows Get Info
                    Сообщения, выводимые в строке состояния
            Ниже приведен  список сообщений,  которые объясняют причину,
       по которой было остановлено выполнение программы,  и выводятся во
       второй строке окна (строке состояния).
            Stoped at_ (остановлена на...)
            Программа была  остановлена в результате выполнения одной из
       команд:  Run¦Execute To,  Run¦Go to Cursor или Run¦Until  Return.
       Это  сообщение  в строке состояния выдается также при первой заг-
       рузке программы, когда выполнен код начальной загрузки, сформиро-
       ванный  компилятором,  и  маркер  выполнения  установлен в начале
       текста программы.

       TDeb 3.0 #1-3               = 124 =
            No program loaded (программа не загружена)
            Турбо отладчик был запущен без какой-либо программы. Никакой
       код не может быть выполнен, пока не будет загружена программа или
       не будет  ассемблированы  некоторые  команды  с  помощью  команды
       Assemble локального меню области кода окна процессора (CPU).
            Trace (трассировка)
            Была выполнена одна строка исходного текста или машинная ко-
       манда по команде F7 (Run¦Trace).
            Breakpoint at_ (точка останова в...)
            При выполнении программы встретилась точка останова,  задан-


       ная для прерывания работы программы. Текст после слова "at" озна-
       чает адрес команды программы,  на которой установлена точка оста-
       нова.
            Window Message breakpoint at_ (точка останова  по  сообщению
            окна в _)
            Ваша программа  встретила  точку останова по сообщению окна,
       заданную для прерывания работы программы.  Текст после слова "at"
       - это оконная процедура, которой предназначено сообщение.
            Terminated, exit code_ (завершена, код выхода...)
            Работа программы завершена.  Текст после слова "code" предс-
       тавляет собой код выхода,  возвращаемый  программой  операционной
       системе DOS. Если программа не возвращает DOS какого-либо опреде-
       ленного значения, вместо кода выхода может отображаться какое-ли-
       бо не имеющее смысла число. Программа не может быть запущена, по-
       ка не  будет  загружена   заново   командой   Run¦Program   Reset
       (Выполнение¦Сброс программы).
            Loaded (загружена)
            Вы запустили  Турбо  отладчик,  указав имя программы и пара-
       метр,  который предотвращает выполнение кода начальной  загрузки,
       сформированного компилятором.  Никакие команды еще не были выпол-
       нены, включая те, которые устанавливают стек и сегментные регист-
       ры.  Это  означает,  что если вы попытаетесь проверить какие-либо
       данные в своей программе, вы получите неправильные значения.
            Interrupt (прервана)
            Была нажата клавиша прерывания (обычно Ctrl-Alt-SysRq), что-
       бы  вернуть управление отладчику.  В этом случае работа программы
       немедленно прерывается, а управление передается отладчику.
            Exception_ (особая ситуация)

       TDeb 3.0 #1-3               = 125 =
            Встретилась особая ситуация процессора.  Это обычно случает-
       ся,  когда  программа пытается выполнить недопустимый для данного


       процессора код операции.  В документации по процессору Intel каж-
       дая особая ситуация описана подробно.
            Divide by zero (деление на ноль)
            Ваша программа  выполнила команду деления,  в которой встре-
       тился нулевой делитель.
            Global breakpoint _ at__ (глобальная точка останова _ в _)
            Встретилась глобальная точка останова.  Вам сообщен ее номер
       и адрес в программе.
                       Информация о глобальной памяти
       -----------------------------------------------------------------
            TDW дает вам следующую информацию о глобальной памяти:
       Mode               Режимами памяти могут быть:  Large-frame   EMS
       (Режим)            (EMS-память  с  большим  размером  страничного
                          блока), Small-frame EMS  (EMS-память  с  малым
                          размером страничного блока),  или non-EMS (до-
                          полнительная память).
       Banked             Объем памяти в килобайтах выше линии банка EMS
       (Банкируемая)      (которая может  быть  откачана  в  расширенную
                          память, если ее использует система).
       Not Banked         Объем памяти в килобайтах ниже линии банка EMS
       (Не банкируемая)   (которая не может быть откачана в расширенную
                          память).
       Largest            Наибольший непрерывный блок памяти в  килобай-
       (Наибольший)       тах.
                                  Меню Run
       -----------------------------------------------------------------
            Меню Run  (Выполнение) содержит несколько параметров для вы-
       полнения различных частей вашей программы. Поскольку эти парамет-
       ры часто используются, им соответствуют функциональные клавиши.

       TDeb 3.0 #1-3               = 126 =
                 ----------------------------¬
                 ¦ Run                    F9 ¦  Выполнение
                 ¦ Go to cursor           F4 ¦  Выполнение до курсора


                 ¦ Trace into             F7 ¦  Трассировка
                 ¦ Step over              F8 ¦  Шаг с пропуском
                 ¦ Execute to...      Alt-F9 ¦  Выполнение до...
                 ¦ Until return       Alt-F8 ¦  Выполнение до возврата
                 ¦ Animate...                ¦  Автоматизировать
                 ¦ Back trace         Alt-F4 ¦  Обратная трассировка
                 ¦ Instruction trace  Alt-F7 ¦  Трассировка инструкций
                 +---------------------------+
                 ¦ Arguments...              ¦  Аргументы
                 ¦ Program reset     Ctrl-F2 ¦  Сброс программы
                 L----------------------------

       TDeb 3.0 #1-3               = 127 =
                              Команда Run [F9]
       -----------------------------------------------------------------
            Команда Run  (Выполнение) запускает вашу программу на выпол-
       нение. При наступлении одного из следующих событий управление пе-
       редается отладчику.
            - ваша программа завершила выполнение;
            - обнаружена точка останова с действием прерывания;
            - вы прервали выполнение с помощью клавиш Ctrl-Break.
                          Команда Go to Cursor [F4]
       -----------------------------------------------------------------
            Команда Go to Cursor (Перейти к курсору) выполняет программу
       до  той строки,  где находится курсор (в текущем окне Module (Мо-
       дуль) или области Code окна CPU  (Центральный  процессор)).  Если
       текущим  окном является окно Module,  курсор должен находиться на
       строке исходного кода внутри функции.
                           Команда Trace Into [F7]
       -----------------------------------------------------------------
           Команда Trace Into (Трассировка вглубь) выполняет одну строку
       исходного  кода или машинную инструкцию.  Если текущая строка со-
       держит вызов процедуры или функции,  то Турбо отладчик  выполняет


       трассировку этой процедуры.  Однако,  если текущим окном является
       окно CPU (Центральный процессор),  то выполняется  одна  машинная
       инструкция.
            Турбо отладчик интерпретирует методы объектов и функции-эле-
       менты классов,  как все другие процедуры и  функции.  Клавиша  F7
       позволяет трассировать их исходный код (если он доступен).
                           Команда Step Over [F8]
       -----------------------------------------------------------------
            Команда Step Over (Шаг с пропуском)  выполняет  одну  строку
       исходного кода или машинную инструкцию, минуя трассировку вызыва-
       емой процедуры или функции.  При  этом  обычно  выполняется  одна
       строка исходного текста программы.
            Однако, если текущим окном является окно CPU (ЦП), то выпол-
       няется только одна машинная инструкция.
            Если вы выполняете эту команду для  одной  исходной  строки,
       Турбо  отладчик  интерпретирует любой вызов процедуры или функции
       на этой строке, как часть самой строки, поэтому при завершении вы
       не окажетесь в начале одной из этих функций.  Вместо этого вы пе-

       TDeb 3.0 #1-3               = 128 =
       рейдете к следующей строке текущей подпрограммы или  к предыдущей
       программе, которая вызвала данную.
            Если вы  выполняете  эту команду для одной машинной инструк-
       ции, Турбо отладчик интерпретирует некоторые инструкции, как одну
       инструкцию, даже они приводят к выполнению нескольких инструкций.
       Приведем полный список инструкций, которые Турбо отладчик интерп-
       ретирует, как одну инструкцию:
            CALL            Вызов подпрограммы (ближний или дальний).
            INT             Вызов прерывания.
            LOOP            Управление циклом (CX - счетчик).
            LOOPZ           Управление циклом (CX - счетчик).
            LOOPNZ          Управление циклом (CX - счетчик).
            Шаг с  пропуском выполняется также для префиксов REP,  REPNZ


       или REPZ,  за которыми следуют  инструкции  CMPS,  CMPSW,  LODSB,
       MOVS, MOVSB, MOVSW, SCAS, SCASB, SCASW, STOS, STOSB или STOSW.
            Шаг с  пропуском выполняется также для префиксов REP,  REPNZ
       или REPZ,  за которыми следуют  инструкции  CMPS,  CMPSW,  LODSB,
       MOVS, MOVSB, MOVSW, SCAS, SCASB, SCASW, STOS, STOSB или STOSW.
            Команда Run¦Step Over (Выполнение¦Шаг с пропуском) интерпре-
       тирует вызов  метода  объекта или функцию-элемент класса как один
       оператор,  м выполняет для него шаг с пропуском,  как  при  любом
       другом вызове процедуры или функции.
                       Команда Execute To... [Alt-F9]
       -----------------------------------------------------------------
            Команда Execute To (Выполнение до...) выполняет  вашу  прог-
       рамму до адреса, который вы ввели в ответ на подсказку в диалого-
       вом окне.  Программа может не достичь этого адреса, если встреча-
       ется точка останова или вы прерываете выполнение.
                        Команда Until Return [Alt-F8]
       -----------------------------------------------------------------
            Команда Until Return (Выполнение до возврата управления) вы-
       полняет текущую процедуру или функцию,  пока она не возвратит уп-
       равление вызывающей программе.  Это полезно использовать при двух
       обстоятельствах:  если вы случайно вошли в процедуру или функцию,
       выполнение  которой  вас  не  интересует   (с   помощью   команды
       Run¦Trace (Выполнение¦Трассировка)  вместо  команды Run¦Step (Вы-
       полнение¦Шаг)),  или когда вы определили, что текущая функция ра-
       ботает правильно,  и не хотите медленно проходить  ее  оставшуюся
       часть.
                             Команда Animate...
       -----------------------------------------------------------------
            Команда Animate...  (Автоматизировать) выполняет непрерывную

       TDeb 3.0 #1-3               = 129 =


       последовательность команд Trace (Трассировка).  Это позволяет вам
       наблюдать  за  текущим адресом в исходном коде и видеть изменение
       значений переменных. Прервать выполнение данной команды можно на-
       жатием любой клавиши.
            После выбора  команды  Run¦Animate (Выполнение¦Автоматизиро-
       вать) вам  выведется  подсказка для ввода значения интервала вре-
       менной задержки между последовательными трассировками  (в десятых
       долях секунды). По умолчанию используется значение 3.
                             Команда Back Trace
       -----------------------------------------------------------------
            Если вы выполняете трассировку программы (с помощью операти-
       вных клавиш F7 или Alt-F7),то данная команда изменяет порядок вы-
       полнения на обратный.  Это средство удобно использовать,  если вы
       проскочили место предполагаемой ошибки и хотите вернуться  к этой
       точке. Данная команда позволяет вам выполнить программу "в обрат-
       ном порядке" по шагам или до заданной (подсвеченной) точки в  об-
       ласти инструкций окна Execution History (Протокол выполнения).
                 Предупреждение: Здесь  имеются  некоторые  ограничения.
           См. раздел "Область инструкций".
                     Команда Instruction Trace [Alt-F7]
       -----------------------------------------------------------------
            Команда Instruction Trace (Трассировка инструкций) выполняет
       одну инструкцию. Ее можно использовать, когда вы хотите трассиро-
       вать прерывание, или когда вы находитесь в окне Module (Модуль) и
       хотите выполнять трассировку процедуры или функции, которая нахо-
       дится в модуле без отладочной информации  (например, библиотечной
       подпрограмме).
            Так как  вы  больше не будете находиться в начале строки ис-
       ходного теста, эта команда обычно переводит вас в окно CPU (Цент-
       ральный процессор).


                            Команда Arguments...
       -----------------------------------------------------------------
            Данная команда позволяет вам задать новые аргументы програм-
       мы. Более подробно это обсуждается далее.
                       Команда Program Reset [Ctrl-F2]
       -----------------------------------------------------------------
            Команда Program Reset (Сброс программы) перезагружает  отла-
       живаемую вами программу с диска.  Ее можно использовать в следую-
       щих случаях:
            - когда выполнение "зашло слишком далеко",  то есть пройдено
              то место, где имеется ошибка;

       TDeb 3.0 #1-3               = 130 =
            - когда  ваша  программа завершила работу и вы хотите запус-
              тить ее снова;
            - если вы работаете в  окне  CPU,  приостановили  выполнение
              программы с помощью Ctrl-Alt-SysRq и хотите завершить ее и
              начать сначала.
            - если вы уже загрузили прикладную программу, начали отладку
              с одной  или более библиотек динамической компоновки (DLL)
              и хотите отладить эти DLL.
            Если вы находитесь в окне Module или CPU,  то отладчик уста-
       навливает маркер текущей строки на начало программы, но экран ос-
       тается там,  где вы были при выборе команды Program Reset  (Сброс
       программы).  Такое  поведение  облегчает  установку курсора на то
       место, где вы были, и выполнение программы до данной строки.
            Если вы выбрали команду Program  Reset  только  потому,  что
       зашли  на один оператор дальше нужного места,  вы можете перемес-
       тить курсор в файле исходного кода вверх на несколько строк и на-
       жать клавишу F4, чтобы выполнить программу до этого места. В про-
       тивном случае вы  можете  (если  с  помощью  окна  View¦Execution
       History  включено средство полного протоколирования Full History)


       выбрать вместо команды Program Reset (Сброс программы) для  возв-
       рата к ранее выполненному коду команду Run¦Back Trace (Выполнение
       ¦Обратная трассировка).

       TDeb 3.0 #1-3               = 131 =
                           Окно Execution History
       ------------------------------------------------------------------
            В Турбо отладчике имеется специальное средство,  которое на-
       зывается протоколом выполнения.  Это средство позволяет  отслежи-
       вать каждую выполняемую инструкцию (предполагается,  что вы трас-
       сируете код программы) и, кроме того, если вы хотите, фиксировать
       нажимаемые  вами  для достижения данного места программы клавиши.
       Вы можете просмотреть данные инструкции и выполнить их в обратном
       порядке  (отменить),  чтобы вернуться в ту точку,  где содержится
       предполагаемая ошибка.  Если у вас нет расширенной памяти,  Турбо
       отладчик может записывать около 400 инструкций.  При наличии рас-
       ширенной памяти он может записать примерно 3000 инструкций.
                -==Execution history==============3===[ ][ ]==¬
                ¦7229:04F5: push ax                           ¦
                ¦7229:04F6: push bp                           ¦
                ¦7229:04F7:-call---TCDEMO.PROCESSLINE.ISLETTER¦
                ¦<------------------------------------------->¦
                ¦Trace TPDEMO.122:  while i <= Length(S) do   ¦
                ¦Trace TPDEMO.125:  while (i <= Length(S)   an¦
                ¦Trace TPDEMO.PROCESSLINE.ISLETTER: begin     ¦
                L=============================================-
            Рис. 5.6 Окно Execution History
            В окне Execution History (Протокол выполнения), которое отк-
       рывается по команде View¦Execution History (Обзор¦Протокол выпол-
       нения) вы можете просмотреть протокол выполнения.
            Данное окно содержит две области:  область инструкций (ввер-


       ху) и область записи клавиш (нижняя область).
                             Область инструкций
       -----------------------------------------------------------------
            В области инструкций выводятся инструкции,которые уже выпол-
       нены и которые вы можете отменить. Выбрать нужную инструкцию мож-
       но, перемещая полосу (строку) подсветки.
            В протоколе выполнения отслеживаются только инструкции,  ко-
       торые выполняются по  команде  Trace  Into  (Трассировка  вглубь)
       (клавиша F7) или Instruction Trace (Трассировка инструкций) (кла-
       виши Alt-F7).  Если вы не встретите ни одну из перечисленных выше
       (в предыдущих разделах) команд,  там отслеживаются также инструк-
       ции, выполняемые по команде Step  Over  (Шаг  с  пропуском).  Как
       только  вы  используете  команду  Run (Выполнение) или выполняете
       прерывание,  протокол инструкций удаляется. (Когда вы вернетесь к
       трассировке, инструкции снова будут фиксироваться.)
            Обратную трассировку вызова прерывания выполнять нельзя.

       TDeb 3.0 #1-3               = 132 =
            Если вы  выполняете шаг с пропуском при вызове процедуры или
       функции, то вы не сможете выполнить обратную трассировку инструк-
       ций, предшествующих возврату управления.
            Обратная трассировка  инструкций,  работающих с портами,  не
       действует, так как вы не  можете  отменить  выполненные  операции
       чтения или записи.
                      Локальное меню области инструкций
       -----------------------------------------------------------------
                                 ---------------------------¬
            Проверка             ¦ Inspect                  ¦
            Обратное выполнение  ¦ Reverse execute          ¦
                                 +--------------------------+
            Полный протокол      ¦ Full history          No ¦
                                 L---------------------------


            Локальное меню области инструкций содержит три команды.
                               Команда Inspect
       -----------------------------------------------------------------
            Команда Inspect (Проверка) перемещает вас к команде, подсве-
       ченной в области инструкций.  Если это строка исходного кода, вам
       показывается эта строка в окне Module (Модуль). Если нет исходно-
       го кода, то открывается окно CPU (ЦП) и инструкция подсвечивается
       в области кода.
                      Команда Reverse Execute [Alt-F4]
       -----------------------------------------------------------------
            Данная команда (можно также использовать оперативные клавиши
       Alt-F4) выполняет программу в обратном порядке до того места, ко-
       торое подсвечено в области инструкций. Если вы выбрали строку ис-
       ходного кода, то вы возвращаетесь в окно Module, в противном слу-
       чае выводится  окно CPU (ЦП) с подсветкой на инструкции в области
       кода.
                 Предупреждение: Вы не можете выполнять в  обратном  по-
            рядке ту часть программы, которую вы не трассировали. Напри-
            мер,  если вы установите точку останова и затем нажмете кла-
            вишу F9, чтобы выполнить программу до точки останова, то ваш
            протокол выполнения будет потерян. В этом случае для восста-
            новления  ситуации можно использовать средство повторной от-
            работки нажатых клавиш (окна Execution History).  Для  этого
            нужно перезагрузить  программу и выполнить ее до данной точ-
            ки.
                 Предупреждение: Инструкция INT приводит к потере преды-
            дущего протокола выполнения. Вы не можете выполнить эту инс-

       TDeb 3.0 #1-3               = 133 =
            трукцию  в обратном порядке,  если не использовалась трасси-
            ровка прерывания (клавиши Alt-F7).
            Следующие инструкции  не приводят к потере протокола регист-


       рации, но имеют необратимый эффект,  поэтому отменить их  нельзя.
        Если вы попытаетесь выполнить данные инструкции в обратном поряд-
       ке, могут возникнуть непредсказуемые эффекты.
                     IN                       INSW
                     OUT                      OUTSB
                     INSB                     OUTSW
                   Команда Full History (Полный протокол)
       -----------------------------------------------------------------
            Это команда-переключатель.  Если она установлена в состояние
       On (Включено), то обратная трассировка разрешена. В состоянии Off
       (Выключено) обратная трассировка запрещена.
                     Область регистрации нажатий клавиш
       -----------------------------------------------------------------
            Даже если  вы  случайно уничтожили свой протокол выполнения,
       вы все равно сможете вернуться обратно к данной  точке программы.
       Для этого должно быть разрешено средство регистрации нажатий кла-
       виш.
            Регистрация нажатий клавиш в сочетании со средством обратно-
       го выполнения программы предоставляет вам различные способы возв-
       рата во время сеанса отладки к предыдущей точке.  При регистрации
       нажатий  клавиш регистрируются все клавиши,  которые вы нажимаете
       (как при вводе команд Турбо отладчика, так и при взаимодействии с
       отлаживаемой программой).  Клавиши  регистрируются в файле с име-
       нем имя_программы.TDK, где "имя_программы" - это имя отлаживаемой
       программы.
            Для повторного выполнения нажатий клавиш для возврата к пре-
       дыдущей  точке  сеанса  отладки  используйте  нижнюю область окна
       Execution History (Протокол выполнения). Каждая строка в протоко-
       ле выполнения показывает причину, по которой Турбо отладчик полу-
       чил управление (точка останова, трассировка и т.д.) и текущий ад-
       рес программы в этот момент.


Если этот адрес соответствует строке
       исходного кода, то выводится также эта строка. В противном случае
       дисассемблируется инструкция по данному адресу.
            Регистрацию последовательности  нажатий клавиш разрешает па-
       раметр командной строки -k. Для того, чтобы он по умолчанию уста-
       навливался  в  значение  On (Включено),  можно также использовать
       утилиту TDINST.
              Локальное меню области регистрации нажатий клавиш
       -----------------------------------------------------------------

       TDeb 3.0 #1-3               = 134 =
                                               --------------------¬
                 Проверка                      ¦ Inspect           ¦
                 Восстановление нажатий клавиш ¦ Keystroke restore ¦
                                               L--------------------

       TDeb 3.0 #1-3               = 135 =
                               Команда Inspect
       -----------------------------------------------------------------
            Если вы переведете подсветку на строку в области регистрации
       нажатий клавиш,  а затем  выберите  из  локального  меню  команду
       Inspect (Проверка),  то выводится окно Module (Модуль),  курсор в
       котором установлен на той строке исходного кода,  где была нажата
       клавиша.
            Если данная  строк (в области регистрации нажатий клавиш) не
       соответствует позиции в исходном  коде,  то  выводится  окно  CPU
       (ЦП), подсветка в котором позиционирована на инструкции.
                          Команда Reystroke Restore
       -----------------------------------------------------------------
            Если вы подсветите строку в области регистрации нажатий кла-
       виш,  а  затем выберите команду Кeystroke Restore (Восстановление
       нажатий клавиш),  то Турбо отладчик перезагрузит вашу программу и
       запустит ее до выделенного (подсвеченного) контекста. Это особен-
       но полезно использовать,  когда вы выполнили команду Турбо отлад-


       чика, которая удалила протокол выполнения.
                       Прерывание выполнения программы
       -----------------------------------------------------------------
            В интерактивных программах скорейший способ добраться до оп-
       ределенного  места  в  вашей  программе заключается иногда в том,
       чтобы просто запустить ее и взаимодействовать с ней,  пока она не
       достигнет нужной части кода, а затем прервать выполнение. Особен-
       но это касается того случая,  когда та часть кода, которую вы хо-
       тите проверить, вызывается несколько раз до того момента, который
       вас интересует.
            Может также  потребоваться  прервать  выполнение  программы,
       когда  по каким-либо причинам управление не передается отладчику.
       Это может произойти когда часть кода содержит  бесконечный  цикл:
       вы ожидаете, что эта часть кода будет выполнена и поэтому устано-
       вили точку останова, но она не достигается.
                             Клавиши Ctrl-Break
       -----------------------------------------------------------------
            Это сочетание клавиш почти всегда прерывает вашу программу и
       возвращает управление отладчику. Эти клавиши действуют, как толь-
       ко  будут нажаты,  поэтому вы иногда можете оказаться в непредви-
       денной части кода.  Это может быть ПЗУ клавиатуры базовой системы
       ввода-вывода,  если  ваша программа ожидает нажатия клавиши,  или
       любая инструкция в выполняемом цикле. Клавиши Ctrl-Break не могут
       отменить следующие два условия (и если возникнет одно из них, вам
       придется перезагрузить систему):
          - вы попали в цикл, когда запрещены прерывания;

       TDeb 3.0 #1-3               = 136 =
          - произошел сбой системы из-за выполнения ошибочного кода.
            Если вы отлаживаете программу, которая сама должны обрабаты-
       вать клавиши Ctrl-Break,  вы можете сменить  клавишу  прерывания.


       Для этого можно воспользоваться программой TDINST.  Значение кла-
       виши прерывания можно присвоить любой обычной клавише  (она будет
       действовать в сочетании с клавишей Ctrl).
                      Завершение работы вашей программы
       -----------------------------------------------------------------
            Когда ваша программа завершает работу, и вы из нее выходите,
       отладчик снова получает управление. Он выводит сообщение, показы-
       вающее код завершения вашей программы, который будет возвращаться
       в DOS.  Когда ваша программа завершила работу, до ее перезагрузки
       с  помощью команды Run¦Program Reset (Выполнение¦Сброс программы)
       вы не можете воспользоваться ни одной из команд меню Run  (Выпол-
       нение).
            Когда ваша программа завершила работу, сегментные регистры и
       стек обычно имеют некорректные значения,  поэтому не анализируйте
       и не модифицируйте значения переменных после завершения  програм-
       мы.
                        Возобновление сеанса отладки
       -----------------------------------------------------------------
            В Турбо отладчике имеется несколько средств, позволяющих  по
       возможности  гладко возобновить сеанс отладки.  При отладке прог-
       раммы легко забрести слишком далеко и проскочить ошибку. При этом
       лучше возобновить отладку и приостановить выполнение не несколько
       команд раньше (до ошибки).
            В большинстве отладчиков для этого приходится вводить  слиш-
       ком длинную последовательность команд.  В Турбо отладчике же име-
       ется мощное средство,  позволяющее фиксировать нажатия клавиш  во
       время сеанса отладки (вести протокол),  а затем "проигрывать" все
       заново по вашему запросу.
            Турбо отладчик также позволяет вам перезагрузить программу с
       диска с теми же аргументами командной строки.
                           Перезагрузка программы


       -----------------------------------------------------------------
            Чтобы перезагрузить отлаживаемую программу,  используйте ко-
       манду  Run¦Program Reset (Выполнение¦Сброс программы).  Турбо от-
       ладчик перезагружает программу с диска со всеми  данными, которые
       вы  могли добавить с момента последнего сохранения на диске.  Это
       наиболее надежный способ перезапуска программы. Возобновление пу-
       тем  выполнения  с  начала  программы рискованно,  так как многие
       программы ожидают инициализации данных с образа программы на дис-

       TDeb 3.0 #1-3               = 137 =
       ке.
            Заметим, что команда Program Reset (Сброс программы)  остав-
       ляет точки останова и выражения просмотра в неприкосновенности.
        Запись нажатий клавиш в макрокоманду и повторная их отработка
       -----------------------------------------------------------------
            Для записи  часто  используемой последовательности клавиш вы
       можете использовать специальное макросредство - клавиатурную мак-
       рокоманду. При отладке для достижения определенного места в прог-
       рамме часто повторяется одна и та же  последовательность  команд.
       Это может быть довольно утомительным.
            Чтобы обойти данную проблему,  вы можете определить  клавиа-
       турную макрокоманду, которая будет фиксировать все клавиши, нажи-
       маемые вами с момента,  когда вы запускаете отладчик  и  до  того
       момента, когда вы подошли к нужному месту программы. В этом месте
       вы можете приостановить запись клавиш. Если вы захотите вернуться
       к данному месту программы,  все,  что для этого требуется  -  это
       просто  повторная  отработка  клавиатурной  макрокоманды (нажатий
       клавиш).
            Этот метод нельзя,  однако,  использовать для записи клавиш,
       которые требуется нажимать при работе с вашей программой.  Вы мо-
       жете записывать только командные клавиши Турбо отладчика.


            Первое, что  вы должны сделать после запуска Турбо отладчика
       из DOS для записи всего сеанса отладки, - это определение клавиа-
       турной   макрокоманды.   Для   этого   нужно   выбрать    команду
       Options¦Macros¦Create (Параметры¦Макрокоманды¦Создание).  Вам вы-
       ведется подсказка с запросом нажать клавишу,  которой будет прис-
       воена  макрокоманда.  Выберите клавишу,  которой еще не присвоена
       функция, например Shift, и одну из функциональных клавиш, скажем,
       Shift-F1.  Теперь выполняйте вашу программу до момента ошибки.
                 Примечание: Не  используйте для завершения макрокоманды
            команду Macros¦Stop Recording  (Макрокоманды¦Остановить  за-
            пись).
            В этой точке завершите запись  макрокоманды,  нажав  клавиши
       Alt-минус  (или  клавишу,  которой вы присваиваете макрокоманду).
       Теперь сохраните макрокоманду на диске с помощью команды Options¦
       Save Recording (Параметры¦Сохранить запись).  Продолжите выполне-
       ние вашей программы. После сбоя вашей программы и ее перезагрузки
       с  Турбо  отладчиком для возобновления программы можно просто на-
       жать клавиши Shift-F9.
            Если в вашей программе для того, чтобы перейти к нужно части
       кода, нужно что-то вводить, вам придется вводить это вручную. (Вы
       можете сделать  это  во время работы макрокоманды.) Для программ,
       не требующих ввода,  механизм записи клавиш позволяет автоматизи-
       ровать процедуру возобновления полностью.

       TDeb 3.0 #1-3               = 138 =
            Когда макрокоманда сохраняется в файле конфигурации,  сохра-
       няется конфигурация полного окружения,  включая открытые  окна  и
       окна с измененным (переключенным) размером.  Таким образом,  если
       вы записали макрокоманду,  которая открывает окно и не  закрывает
       его перед  сохранением макрокоманды,  то когда вы в следующий раз
       восстановите файл конфигурации, окно будет открыто автоматически,


       даже если вы не выполнили макрокоманду.

       TDeb 3.0 #1-3               = 139 =
                    Загрузка новой программы для отладки
       -----------------------------------------------------------------
            Новую программу для отладки можно загрузить с помощью коман-
       ды File¦Load (Файл¦Загрузка).  Вы можете использовать трафаретные
       символы DOS для вывода списка файлов для выбора,  либо ввести имя
       конкретного  файла.  Если в ответ на подсказку вы нажмете клавишу
       Enter,  то выведется список всех файлов .EXE в текущем  каталоге.
       Переместите подсветку на имя того файла, который вы хотите загру-
       зить, и нажмите Enter.
            г[*]===============Enter program to load=============¬
            ¦ File name                                          ¦
            ¦-*.exe--------------------------------------  OK    ¦
            ¦                                             ------ ¦
            ¦ Files                    Directories        Cancel ¦
            ¦ bildsp.exe               pepper             ------ ¦
            ¦ donothih.exe             td                  Help  ¦
            ¦ dototal.exe              tdold              ------ ¦
            ¦ drwhappy.exe                                       ¦
            ¦ echo.exe                                           ¦
            ¦ hello.exe                                          ¦
            ¦ tittle.exe                                         ¦
            ¦ mytest.exe                                         ¦
            ¦ pwrs.exe                                           ¦
            ¦ reserve.exe                                        ¦
            ¦ small.exe                                          ¦
            ¦ tcdemo.exe                                         ¦
            ¦                                                    ¦
            ¦G:\NETFILES\DEBUG\PROGRAM\*.EXE                     ¦
            ¦BILDSP.EXE       Feb  19,1988 2:23pm   4592 bytes   ¦


            L====================================================-
            Рис. 5. 7 Диалоговое окно Load Program (Загрузка программы)
            Enter program name to load - введите имя программы для  заг-
       рузки; File name - имя файла;  Files - файлы; Directories - ката-
       логи; OK - выбор; Cancel - отмена; Help - справка.
            Если вы вводите имя файла,  который требуется загрузить,  то
       подсветка перемещается к имени файла, которое начинается с первой
       введенной вами буквы (букв).  Когда подсветка позиционируется  на
       нужный файл, нажмите клавишу Enter.
            Передать аргументы отлаживаемой программе можно, поместив их
       после имени программы, также, как вы делаете это в ответ на подс-
       казку DOS, например:
                 myprog a b c
            При этом загрузится программа MyProg с тремя аргументами ко-
       мандной строки (a, b и c).

       TDeb 3.0 #1-3               = 140 =
                       Изменение аргументов программы
       -----------------------------------------------------------------
            Если вы забыли указать для своей программы необходимые аргу-
       менты при ее загрузке,  то для задания или  изменения  аргументов
       можно использовать  команду Run¦Arguments (Выполнение¦Аргументы).
       Введите новые аргументы в том порядке,  в котором они указываются
       после задания имени программы в ответ на подсказку DOS.
            Когда вы  введете  новые аргументы,  Турбо отладчик запросит
       вас, хотите ли вы перезагрузить программу с диска. Обычно следует
       отвечать Yes (Да), так как в большинстве программ новые аргументы
       будут действовать только если вы загрузите программу сначала.

       TDeb 3.0 #1-3               = 141 =
                    Глава 6. Анализ и модификация данных
       -----------------------------------------------------------------
            В Турбо  отладчике предусмотрен уникальный и понятный способ


       для работы с данными вашей программы.
            - Окна  проверки  (окна  Inspector)  позволяют вам проверить
              данные в том виде, как они содержатся в исходном файле. Вы
              можете смотреть, на что ссылаются указатели, просматривать
              массивы, а также структуры, записи и объединения в том ви-
              де, как вы их записали.
            - Вы  можете также поместить в окно Watches (Просмотр) пере-
              менные и выражения и наблюдать за изменением  их  значений
              по мере выполнения программы.
            - Диалоговое  окно  Evaluate/Modify (Вычисление/Модификация)
              показывает содержимое любой  переменной  и  позволяет  вам
              присвоить ей новое значение.
            В данной главе предполагается,что вы уже знакомы с различны-
       ми типами данных,  которые могут встречаться в используемом  вами
       языке  (С++, Паскале или Ассемблере).  Если вы работаете с языком
       недавно и еще не усвоили все типы данных,  то в данной главе име-
       ется  также  много  ценной  информации  об  основных типах данных
       (char,  int,  integer,  boolean, real, с двойной и одинарной точ-
       ностью,  с  плавающей точкой,  строковых,  длинных целых и т.д.).
       Когда вы подробнее познакомитесь с  используемыми  типами  данных
       (освоите указатели, записи, структуры, объединения и т.д.), можно
       вернуться к данной главе и подробнее изучить,  что можно делать с
       ними с помощью Турбо отладчика.
           В данной главе показывается также,  как можно с помощью Турбо
       отладчика проверять и модифицировать переменные программы. Снача-
       ла мы расскажем о меню Data (Данные) и его командах. Затем мы об-
       судим, как можно модифицировать данные программы с помощью вычис-
       ления выражений,  имеющих побочные эффекты.  Наконец, мы покажем,
       как можно непосредственно ссылаться на элементы  данных  в  ваших
       исходных  модулях.  Мы  опишем также окно Watches (Просмотр) и те


       методы,  которые используются для вывода  основных  типов  данных
       каждого языка в окнах проверки (окна Inspector).
                 Примечание: Если  вы  хотите просматривать или изменять
            произвольные блоки памяти  (в  виде  байт  шестнадцатиричных
            данных),  см.  Главу  11,  где  рассказывается об отладке на
            уровне Ассемблера.
                                  Меню Data
       -----------------------------------------------------------------
            Меню Data  (Данные)  позволяет  вам выбрать способ анализа и
       изменения данных программы.  Вы можете вычислить выражение, изме-
       нить  значение переменной и открыть окна проверок (Inspector) для

       TDeb 3.0 #1-3               = 142 =
       вывода содержимого данных на экран.
              ---------------------------¬
              ¦ Inspect...               ¦    Проверка
              ¦ Evaluate/Modify...Ctrl-F4¦    Вычисление/Модификация
              ¦ Add Watch...      Ctrl-F7¦    Добавление выражения прос-
              ¦ Function return          ¦    мотра
              L---------------------------    Возврат результата функции
                             Команда Inspect...
       -----------------------------------------------------------------
            Команда Inspect (Проверка) выводит подсказку с запросом  пе-
       ременной,  ссылающейся на данные,  которые вы хотите проверить, а
       затем открывает окно Inspector (окно проверки), где выводится со-
       держимое  переменной  программы или выражения.  Вы можете вводить
       простое имя переменной,  или сложное выражение,  если только  оно
       ссылается на ячейку памяти и не сводится к константе.
            Если при  вводе  данной  команды  курсор находится в области
       текста, то  подсказка  автоматически  содержит  имя переменной по
       месту расположения курсора (если она имеется).  Если вы выбираете
       выражение в области текста (с помощью клавиши Ins),  то подсказка


       содержит выбранное выражение.
             Когда вы  хотите  проверить содержимое сложных структур дан-
       ных, таких, как массивы или структуры, или связанный список запи-
       сей, окна проверки могут вам очень помочь. Так как вы можете про-
       верять данные внутри окна Inspector  (Проверка),  то  "проходить"
       структуры  данных  программы можно также легко,  как пролистывать
       исходный код программы в окне Module (Модуль).
            Полное описание поведения окон Inspector содержится  далее в
       разделе "Окна Inspector".
                          Команда Evaluate/Modify...
       -----------------------------------------------------------------
            Команда Evaluate/Modify   (Вычисление/Модификация)   выводит
       подсказку (диалоговое окно) для ввода вычисляемого выражения (см.
       Рис. 6.1),  затем вычисляет его (если вы выберите "кнопку" Eval -
       вычисление) так же,  как это сделал бы компилятор. Вычисление вы-
       ражений полностью обсуждается в Главе 9.
            Если при  вводе  данной  команды  курсор находится в области
       текста, то в подсказке будет автоматически содержатся переменная,
       расположенная в том месте,  где находится курсор (если она имеет-
       ся).  Если вы помечаете выражение с помощью клавиши Ins, то подс-
       казка (диалоговое окно) инициализируется отмеченным выражением.

       TDeb 3.0 #1-3               = 143 =
            г==============Evaluate/Modify=======================¬
            ¦ Expression                                 Eval    ¦
            ¦ ----------------------------------------   ------  ¦
            ¦ ----------------------------------------           ¦
            ¦                                            Cancel  ¦
            ¦ Result                                     ------  ¦
            ¦ <not avaliable>-------------------------   Help    ¦
            ¦                                            ------  ¦


            ¦ New value                                  Modify  ¦
            ¦ <not avaliable>-------------------------   ------  ¦
            ¦ ----------------------------------------           ¦
            ¦ ----------------------------------------           ¦
            ¦                                                    ¦
            L====================================================-
            Рис. 6.1 Диалоговое окно Evaluate/Mofify
            Expression - выражение;  Result - результат; New value - но-
       вое значение;  not avaliable  -  недоступно;  Eval  -  вычислить;
       Cancel - отменить; Help - справка; Modify - модифицировать.
            Нужно помнить о том,  что после выражения, которое вы хотите
       просмотреть, можно добавить строку управления форматом. (О строке
       управления  форматом рассказывается в Главе 9.) Этим полезно вос-
       пользоваться, когда вы хотите просмотреть что-либо, что выводится
       в формате,  отличном от используемого Турбо отладчиком по умолча-
       нию режима вывода на экран для этого типа данных.  Для вывода ре-
       зультата в другом формате укажите после выражение разделитель-за-
       пятую (,),  затем строку управления форматом. Это полезно исполь-
       зовать, когда  вы  хотите что-либо просмотреть,  но вывести это в
       другом формате,  отлично от того,  который используется Турбо от-
       ладчиком по умолчанию.
            Диалоговое окно содержит три области (поля).
            - Выражение,  которое  вы  хотите вычислить,  можно ввести в
              верхней области.  Это область ввода Evaluate.  Как  и  все
              другие подсказки ввода, эта область содержит протокол (вы-
              полняемых действий).
            - В  средней  области  выводится результат вычисления вашего
              выражения.
            - Нижняя  область  - это область ввода,  в которой вы можете
              ввести новое выражение для вычисления.  Если выражение мо-


              дифицировать нельзя, то в данное области выводится сообще-
              ние <not avaliable> (недоступно).
            Запись в поле ввода New Value (Новое значение)  будет  дейс-
       твовать, если вы выберите "кнопку" Modify (Модификация).
            Если строки данных слишком велики и не умещаются в поле  ре-
       зультата, то они заканчиваются символом >. "Прокрутив" окно впра-
       во, вы можете просмотреть остаток строки.

       TDeb 3.0 #1-3               = 144 =
            Если вы выполняете отладку объектно-ориентированных программ
       на языке C++ или Паскале, то диалоговое окно Evaluate/Modify поз-
       воляет вам также вывести поля  объекта  или  элементы  реализации
       класса.  Для  каждого элемента,  который может использоваться при
       вычислении записи, можно использовать спецификатор формата.
            При выполнении трассировки метода или функции элементов Тур-
       бо отладчик  знает  об  области  действия  и  наличии   параметра
       Self/this. C  помощью  спецификаторов и квалификаторов формата вы
       можете вычислить параметр Self/this (данный).
            Турбо отладчик позволяет  также  вызывать  метод  или  функ-
       цию-элемент прямо из диалогового окна Evaluate/Modify (Вычисление
       /Модификация).  Для этого просто наберите имя реализации  метода,
       за которым следует точка,  а затем имя метода или функции-элемен-
       та с фактическими параметрами (либо пустые скобки,  если парамет-
       ров нет). При следующих описаниях:
            type
              Point = object
                X, Y    : Integer;
                Visible : Boolean;
                constructor Init(InitX, InitY : Integer);
                destructor Done; virtual;
                procedure  Show; virtual;
                procedure  Hide; virtual;
                procedure  MoveTo(NewX, NewY, : integer);
            end;
            var
               APoint : Point;


       вы могли  бы  ввести  в  окне вычисления Турбо отладчика любое из
       следующих выражений:
            --------------------------------------------------
            Выражение                      Результат
            --------------------------------------------------
            APoint.X                       5($5):Integer
            APoint                         (5,23,FALSE):Point
            APoint.MoveTo                  @6F4F:00BE
            APoint.MoveTo(10,10)           вызывается метод
                                           MoveTo
            APoint.Show()                  вызывается метод
                                           Show
            --------------------------------------------------
                 Замечание для программистов,  работающих на языке Си: В
            языке Си имеется средство,  которое называется "выражением с
            побочными эффектами".  Это мощное средство  может  оказаться
            очень  удобным,  но может в тоже время принести много неожи-
            данностей и путаницы.

       TDeb 3.0 #1-3               = 145 =
            Выражение с побочными эффектами при вычислении изменяет зна-
       чение одной или более переменных или областей памяти. Этот эффект
       имеют,  например, операции увеличения или уменьшения языка Си (++
       и --) и операции присваивания (=,  += и т.д.). Если в своей прог-
       рамме   вы   в   выражениях   Си  выполняете  функции  (например,
       mufunc(2)),  то ваша функция может иметь неожиданные побочные эф-
       фекты.
            Если вы не собираетесь модифицировать значения переменных, а
       просто хотите вычислить выражение,  содержащее некоторые из пере-
       менных программы,  то не используйте тех операций,  которые имеют
       побочные эффекты.  С другой стороны,  побочные эффекты могут дать
       быстрый и удобный способ изменения значения переменной или облас-
       ти памяти. Например, чтобы добавить 1 к значению вашей переменной


       с именем count, вычислите выражение Си count++.
            Вводя в  окне  Evaluate/Modify  вместо  переменных программы
       просто числа, вы можете также использовать его в качестве просто-
       го калькулятора.
                              Команда Add Watch...
       -----------------------------------------------------------------
            Команда Add  Watch  (Добавление выражения просмотра) выводит
       подсказку для ввода выражения просмотра, а затем (если вы нажмете
       клавишу Enter  или  выберите  "кнопку" OK) помещает выражение или
       переменную программы в список переменных,  выводимых в окне Watch
       (Просмотр).
            Если при  выборе  данной  команды курсор находится в области
       текста,то подсказка автоматически будет содержать переменную, на-
       ходящуюся  по месту расположения курсора (если она имеется). Если
       вы выбираете выражение (с помощью клавиши Ins),  то подсказка со-
       держит выбранное выражение.
                          Команда Function Returns
       -----------------------------------------------------------------
            По команде Function Returns (Результаты  функции)  выводится
       возвращаемое текущей  функцией значение.  Используйте эту команду
       только тогда,  когда функция собирается передать значение в вызы-
       вающую программу.
            Возвращаемое значение выводится в окне Inspector (Проверка),
       поэтому вы легко можете просмотреть значения,  представляющие со-
       бой указатели на сложные объекты данных.
            Данная команда  позволяет вам не переходить в окно CPU (ЦП),
       когда требуется просмотреть возвращаемое через регистры процессо-
       ра значение.  Кроме того, поскольку вы примерно знаете тип данных
       и формат возвращаемого значения,  их намного легче  использовать,
       чем шестнадцатиричный дамп.

       TDeb 3.0 #1-3               = 146 =
                 Ссылка на элементы данных в исходных файлах


       -----------------------------------------------------------------
            В Турбо отладчике имеется мощный механизм, освобождающий вас
       от необходимости каждый раз вводить имена  переменных  программы,
       которые вы хотите проверить.  Находясь в окне Module (Модуль), вы
       можете поместить курсор где-либо в имени переменной  и  использо-
       вать для создания окна проверки,  где будет  выведено  содержимое
       этой переменной, команду локального меню Inspect (Проверка).
            Вы можете также выбрать проверяемое выражение с помощью  на-
       жатия клавиши  Ins и использования клавиш управления курсором для
       его подсветки (выделения),  а затем выбрать команду Inspect (Про-
       верка).
                 Примечание: Полное  описание  использования окон Module
            (Модуль) содержится в Главе 8.

       TDeb 3.0 #1-3               = 147 =
                                Окно Watches
       -----------------------------------------------------------------
            Окно наблюдения Watches  (Просмотр)  позволяет  вам  вывести
       список переменных и выражений программы,  значения которых вы хо-
       тите отслеживать. Вы можете наблюдать значение простой переменной
       (например,  целой),  а  также сложных элементов данных (например,
       массивов).  Кроме того вы можете видеть значение вычисляемого вы-
       ражения, которое не ссылается непосредственно ни на какой адрес в
       памяти, например x * y + 4.
       г[*]===Watches========================================2==[ ][ ]=¬
       ¦wordcount               unsigned int 8 (Ox8)                   ^
       ¦wordcounts              unsigned int [10] {1,2,4,6,1,1,2,0,0,0}-
       ¦lettersinfo struct linfo [26] {(4,2),(1,1),(0,0),(1,1),(7,0),(.-
       ¦nlines*nwords----unsigned-int-24--(Ox22)------------------------
       ¦totalcharacters         unsigned long 88L (Ox42)               v
       L<------------------------------------------------------------>--


            Рис. 6.2 Окно Watches
            Для создания окна Watches выберите команду View¦Watches (Об-
       зор¦Просмотр).  В нем выводится список переменных, значения кото-
       рых  вы  хотите просматривать.  Для каждой записи слева выводится
       имя переменной или выражение и тип данных,  а справа -  значение.
       Составные  значения (такие,  как массивы или структуры) выводятся
       со значениями,  заключенными в фигурные скобки ({ }) для программ
       на языке Си и в круглые скобки - на Паскале. Если не хватает мес-
       та для того, чтобы вывести выражение целиком, то оно усекается.
            Когда вы  вводите просматриваемое выражение,  можно свободно
       использовать имена переменных,  которые еще не допустимы, так как
       находятся в функции,  которая еще не была вызвана.  Это позволяет
       вам задать выражение просмотра до того,  как оно станет активным.
       В Турбо отладчике это единственный случай, когда вы можете ввести
       выражение, которое нельзя немедленно вычислить.
                 Примечание: Полное описание области  действия выражений
            и  допустимости  переменной или параметра содержится в Главе
            9.
                 Предупреждение: Если вы ошибетесь при вводе имени пере-
            менной, эта ошибка обнаружена не будет, так как Турбо отлад-
            чик вычисляет выражения в окне  Watches  (Просмотр)  относи-
            тельно  области  действия,  того  места в программе,  где вы
            остановились.
            Если вы  не  используете  механизм  переопределения  области
       действия, о котором  рассказывается в Главе 9, Турбо отладчик вы-
       числяет вычисляет выражения в окне наблюдения Watches в соответс-
       твии с областью действия текущего адреса, на котором остановилась
       программа.  Следовательно, выражения в окне Watches имеют то зна-
       чение, которое соответствует текущему месту в программе. Если вы-

       TDeb 3.0 #1-3               = 148 =


       ражение просмотра содержит имя переменной,  которая недоступна  в
       текущей  области действия (например,  если это частная переменная
       другого модуля),  то значение выражения будет неопределено,  а не
       экране выведутся четыре вопросительных знака (????).
            При выполнении трассировки внутри метода объекта  вы  можете
       добавить в окно Watches параметр Self/this.
                         Локальное меню окна Watches
       -----------------------------------------------------------------
            Как и все другие локальные меню, локальное меню окна Watches
       (Просмотр) выводится  по нажатию оперативных клавиш Alt-F10. Если
       разрешено использовать сокращения с клавишей Ctrl,  для доступа к
       нужной  команде  нажмите одновременно клавишу Ctrl и первую букву
       команды.
                    ----------------¬
                    ¦ Watch...      ¦              Просмотр
                    ¦ Edit...       ¦              Редактирование
                    ¦ Remove        ¦              Удаление
                    ¦ Delete All    ¦              Удалить все
                    +---------------+
                    ¦ Inspect       ¦              Проверка
                    ¦ Change        ¦              Изменение
                    L----------------
                              Команда Watch...
       -----------------------------------------------------------------
            Команда Watch (Просмотр) выводит подсказку для  ввода  имени
       переменной  или  выражения,  чтобы  добавить  его  к  списку окна
       Watches (оно добавляется в конец списка).
                               Команда Edit...
       -----------------------------------------------------------------
            Команда Edit  (Редактирование) позволяет редактировать выра-
       жение в окне Watches (Просмотр).  Вы можете изменять то,  что там
       находится или вводить новое значение.
            Вы можете  также  вызвать  эту команду,  нажав клавишу Enter


       после позиционирования подсветки на выражении  просмотра, которое
       вы хотите изменить. Для помещения редактируемого выражения в окно
       просмотра нажмите Enter или выберите "кнопку" OK.
                               Команда Remove
       -----------------------------------------------------------------

       TDeb 3.0 #1-3               = 149 =
            Команда Remove  (Удаление)  удаляет  из окна Watches текущую
       выбранную запись.
                             Команда Delete All
       -----------------------------------------------------------------
            Команда Delete All (Удалить все)  удаляет  из  окна  Watches
       (Просмотр) все записи.  Эту команду полезно использовать, если вы
       переходите от одной области вашей программы к другой,  и перемен-
       ные, наблюдаемые ранее, вам больше не нужны.
                               Команда Inspect
       -----------------------------------------------------------------
            Команда Inspect (Проверка)  открывает  окно  проверки  (окно
       Inspector),  в котором выводится содержимое подсвеченной в данный
       момент в окне Watches записи.  Если эта запись представляет собой
       сложный объект (массив,  структуру или запись),  то это позволяет
       вам просмотреть все ее элементы, а не только те, которые выводят-
       ся  в окне Watches (Просмотр).  (Более подробно об окне Inspector
       рассказывается далее.)
                               Команда Change
       -----------------------------------------------------------------
             Команда Change (Изменение) изменяет значение подсвеченной в
       данный момент записи в окне Watches (Просмотр) на значение, кото-
       рое  вы вводите в ответ на подсказку.  Если это допускается в ис-
       пользуемом языке, Турбо отладчик выполняет все необходимые преоб-
       разования типов,  как это делалось бы в соответствующем операторе
       присваивания (= или :=).  Более подробно об операции присваивания


       и преобразовании (приведении) типов рассказывается в Главе 9.
                               Окна Inspector
       -----------------------------------------------------------------
            В окне Inspector (Проверка) выводятся соответствующим  обра-
       зом  ( в зависимости от типа проверяемых данных) данные программы.
       Для скалярных значений (например, char или int), указателей (char
       *  в  Cи,  ^  в Паскале),  массивов (long x4[],  array [1..10] of
       words),  функций,  структур, записей, объединений и множеств окна
       проверки ведут себя по-разному.
            В окне Inspector выводится список элементов, входящих в исс-
       ледуемый объект данных.  В заголовке окна выводится тип проверяе-
       мых данных и их имя, если оно имеется.
            Первый элемент  в  окне  Inspector всегда представляет собой
       адрес памяти проверяемого  элемента  данных,  выраженный  в  виде
       "сегмент:смещение" (если  он  не  оптимизирован к регистру или не
       представляет собой константу, например, 3).

       TDeb 3.0 #1-3               = 150 =
            Чтобы анализировать  содержимое  окна Inspector (Просмотр) в
       виде непосредственных байт данных,  будучи в окне Inspector выбе-
       рите команду View¦Dump (Обзор¦Дамп).  При этом появится окно Dump
       (Дамп) с областью данных, позиционированной на данные, выведенные
       в  окне Inspector.  Вы можете вернуться в окно Inspector,  выбрав
       окно с помощью команды Window¦Close  (Окно¦Закрытие)  или  клавиш
       Alt-F3, либо закрыв окно с помощью кнопки "мыши".
            В следующем  разделе  описываются  различные окна Inspector,
       которые могут выводиться для каждого из поддерживаемых Турбо  от-
       ладчиком языков (Си,  Паскаля или Ассемблера). Формат информации,
       выводимой в окнах проверки,  зависит от используемого языка. Эле-
       менты данных и из значения всегда выводятся в формате,  аналогич-


       ном тому, как они описываются в исходном файле.
            Учтите, что для вывода различных окон Inspector вам не нужно
       делать ничего особенного.  Они выводятся автоматически, в зависи-
       мости от типа проверяемых вами данных.

       TDeb 3.0 #1-3               = 151 =
                           Окна Inspector языка Си
       -----------------------------------------------------------------
            Далее следует описание содержимого окон.
                             Скалярные величины
       -----------------------------------------------------------------
            Скалярное окно Inspector (Проверка)  позволяет  вам  увидеть
       значение простых элементов данных, таких, как:
               char x = 4;
               unsigned long y = 123456L;
            В этих окнах Inspector содержится только одна строка  инфор-
       мации,  следующая за верхней строкой, где описывается адрес пере-
       менной.  Слева выводится тип скалярной переменной (char, unsigned
       long  и т.д.),  а справа - ее значение в данный момент.  Значение
       может выводиться в десятичном, шестнадцатиричном или обоих видах.
       Оно обычно выводится сначала в десятичном виде, а шестнадцатирич-
       ное значение указывается в скобках (с помощью стандартного  шест-
       надцатиричного  префикса Си Ox).  Для изменения вида вывода можно
       использовать программу TDINST.
           Если выводится переменная символьного типа (char), то показы-
       вается  также  ее символьный эквивалент.  Если данное значение не
       имеет эквивалента в виде печатаемого символа,  то для вывода сим-
       вольного значения используйте обратную косую черту (\),  за кото-
       рой следует шестнадцатиричное значение. Символьное значение выво-
       дится перед десятичным или шестнадцатиричным значением.
                     г[*]=Inspecting wordcount====3=[ ][ ]=¬
                     ¦05A51:AA00                           ¦
                     ¦unsigned-int--------2--(Ox02)--------¦


                     L<----------------------------------->-
            Рис. 6. 3 Cкалярное окно Inspector языка Си
                                  Указатели
       -----------------------------------------------------------------
            Окно Inspector (Проверка) для указателей показывает значение
       элементов  данных,  которые  ссылаются на другие элементы данных,
       например:
               char *p   = "abs";
               int  *ip  = 0;
               int  **ip = &ip;
            Обычно окно Inspector для указателей  содержит  только  одну
       строку информации, следующую за верхней строкой, в которой описы-
       вается адрес переменной. Слева выводится [0], показывающий первый

       TDeb 3.0 #1-3               = 152 =
       элемент массива.  Справа выводится значение элемента,  на который
       делается ссылка. Если значение представляет собой сложный элемент
       данных (например,  структуру или массив), то выводится максимально
       возможное число элементов данных, а значения заключаются в фигур-
       ные скобки ({ и }).
            Если указатель типа char и ссылается на завершающуюся  нуле-
       вым  символом символьную строку,  то появляется больше информации
       (показывается значение  каждого  элемента  символьного  массива).
       Слева  от  каждой  строки указывается индекс массива ([1],  [2] и
       т.д.),  а справа выводится значение (так же, как в скалярном окне
       Inspector).  В  этом  случае в верхней строке выводится также вся
       строка,  а также адрес переменной и адрес строки,  на которую она
       ссылается.
                    г[*]=Inspecting bufp=======3===[ ][ ]====¬
                    ¦register--ds:0874-[TCDEMO-buffer]-------^
                    ¦[0]                      'n' 110 (Ox88) -
                    ¦[1]                      '0' 111 (Ox6F) -
                    ¦[2]                      'w' 119 (Ox77) -
                    ¦[3]                     '\x00' 0 (Ox00) v


                    ¦<-------------------------------------->¦
                    ¦char *                                  ¦
                    L========================================-
            Рис. 6. 4 Окно Inspector для указателей (для языка Си)
            Если вы откроете локальное окно Inspector (Проверка)  и  ис-
       пользуете команду локального меню Range (Диапазон),  то также по-
       лучите несколько строк. Этот метод важен для программистов, рабо-
       тающих на языке Си,  которые используют указатели, ссылающиеся на
       массивы, как отдельные элементы. Например, если в вашей программе
       содержится:
            int array[10];
            int *arrayp = array;
       и вы хотите просмотреть, на что ссылается arrayp, используйте ло-
       кальную команду Range (Диапазон), задав начальный индекс 0 и диа-
       пазон 10.  Если вы этого не сделаете,  то выведется только первый
       элемент массива.
                           Структуры и объединения
       -----------------------------------------------------------------
            В окнах Inspector (Проверка) для структуры и объединения вы-
       водятся значения элементов структуры и объединения, например:
               struct date {
                       int year;
                       char mounth;
                       char day;
               }       today;

       TDeb 3.0 #1-3               = 153 =
               union {
                       int small;
                       long large;
               }       holder;
            Ниже области, где выводятся значения элементов, в этих окнах
       проверки имеется другая область,  в которой выводится тип элемен-
       та, подсвеченного в первой области.
                         г[*]=Inspecting letterinfo[n]=3=[ ][ ]¬
                         ¦$7937:0852---------------------------^
                         ¦count                       2 (Ox2)  -
                         ¦firstletter                 2 (Ox2)  -


                         ¦<----------------------------------->v
                         ¦struct linfo                         ¦
                         L=====================================-
            Рис. 6.5  Окно  Inspector для структуры или объединения (для
       языка Си)
            Структуры и объединения выводятся в окне проверки одинаково.
       Заголовок окна проверки указывает,  просматриваете  вы  структуру
       или  объединение.  После  адреса в этих окнах проверки содержится
       столько записей,  сколько элементов имеется в структуре или  объ-
       единении.  В  каждой  записи  слева показывается имя элемента,  а
       справа - его значение,  выводимое в формате, соответствующем фор-
       мату данных языка Си.

       TDeb 3.0 #1-3               = 154 =
                                   Массивы
       -----------------------------------------------------------------
            Окно Inspector (Проверка) для массивов  показывает  значение
       массивов элементов данных, таких, как:
               long    threed[3][4][5];
               char    message[] = "eat this words";
            Каждому элементу массива в окне соответствует одна строка. В
       левой  части  каждой такой строки указывается индекс элемента,  а
       справа - значение,  на которое он указывает.  Если  это  значение
       представляет собой сложный элемент данных,  например,  массив или
       структуру,  то выводится максимально возможный объем  информации,
       причем значения заключаются в фигурные скобки ({}).
                  г[*]=Inspecting letterinfo=======3=[ ][ ]¬
                  ¦$7682:0852------------------------------^
                  ¦[0]                              {2,2}  -
                  ¦[1]                              {2,0}  -
                  ¦[2]                              {2,0}  -
                  ¦[3]                              {1,1}  -
                  ¦[4]                              {1,0}  -


                  ¦[5]                              {1,0}  -
                  ¦[6]                              {1,0}  v
                  ¦<-------------------------------------->¦
                  ¦struct linfo [26]                       ¦
                  L========================================-
            Рис. 6. 6 Окно Inspector для массивов (для языка Си)

       TDeb 3.0 #1-3               = 155 =
                                   Функции
       -----------------------------------------------------------------
            В окне проверки для функции показан каждый параметр, с кото-
       рым вызывается функция.  Параметры выводятся в верхней части окна
       под адресом памяти.
                  г[*]=Inspecting analyzewords=3=[ ][ ]=====¬
                  ¦071E9:02DD-------------------------------¦
                  ¦char *bufp                               ¦
                  ¦<--------------------------------------->¦
                  ¦ long ()                                 ¦
                  L=========================================-
            Рис. 6.7 Окно Inspector для функции (для языка Си)
            Здесь также  выводится информация о параметрах вызова,  типе
       возвращаемых данных и соглашениях по вызову для функции. В нижней
       области выводится возвращаемый функцией тип данных.
                      Окна проверки данных для Паскаля
       -----------------------------------------------------------------
            Далее следует описание содержимого окон.
                             Скалярные величины
       -----------------------------------------------------------------
            В окнах Inspector (Проверка) для скалярных значений выводят-
       ся значения простых элементов данных, например:
               var
                       X : integer;
                       Y : longint;
            В этих окнах Inspector содержится только одна строка  инфор-
       мации,  следующая за верхней строкой, где описывается адрес пере-


       менной.  Слева выводится тип скалярной  переменной  (byte,  word,
       integer,  longint и т.д.), а справа - ее текущее значение. Значе-
       ние может выводиться в десятичном,  шестнадцатиричном  или  обоих
       видах. Оно обычно выводится сначала в десятичном виде, а шестнад-
       цатиричное значение указывается в скобках (с помощью стандартного
       шестнадцатиричного префикса Турбо Паскаля $).  Для изменения вида
       вывода можно использовать программу TDINST.
           Если выводится переменная типа byte или shortint,  то показы-
       вается  также  ее символьный эквивалент.  Если данное значение не
       имеет эквивалента в виде печатаемого символа,  то для вывода сим-
       вольного значения используйте символ #,  за которой следует шест-
       надцатиричное значение. Символьное значение выводится перед деся-
       тичным или шестнадцатиричным значением.

       TDeb 3.0 #1-3               = 156 =
                     г[*]=Inspecting WordLen====3=[ ][ ]=¬
                     ¦$595A:3EF0                         ¦
                     ¦WORD-------------------2--($2)-----¦
                     L<-------------------------------->--
            Рис. 6.8 Cкалярное окно Inspector (для Паскаля)

       TDeb 3.0 #1-3               = 157 =
                                  Указатели
       -----------------------------------------------------------------
            Окно Inspector (Проверка) для указателей показывает значение
       элементов  данных,  которые  ссылаются на другие элементы данных,
       например:
               var
                 IP : ^integer;
                 LP : ^^pointer;
            Обычно окно Inspector для указателей  содержит  только  одну
       строку информации, следующую за верхней строкой, в которой описы-
       вается адрес переменной. Слева выводится [1], показывающее первый
       элемент массива.  Справа выводится значение элемента,  на который
       делается ссылка.


Если значение представляет собой сложный элемент
       данных  (например,  структуру или массив),  то выводится максимум
       возможных данных, а значения заключаются в круглые скобки.
            Вы можете также получить несколько строк, если откроете окно
       Inspector и дадите локальную команду Range (Диапазон), задав зна-
       чение счетчика > 1.
                      г[*]=Inspecting Temp==3===[ ][ ]¬
                      ¦$8810:3EF4  : 8C10:0000        ¦
                      ¦PARM------------------0003:7500¦
                      ¦NEXT                  5200:0000¦
                      ¦<----------------------------->¦
                      ¦PARMRECPTR                     ¦
                      L===============================-
            Рис. 6.9 Окно Inspector для указателей (для языка Паскаль)

       TDeb 3.0 #1-3               = 158 =
                                   Массивы
       -----------------------------------------------------------------
            Окно Inspector  (Проверка)  для массивов показывает значение
       массивов элементов данных, таких, как:
               var
                 A : array[1..10,1..20] of integer;
                 B : array[1..50] of boolean;
            Каждому элементу массива в окне соответствует одна строка. В
       левой  части  каждой такой строки указывается индекс элемента,  а
       справа - его текущее значение. Если это значение представляет со-
       бой сложный элемент данных, например, массив или запись, то выво-
       дится максимально возможный  объем  информации,  причем  значения
       заключаются в круглые скобки.
                  г[*]=Inspecting LetterTable==3==[ ][ ]===¬
                  ¦$87D6:0058------------------------------¦
                  ¦['A']                            (2,2)  ¦
                  ¦['B']                            (2,0)  ¦
                  ¦['C']                            (2,0)  ¦
                  ¦['D']                            (2,2)  ¦


                  ¦['D']                            (2,0)  ¦
                  ¦['E']                            (2,0)  ¦
                  ¦['F']                            (2,0)  ¦
                  ¦<-------------------------------------->¦
                  ¦array ['A'..'Z'] of record LINFOREC     ¦
                  L========================================-
            Рис. 6. 10 Окно Inspector для массивов (для языка Паскаль)
            Для проверки части любого массива можно использовать команду
       Range (Диапазон).  Это полезно использовать, если массив содержит
       очень много элементов, а вы хотите просмотреть, например, середи-
       ну массива.

       TDeb 3.0 #1-3               = 159 =
                                   Записи
       -----------------------------------------------------------------
            В окнах Inspector (Проверка) для записи в программе на  Пас-
       кале выводятся значения полей записи, например:
               record
                       year : integer;
                       month : 1..12;
                       day : 1..31;
               end
            Ниже области,  где  выводятся  значения полей,  в этих окнах
       проверки имеется другая область,  в которой выводится тип  данных
       поля, подсвеченного в первой (верхней) области.
                  г[*]=Inspecting LetterTable['A']=4=[ ][ ]¬
                  ¦$87D6:0058------------------------------¦
                  ¦COUNT                         2  ($2)   ¦
                  ¦FIRSTLETTER                   2  ($2)   ¦
                  ¦<-------------------------------------->¦
                  ¦LINFOREC                                ¦
                  L========================================-
            Рис. 6.11 Окно Inspector для записи (для языка Паскаль)
                             Функции и процедуры
       -----------------------------------------------------------------
            В окне Inspector для процедуры или функции в верхней области


       выводится информация о параметрах вызова.  Эти окна имеют  вторую
       область,  в  которой  подпрограмма идентифицируется как процедура
       или функция,  а также определяется тип данных, возвращаемых функ-
       цией.
                    г[*]=Inspecting ProcessLine==3=[ ][ ]¬
                    ¦$8340:0486--------------------------¦
                    ¦S : BUFFERSTR                       ¦
                    ¦<---------------------------------->¦
                    ¦PROCEDURE                           ¦
                    L====================================-
            Рис. 6.12 Окно Inspector для процедуры (для языка Паскаль)

       TDeb 3.0 #1-3               = 160 =
                     Окна проверки данных для Ассемблера
       -----------------------------------------------------------------
            Далее следует описание содержимого окон.
                             Скалярные величины
       -----------------------------------------------------------------
            В окнах Inspector (Проверка) для скалярных значений выводят-
       ся значения простых элементов данных, например:
            VAR1    DW      99
            MAGIC   DT      4.608
            BIGNUM  DD      123456
            В этих  окнах Inspector содержится только одна строка инфор-
       мации,  следующая за верхней строкой, где описывается адрес пере-
       менной.  Слева  выводится  тип скалярной переменной (byte,  word,
       dword,  qword и т.д.),  а справа - ее текущее значение.  Значение
       может выводиться в десятичном, шестнадцатиричном или обоих видах.
       Оно обычно выводится сначала в десятичном виде, а шестнадцатирич-
       ное  значение указывается в скобках (с помощью стандартного шест-
       надцатиричного префикса Турбо Паскаля $).  Для изменения вида вы-
       вода можно использовать программу TDINST.
           Если выводится переменная типа byte или shortint,  то показы-
       вается также ее символьный эквивалент.  Если данное  значение  не


       имеет эквивалента в виде печатаемого символа,  то для вывода сим-
       вольного значения используйте символ #,  за которой следует шест-
        надцатиричное значение. Символьное значение выводится перед деся-
       тичным или шестнадцатиричным значением.
                    г[*]=Inspecting count====3======[ ][ ]¬
                    ¦$72ED:0019---------------------------¦
                    ¦dword                    18    (12h) ¦
                    L<----------------------------------->-
            Рис. 6.13 Cкалярное окно Inspector (для Ассемблера)

       TDeb 3.0 #1-3               = 161 =
                                  Указатели
       -----------------------------------------------------------------
            Окно Inspector (Проверка) для указателей показывает значение
       элементов данных,  которые ссылаются на другие  элементы  данных,
       например:
             X       DW      0
             XPTR    DW      X
             FARPTR  DD      X
            Обычно окно  Inspector  для  указателей содержит только одну
       строку информации, следующую за верхней строкой, в которой описы-
       вается адрес переменной. Слева выводится значение [0], показываю-
       щее первый элемент массива.  Справа выводится значение  элемента,
       на  который  делается  ссылка.  Если  значение представляет собой
       сложный элемент данных (например, структуру или массив), то выво-
       дится максимально возможное число элементов  данных,  а  значения
       заключаются в квадратные скобки.
            Если указатель представляет собой указатель байтового типа и
       указывает на завершающуюся нулем символьную строку,  то выводится
       более подробная информация, показывающая значение каждого элемен-
       та в символьном массиве.  Слева на каждой строке выводится индекс
       массива ([1],  [2] и т.д.),  а справа - значение (как в скалярном
       окне Inspector). В этом случае вся строка выводится также в верх-


       ней строке окна, наряду с адресом переменной и адресом строки, на
       которую она указывает.
            Вы можете также получить несколько строк, если откроете окно
       Inspector и дадите локальную команду Range (Диапазон), задав зна-
       чение счетчика > 1.
                     г[*]=Inspecting textptr===3==[ ][ ]¬
                     ¦$72ED:0017-ds:000A-[#test#text]---^
                     ¦[0]               'H'  72 (48h)   -
                     ¦[1]               'e' 101 (65h)   -
                     ¦[2]               'l' 108 (6Ch)   -
                     ¦[3]               'l' 108 (6Ch)   -
                     ¦[4]               'o' 111 (6Fh)   -
                     ¦[5]               ' '  32 (20h)   -
                     ¦[6]               'w'  87 (57h)   -
                     ¦[7]               'o' 111 (6Fh)   -
                     ¦[8]               'r' 114 (72h)   -
                     ¦[9]               'l' 108 (6Ch)   -
                     ¦[10]              'd' 100 (6Ch)   -
                     ¦[11]            '\x0D' 13 (0Dh)   -
                     ¦[12]            '\x0A' 10 (0Ah)   v
                     ¦<-------------------------------->¦
                     ¦byte ptr                          ¦
                     L==================================-
            Рис. 6.14 Окно Inspector для указателей (для Ассемблера)

       TDeb 3.0 #1-3               = 162 =
                                   Массивы
       -----------------------------------------------------------------
            Окно Inspector  (Проверка)  для массивов показывает значение
       массивов элементов данных, таких, как:
            WARRAY  DW      10 DUP (0)
            MSG     DB      "Greetings",0
            Каждому элементу массива в окне соответствует одна строка. В
       левой части каждой такой строки указывается  индекс  элемента,  а
       справа - его текущее значение. Если это значение представляет со-


       бой сложный элемент данных,  например, STRUC, то выводится макси-
       мально возможный объем информации,  причем значения заключаются в
       квадратные скобки.
            Для проверки части массива вы можете  использовать локальную
       команду Range (Диапазон).  Это полезно использовать,  если массив
       содержит множество элементов,  а вы хотите просмотреть  что-то  в
       середине массива.
                       г[*]=Inspecting Text===3==[ ][ ]¬
                       ¦$72ED:000A---------------------^
                       ¦[0]             'h'  72 (46h)  -
                       ¦[1]             'e' 101 (65h)  -
                       ¦[2]             'l' 108 (6Ch)  -
                       ¦[3]             'l' 108 (6Ch)  -
                       ¦[4]             'o' 111 (6Fh)  -
                       ¦[5]             ','  44 (6Ch)  v
                       ¦<----------------------------->¦
                       ¦byte [12]                      ¦
                       L===============================-
            Рис. 6.15 Окно Inspector для массивов (для Ассемблера)
                           Структуры и объединения
       -----------------------------------------------------------------
            В окнах Inspector (Проверка) для структуры или объединения в
       программе   на  Ассемблере  выводятся  значения  полей  структуры
       (STRUC) или объединения (UNION), например:
             X       STRUC
             MEM1    DB      ?
             MEM2    DD      ?
             X       ENDS
             ANX     X       <1,ANX>
             Y       UNION
             ASBYTES DB      10 DUP (?)
             ASFLT   DT      ?
             Y       ENDS
             AY      Y       <?,1.0>

       TDeb 3.0 #1-3               = 163 =
            Ниже области,  где  выводятся  значения полей,  в этих окнах
       проверки имеется другая область,  в которой выводится тип  данных
       поля, подсвеченного в первой (верхней) области.


                       г[*]=Inspecting Names==3=[ ][ ]¬
                       ¦$72ED:001D--------------------¦
                       ¦firstname   "Carleton       " ¦
                       ¦lastname    "Whitehall      " ¦
                       ¦age             '#'  35 (23h) ¦
                       ¦sex             'M'  77 (4Dh) ¦
                       ¦<---------------------------->¦
                       ¦struc namedata                ¦
                       L==============================-
            Рис. 6. 16 Окно Inspector для структуры (для Ассемблера)

       TDeb 3.0 #1-3               = 164 =
                        Локальное меню окна Inspector
       -----------------------------------------------------------------
            Команды локального меню окна Inspector (Проверка) показывают
       реальные  возможности  этого окна.  Путем выбора данных команд вы
       можете, например, создавать другое окно проверки, позволяющее уг-
       лубляться в структуры данных. Другие команды этого меню позволяют
       вам проверить диапазон значений и проанализировать новую перемен-
       ную.
                                    --------------------¬
              Диапазон              ¦ Range...          ¦
              Изменение             ¦ Change...         ¦
                                    +-------------------+
              Проверка              ¦ Inspect           ¦
              Спуск                 ¦ Descend           ¦
              Новое выражение       ¦ New Expression... ¦
              Преобразование типа   ¦ Type cast...      ¦
                                    L--------------------
                              Команда Range...
       -----------------------------------------------------------------
            Команда Range (Диапазон) задает начальный  элемент  и  число
       элементов,  которые  вы  хотите вывести на экран.  Данную команду
       можно использовать при просмотре части массива  (подмножества его


       элементов).
            Если у вас есть длинный массив, и вы хотите просмотреть нес-
       колько элементов из его середины,  то используйте эту команду для
       открытия окна проверки с тем индексом массива,  который соответс-
       твует нужным элементам.
            Эта команда особенно полезна в языке Си,  где часто описыва-
       ется  указатель на элемент данных типа "char *p" (и при этом под-
       разумевалось, что p указывает на массив символов, а не на отдель-
       ный символ).
                              Команда Change...
       -----------------------------------------------------------------
            Команда Change (Изменение) изменяет значение текущего (подс-
       веченного) элемента на то значение, которое вы введете в ответ на
       подсказку.  Если данный язык это позволяет, Турбо отладчик выпол-
       няет  необходимое преобразование типов (это делается точно также,
       как если бы для изменения значения переменной использовался  опе-
       ратор  присваивания).  Более  подробно об операции присваивания и
       приведении типов рассказывается в Главе 9.
                               Команда Inspect
       -----------------------------------------------------------------
            По команде Inspect (Проверка) открывается новое окно провер-

       TDeb 3.0 #1-3               = 165 =
       ки (окно Inspector),  в  котором  выводится  содержимое  текущего
       (подсвеченного) элемента.  Эту команду полезно использовать, если
       элемент в окне Inspector содержит в себе другие элементы (являет-
       ся  структурой  или массивом),  и вы хотите просмотреть каждый из
       этих элементов.
            Если в текущем окне проверки выводится функция, то по коман-
       де Inspect выведется исходный код этой функции.
            Данную команду  можно  вызвать,  установив  подсветку на тот
       элемент, который вы хотите просмотреть, и нажав клавишу Enter.
            Вернуться к предыдущему окну Inspector  (Проверка)  можно  с


       помощью  клавиши  Esc ( по которой будет закрыто текущее окно про-
       верки). Если вы завершили просмотр данных структуры и хотите уда-
       лить все окна проверки, то используйте команду Window¦Close (Окно
       ¦Закрытие) или ее сокращение, клавиши Alt-F3.
                               Команда Descend
       -----------------------------------------------------------------
            Команда Descend  (Спуск) работает аналогично команде локаль-
       ного меню Inspect (Проверка), но вместо открытия нового окна про-
       верки  для вывода содержимого подсвеченного элемента она помещает
       новый элемент в текущее окно проверки.  Таким образом, данная ко-
       манда как бы представляет собой гибрид команд New Expression (Но-
       вое выражение) и Inspect (Проверка).
            Когда вы  углубляетесь  в структуру данных,  то вы не можете
       вернуться назад к предыдущей нерасширенной структуре  данных. Эту
       команду  нужно  использовать  при  работе со сложными структурами
       данных или длинным связанным списком,  если вам при этом не нужно
       возвращаться на предыдущий уровень данных. Это позволит уменьшить
       число выводимых на экран окон проверки.
                          Команда New Expression...
       -----------------------------------------------------------------
            Команда New Expression (Новое выражение) выводит подсказку с
       запросом имени переменной или выражения, которые вы хотите прове-
       рить. Это позволяет вам проверять другие данные без вывода на эк-
       ран дополнительных окон проверки.  Используйте эту команду,  если
       вас больше не интересуют данные в текущем окне проверки.
            Окно Inspector для объектов Паскаля и классов С++ отличаются
       от обычных окон проверки. Описание окон проверки для типов объек-
       тов и классов содержится в Главе 10.
                            Команда Type Cast...
       -----------------------------------------------------------------


            Команда Type Cast ( Приведение типа) позволяет вам задать для
       проверяемого  элемента  другой тип данных (Byte,  Word,  Integer,

       TDeb 3.0 #1-3               = 166 =
       указатель на Char,  gh2fp, lh2fp). Это полезно использовать, если
       окно  Inspector содержит идентификатор,  для которого отсутствует
       информация о типе,  а также для явного задания типов нетипизован-
       ных указателей.
                 Примечание: О том как использовать типы gh2fp  и  lh2fp
            рассказывается в Главе 17.

       TDeb 3.0 #1-3               = 167 =
                           Глава 7. Точки останова
       -----------------------------------------------------------------
            В Турбо  отладчике  понятие  точек останова используется для
       описания таких функций отладчика,  как точки останова, точки наб-
       людения и точки трассировки.
            Обычно точки останова,  точки наблюдения и точки трассировки
       определяют  следующим образом.  Точка останова представляет собой
       то место в программе,  в котором вы хотите приостановить выполне-
       ние,  чтобы  проверить  переменные  программы и структуры данных.
       Точки наблюдения приводят к тому, что ваша программа будет выпол-
       няться по шагам (по одной инструкции исходного кода), пока наблю-
       даемое значение определенные переменных программы не  примет  ис-
       тинного значения (true).  Точки трассировки приводят к пошаговому
       (по одной инструкции или строке исходного кода) выполнению  прог-
       раммы,  позволяя  наблюдать за изменением определенных переменных
       программы или выражений со ссылками на память.
            В Турбо отладчике эти три концепции унифицируются, а понятие
       точки останова включает в себя три следующих элемента:
               - место в программе (адрес),  где находится точка остано-
                 ва;
               - условие, при котором она срабатывает;
               - что происходит, когда срабатывает точка останова (дейс-


                 твие).
            Адрес может представлять собой отдельный адрес  в  программе
       или  быть глобальным (при этом останов может происходить на любой
       строке исходного кода или инструкции программы).
            Под условиями могут подразумеваться следующие условия, когда
       происходит останов:
               - всегда;
               - когда выражение принимает истинное значение;
               - когда объекты данных изменяют свое значение.
            Можно также задавать "счетчик проходов", который определяет,
       чтобы прежде чем сработает точка останова,  "условие" должно при-
       нимать истинное значение определенное число раз.
            При достижении точки останова  может  выполняться  следующее
       действие:
               - остановка выполнения программы (точка останова);
               - регистрация значения выражения;

       TDeb 3.0 #1-3               = 168 =
               - выполнение выражения (вставка кода);
               - разрешение группы точек останова;
               - запрещение группы точек останова.
            В данной главе мы покажем вам,  что точки останова Турбо от-
       ладчика  являются  более  гибким и мощным средством,  чем обычные
       точки останова, точки наблюдения или точки трассировки. Вы узнае-
       те об окне Breakpoints (Точки останова) и окне Log (Регистрация),
       а также о том, как устанавливать простые точки останова, условные
       точки останова для остановки по условию и точки останова, в кото-
       рых  регистрируется значение переменных вашей программы. Наконец,
       мы покажем, как можно задавать точки останова, позволяющие наблю-
       дать точный момент, когда переменная, объект данных или выражение
       программы изменяет свое значение.
            Во многих  случаях  вам понадобиться задавать только простые
       точки останова.  При этом при достижении программой одного из та-
       ких  адресов  она останавливается.  Вы можете задать или отменить


       точку останова в любом месте программы.  Для этого курсор  просто
       помещается на строку исходного кода и нажимается клавиша F2. Мож-
       но также задать точку останова на любой  строке  машинного  кода,
       для  чего  клавиша F2 нажимается после того,  как вы укажете инс-
       трукцию в  области  Code  (Код) окна CPU (Центральный процессор).
            Если у  вас есть "мышь",  просто нажмите кнопку в левых двух
       позициях той строки,  на которой вы хотите установить или удалить
       точку останова. (Если вы находитесь в правильной позиции, в инди-
       каторе позиции появляется звездочка (*).)
            Имеются два способа,  с помощью которых вы  можете  получить
       доступ к диалоговому окну для установки и настройки точки остано-
       ва. Меню Breakpoints предлагает вам быстрый способ установки точ-
       ки останова,  кроме  того в этом окне можно просмотреть уже уста-
       новленные точки останова и получить доступ  к  диалоговым  окнам,
       управляющим установкой параметров точек останова.

       TDeb 3.0 #1-3               = 169 =
                              Меню Breakpoints
       -----------------------------------------------------------------
            Доступ к глобальному меню Breakpoints (Точки останова) можно
       получить в любой момент с помощью оперативных клавиш Alt-B.
                         г[*]=Breakpoints============¬
                         ¦-Toggle------------------F2¦
                         ¦ At...               Alt-F2¦
                         ¦ Changed memory global...  ¦
                         ¦ Expression true global... ¦
                         ¦ Hardware breakpoints...   ¦
                         ¦ Delete All                ¦
                         L===========================-
                               Команда Toggle
       -----------------------------------------------------------------
            Команда Toggle  (Переключение)  устанавливает  или  отменяет


       точки останова по текущему (подсвеченная строка)  адресу  в  окне
       Module (Модуль) или области Code (Код) окна CPU (Центральный про-
       цессор). Можно также воспользоваться оперативной клавишей F2.
                                Команда At...
       -----------------------------------------------------------------
            Команда At  (На...) устанавливает точку останова по конкрет-
       ному адресу в программе. Этот адрес нужно ввести в ответ на выво-
       димую  подсказку.  Сокращенным  вариантом данной команды являются
       оперативные клавиши Alt-F2.  По данной команде выводится диалого-
       вое окно, в котором устанавливаются параметры точки останова.
                 Примечание: Описание   диалогового   окна    Breakpoint
            Options (Параметры точки останова) приводится ниже.
                      Команда Changed Memory Global...
       -----------------------------------------------------------------
           Команда Changed  Memory  Global  (Измененная  глобальная  па-
       мять) устанавливает точку останова,  которая  срабатывает,  когда
       данная область памяти изменяет свое значение.
                 Примечание: Более подробная информация содержится далее
            в описании команды Changed Memory (Измененная память) в раз-
            деле "Локальное меню окна Breakpoints".
                      Команда Expression True Global...
       -----------------------------------------------------------------
            Команда Expression True Global (Истинное значение глобально-

       TDeb 3.0 #1-3               = 170 =
       го выражения) устанавливает точку останова,  которая срабатывает,
       когда заданное вами выражение примет истинное значение.
                 Примечание: Более подробная информация содержится далее
            в  описании команды Condition Expression True (Истинное зна-
            чение условного выражения) в разделе  "Локальное  меню  окна


            Breakpoints".
                       Команда Hardware Breakpoint...
       -----------------------------------------------------------------
            Команда Hardware Breakpoint (Аппаратная точка останова)  ис-
       пользуется  для  доступа  к диалоговому окну Hardware Breakpoints
       Options (Параметры аппаратной отладки). Для того, чтобы можно бы-
       ло использовать средства аппаратной отладки,  нужна соответствую-
       щая настройка системы.  Кроме того,  вы должны иметь  специальную
       плату аппаратной отладки.
            Информация по интерфейсу со  средствами  аппаратной  отладки
       приведена в разделе "Аппаратная отладка".
                             Команда Delete All
       -----------------------------------------------------------------
            Команда Delete All (Удалить все) отменяет  все установленные
       точки останова.

       TDeb 3.0 #1-3               = 171 =
                              Окно Breakpoints
       -----------------------------------------------------------------
            Создать окно Breakpoints (Точки останова)  можно  с  помощью
       команды  View¦Breakpoints  (Обзор¦Точки останова) основного меню.
       Это дает вам способ выбора и установки условий,  при которых сра-
       батывает точка останова. Это окно можно использовать для добавле-
       ния новых точек останова,  отмены (удаления) точек останова и из-
       менения существующих точек останова.
             г[*]=Breakpoints========================3===[ ][ ]=¬
             ¦ TPDEMO.220 ¦ Breakpoint                          ¦
             ¦ TPDEMO.225 ¦ Always                              ¦
             ¦-TPDEMO.226-¦ Enabled                             ¦
             ¦            ¦                                     ¦
             ¦            ¦                                     ¦
             ¦            ¦                                     ¦
             L<----------->=====================================-


            Рис. 7.1 Окно Breakpoints
            В окне Breakpoints (Точки останова) имеется две  области.  В
       левой  области  ( список точек останова) показан список всех адре-
       сов,  где установлены точки останова. В правой области (подробная
       информация  о точках останова) показаны подробные данные по теку-
       щим (подсвеченным в левой области) точкам останова.
            Локальное меню окна Breakpoints,  которое можно получить  по
       нажатию клавиш Alt-F10, имеется только в области списка точек ос-
       танова. Если разрешено использование сокращений с  клавишей Ctrl,
       то нажатие  этой  клавиши с первой буквой команды позволяет полу-
       чить непосредственный доступ к команде.
                       Локальное меню окна Breakpoints
       -----------------------------------------------------------------
            Команды данного меню позволяют вам добавлять новые точки ос-
       танова,  отменять существующие или  изменять  характер  поведения
       имеющихся точек останова.
                    ----------------------¬
                    ¦ Set Options...      ¦  Установить параметры
                    ¦ Add...              ¦  Добавить
                    ¦ Remove              ¦  Удалить
                    ¦ Delete all          ¦  Удалить все
                    ¦ Inspect             ¦  Проверить
                    ¦ Group...            ¦  Группа
                    L----------------------
                            Команда Set Option...
       -----------------------------------------------------------------

       TDeb 3.0 #1-3               = 172 =
            Команда Set Option (Установить параметры) открывает диалого-
       вое окно, в котором содержится два набора многопозиционных перек-
       лючателей,  одно поле ввода и одно поле проверки. В этом диалого-
       вом окне вы можете:
            - присоединить точку останова к конкретной группе;
            - разрешить или запретить точку останова;


            - установить или изменить адрес точки останова;
            - сделать точку останова глобальной.
                               Команда Add...
       -----------------------------------------------------------------
            Команда Add (Добавление) локального  меню  окна  Breakpoints
       открывает диалоговое окно Breakpoint Options (Параметры точки ос-
       танова),  аналогично команде Set Options (Установка  параметров).
       Разница здесь в том, что курсор устанавливается на пустое тексто-
       вое поле Address (Адрес). Адрес, по которому вы хотите установить
       точку останова,  нужно ввести в поле ввода адреса. Например, если
       в исходном коде программы на языке Си вы хотите  установить точку
       останова в строке с номером 3201, введите в текстовое поле #3201.
       Если строка кода не отображается в окне Module  (Модуль), введите
       символ #, имя модуля, еще один символ # и номер строки, например,
       #OTHERMOD#3201.
            Добавить точку останова (получив доступ к команде Add) можно
       также, начав вводить адрес,  по которому вы хотите ее установить,
       в окне Breakpoint.  После набора первого символа открывается диа-
       логовое окно Breakpoint Options,  переводя вас в  текстовое  поле
       Address.
            Когда вы добавите точку останова,  задав ее адрес, для моди-
       фикации ее поведения можно использовать другие команды локального
       меню Breakpoint Options.

       TDeb 3.0 #1-3               = 173 =
                               Команда Remove
       -----------------------------------------------------------------
            Команда Remove  (Удаление)  удаляет  текущую  (подсвеченную)
       точку останова.  Этой  команде  соответствует оперативная клавиша
       Del.
                             Команда Delete All
       -----------------------------------------------------------------
            Команда Delete All (Удалить все) удаляет все точки останова,


       как глобальные,  так и установленные по конкретным адресам.  Если
       вы хотите, чтобы ваша программа останавливалась на точках остано-
       ва, вам придется задать другие точки  останова.  Используйте  эту
       команду внимательно!
                              Команда Inspect
       -----------------------------------------------------------------
            Команда Inspect (Проверка) выводит строку исходного кода или
       инструкцию Ассемблера, соответствующую записи текущей (подсвечен-
       ной) точки останова.  Если точка останова задана по адресу, соот-
       ветствующему исходной строке программы, то будет открыто (и уста-
       новлено на данную  строку)  окно  Module  (Модуль).  В  противном
       случае будет открыто окно CPU (Центральный процессор),  в котором
       область кода будет установлена на инструкцию,  где  задана  точка
       останова.
            Эту команду можно вызвать также,  нажав клавишу Enter,  если
       подсветка позиционирована на точке останова.
                                Команда Group
       -----------------------------------------------------------------
            Команда Group  (Группа) позволяет вам объединять точки оста-
       нова в группы. Группа точек останова идентифицируется положитель-
       ным целым числом, которое автоматически генерируется Турбо отлад-
       чиком или назначается вами.  Отладчик  автоматически  присваивает
       групповое число  каждой создаваемой точке останова.  Генерируемый
       номер группы представляет собой наименьший еще  не использованный
       номер. Таким образом, если номера 1, 2 и 5 уже используются груп-
       пами, то следующей создаваемой точке останова автоматически прис-
       ваивается номер группы 3.
            После того,  как точка останова создана, вы можете модифици-
       ровать номер группы точки останова  с  помощью  диалогового  окна
       Breakpoint Options (Параметры точки останова), поместив точку ос-


       танова в группу,  связанную с другими точками останова. Объедине-
       ние точек  останова  в группы позволяет вам разрешать,  запрещать
       или удалять множество точек останова с помощью одного действия.
            Когда в локальном меню окна  Breakpoint  выбирается  команда
       Group, на  экран  выводится диалоговое окно Edit Breakpoint Group

       TDeb 3.0 #1-3               = 174 =
       (Редактирование группы точек останова).  В диалоговом окне  выво-
       дится список  текущих  групп точек останова и позволяет вам легко
       объединить все функции модуля в одну группу.
            г[*]==========Edit Breakpoint groups=====================¬
            ¦ Group                                                  ¦
            ¦ -1--#BCDEMO#38-#BCDEMO#39-----------------       OK    ¦
            ¦ -3--#BCDEMO#40----------------------------      ------ ¦
            ¦ ------------------------------------------             ¦
            ¦ ------------------------------------------      Help   ¦
            ¦ ------------------------------------------      ------ ¦
            ¦  Add...  Delete   Enable   Disable                     ¦
            ¦  -----   ------   ------   ------                      ¦
            L========================================================-
            Рис. 7.2 Диалоговое окно Edit Breakpoint Group

       TDeb 3.0 #1-3               = 175 =
                             Окно списка Groups
       -----------------------------------------------------------------
            В окне  списка Groups (Группы) выводятся текущие присвоенные
       группы точек останова.
                                "Кнопка" Add
       -----------------------------------------------------------------
            "Кнопка" Add (Добавить)  активизирует  диалоговое  окно  Add
       Group (Добавление группы).
                    г[*]==========Add group===============¬
                    ¦ Module/Class                        ¦


                    ¦ -BGDEMO-----------------      OK    ¦
                    ¦ ------------------------     ------ ¦
                    ¦ ------------------------            ¦
                    ¦ ------------------------     Cancel ¦
                    ¦ ------------------------     ------ ¦
                    ¦                                     ¦
                    ¦ -(.)-Modules------------     Help   ¦
                    ¦ -( ) Classes------------     ------ ¦
                    ¦                                     ¦
                    L=====================================-
            Рис. 7.3 Диалоговое окно Add Group
            Диалоговое окнo Add Group (Добавление группы)  содержит одно
       поле списка и один набор селективных переключателей, которые поз-
       воляют вам добавить к группе точек останова все функции  конкрет-
       ного модуля или все функции-элементы класса.
            - В поле списка Module/Class (Модуль/Класс) выводится список
              модулей или классов, содержащихся в программе, загружаемой
              в окно Module.  Переместите подсветку на нужный модуль или
              класс,  затем активизируйте "кнопку" OK,  чтобы установить
              точки останова на всех функциях модуля или класса. Все ус-
              тановленные  точки останова объединяются в одну группу то-
              чек останова.
            - Два  селективных  переключателя  позволяют вам выбрать тип
              функций, которые выводятся в поле списка Module/Class:
                 - селективный переключатель  Module  (Модуль)  выбирает
                   все модули, содержащиеся в текущей программе, и выво-
                   дит их в поле списка Module/Class;
                 - Селективный переключатель Classes  (Классы)  выбирает
                   для  вывода в окне списка Module/Class все классы C++
                   (или объекты Паскаля),  содержащиеся в текущей  прог-
                   рамме.


            Delete

       TDeb 3.0 #1-3               = 176 =
            "Кнопка" Delete    (Удаление)   в   диалоговом   окне   Edit
       Breakpoints Groups  (Редактирование групп точек останова) удаляет
       группу,  подсвеченную в поле списка Groups.  Все  точки  останова
       этой группы и их параметры будут отменены.
            Enable
            "Кнопка" Enable (Разрешение) активизирует  ранее запрещенную
       группу точек останова.
            Disable
            Команда Disable (Запрещение) временно запрещает группу точек
       останова, подсвеченную в данный момент в окне списка Groups. Зап-
       рещенные точки останова не стираются,  они просто перестают дейс-
       твовать в текущем сеансе отладки. Разрешение группы вновь активи-
       зирует точки останова группы и все заданные для них параметры.

       TDeb 3.0 #1-3               = 177 =
                     Диалоговое окно Breakpoint Options
       -----------------------------------------------------------------
            Диалоговое окно  Breakpoint Options (Параметры точки остано-
       ва) доступно с помощью команды Breakpoin¦At,  а также  с  помощью
       команд  Set  Option (Установка параметров) и Add (Добавление) ло-
       кального меню окна Breakpoints.
            г[*]==============Breakpoint options=====================¬
            ¦ Address                                                ¦
            ¦ -#BCDEMO#43---------------- -[ ]-Global-------   OK    ¦
            ¦                                                 ------ ¦
            ¦ Group ID                                               ¦
            ¦ -1------------------------- -[ ]-Disabled-----  Cancel ¦
            ¦                                                 ------ ¦
            ¦ Conditions and actions                                 ¦
            ¦ -Breakpoint,-Always---------------------------  Help   ¦
            ¦ ----------------------------------------------  ------ ¦


            ¦ ----------------------------------------------         ¦
            ¦ ----------------------------------------------         ¦
            ¦                                                        ¦
            ¦ -Change...---  -Add...---  --Delete--                  ¦
            L========================================================-
            Рис. 7.4 Диалоговое окно Breakpoint Options
            Address - адрес;  Breakpoint options - параметры точки оста-
       нова; Conditions  and  actions  - условия и действия;  Group ID -
       идентификатор группы;  Global - глобальная; Disabled - запрещена;
       Change - изменение; Add - добавление; Delete - удаление; OK - вы-
       бор; Cancel - отмена; Help - справка.

       TDeb 3.0 #1-3               = 178 =
                                Поле Address
       -----------------------------------------------------------------
            Текстовое поле Address (Адрес) содержит признак адреса, свя-
       занного с  подсвеченной  в данный момент точкой останова.  Обычно
       это поле редактировать не требуется. Однако, если вы хотите изме-
       нить имя признака,  связанного с точкой останова, введите в текс-
       товом поле Address новое имя.
                                Поле Group ID
       -----------------------------------------------------------------
            Текстовое поле Group ID (Идентификатор группы) позволяет вам
       присвоить точку останова новой или  существующей  группе.  Группа
       идентифицируется уникальным положительным целым значением (описа-
       ние групп точек останова см. выше).
                            Переключатель Global
       -----------------------------------------------------------------
            Переключатель Global   (Глобальная),  будучи  установленным,
       разрешает глобальную проверку.  Это означает,  что при каждом вы-
       полнении строки  исходного  кода  будет проверяться условие точки
       останова.


Поскольку глобальные  точки  останова  проверяются  при
       каждом выполнении строки исходного кода, поле адреса, так как оно
       больше не нужно,  устанавливается в значение <not avaliable> (не-
       доступно).
                 Примечание: Более подробно о глобальных точках останова
            см. далее.
            Когда вы устанавливаете глобальную точку останова, нужно за-
       дать условие,  которое  приведет  к ее срабатыванию.  В противном
       случае у вас получится точка останова,  которая будет срабатывать
       на каждой  строке  исходного кода (если вы хотите добиться такого
       эффекта, используйте команду основного меню Run¦Trace (Выполнение
       ¦Трассировка).
                           Переключатель Disabled
       -----------------------------------------------------------------
            Этот блок проверки выключает текущую  точку  останова.  Хотя
       этот переключатель  аналогичен команде Toggle (Переключение) меню
       Breakpoints (см. выше), Disable не сбрасывает параметры точки ос-
       танова (как это происходит по команде Toggle). Disable просто ус-
       танавливает маску точки останова,  пока вы не разрешите ее, пере-
       установив данный переключатель.  Когда точка останова вновь будет
       разрешена, все ее установленные ранее параметры снова будут дейс-
       твовать.

       TDeb 3.0 #1-3               = 179 =
            Данный переключатель  полезно использовать,  когда вам нужно
       определить сложную точку останова, которую вы не хотите использо-
       вать немедленно,  но захотите использовать позднее.  Он позволяет
       вам избежать необходимости удаления точки останова  и последующей
       ее установки со сложными условиями и действиями.
                      Поле списка Condition and Action
       -----------------------------------------------------------------
            Поле списка Condition and Action (Условие и действие)  выво-
       дит набор условий и действий,  связанных с текущей точкой остано-


       ва.
                               "Кнопка" Change
       -----------------------------------------------------------------
            "Кнопка" Change (Изменение) открывает при ее выборе диалого-
       вое поле Conditions and Actions (см. следующий раздел). С помощью
       данной команды  вы  можете редактировать элемент,  подсвеченный в
       поле списка Conditions and Actions (Условия и действия).
                               "Кнопка" Add
       -----------------------------------------------------------------
            "Кнопка" Add (Добавление) добавляет к текущей точке останова
       новый набор условий и действий. Аналогично описанной выше команде
       Change (Изменение),  Add открывает диалоговое поле Conditions and
       Actions.
                               "Кнопка" Delete
       -----------------------------------------------------------------
            "Кнопка" Delete (Удаление) удаляет из определения точки  ос-
       танова текущий элемент в списке Conditions and Actions.

       TDeb 3.0 #1-3               = 180 =
                   Диалоговое окно Conditions and Actions
       -----------------------------------------------------------------
            Когда вы выбираете в диалоговом окне Breakpoint Options (Па-
       раметры точки останова) "кнопки" Change или Add, то выводится ди-
       алоговое окно Conditions ans Actions (Условия и действия).
            г[*]==============Conditions and actions=================¬
            ¦ Condition                Action                        ¦
            ¦ (*) Always                 ( ) Break             OK    ¦
            ¦ ( ) Changed Memory         (*) Execute          ------ ¦
            ¦ ( ) Expression true        ( ) Log                     ¦
            ¦ ( ) Hardware                                    Cancel ¦
            ¦                                                 ------ ¦


            ¦ Conditions expression   Action expression              ¦
            ¦ --i == 2--------------- -Break----------------  Help   ¦
            ¦ ----------------------- ----------------------  ------ ¦
            ¦ ----------------------- ----------------------         ¦
            ¦                                                        ¦
            ¦ -Add-----   -Delete--   --Add---   -Delete--           ¦
            ¦                                                        ¦
            ¦                         Pass count                     ¦
            ¦ -Hardware...---         -1--------------------         ¦
            L========================================================-
            Рис. 7. 5 Диалоговое окно Conditions and Actions
            Action - действие;  Condition - условие; Action expression -
       выражение  действия;  Condition  expression  - выражение условия;
       Pass count - счетчик проходов; Hardware - аппаратная; Add - доба-
       вить;  Delete  -  удалить;  OK - выбор;  Cancel - отмена;  Help -
       справка.
                 Примечание: Более подробно об изменении  точек останова
            рассказывается ниже.
            При установке на строке исходного кода точки останова ее ха-
       рактеристиками по умолчанию будут Always (всегда  срабатывает)  и
       Break (прерывание  выполнения  программы  при  достижении  данной
       строки). С помощью диалогового окна Conditions and Actions (Усло-
       вия и  действия)  вы можете настроить условия,  при которых будет
       срабатывать точка останова, и задать различные действия, предпри-
       нимаемые при ее срабатывании.
            Вы можете настроить точку останова, используя два набора се-
       лективных переключателей и три текстовых поля. Кроме того, "кноп-
       ка" Hardware   (Аппаратная)  позволяет  вывести  диалоговое  окно
       Hardware Breakpoints Options (Параметры аппаратных точек  остано-
       ва), что  позволяет вам задать условия для аппаратной точки оста-


       нова.

       TDeb 3.0 #1-3               = 181 =
                      Селективные переключатели условия
       -----------------------------------------------------------------
                                    Always
       -----------------------------------------------------------------
            Выбор Always (Постоянно) показывает,  что  для  срабатывания
       точки останова не требуется проверять истинность (выполнение) до-
       полнительных условий.
                                Changed Memory
       -----------------------------------------------------------------
            Значение Changed Memory (Изменение памяти) позволяет  отсле-
       живать  переменную  в памяти или объект и приводит к срабатыванию
       точки останова  при  изменении значение этого объекта.  Для ввода
       выражения, соответствующего наблюдаемому объекту, используйте по-
       ле ввода Condition Expression (Выражение условия).
                 Примечание: Более подробно о Changed Memory рассказыва-
            ется далее.
                                Expression True
       -----------------------------------------------------------------
            Значение Expression  True  (Выражение истинно) позволяет за-
       дать срабатывание точки останова,  когда выражение принимает  ис-
       тинное значение (становится ненулевым).  Для ввода выражения, ко-
       торое  будет  вычисляться  при  каждом  при  каждом   обнаружении
       заданного действия, используйте поле ввода Condition Expression.
                 Примечание: Подробности описаны ниже.
                                   Hardware
       -----------------------------------------------------------------
            Значение Hardware (Аппаратура) приводит к срабатыванию точки
       останова по  указанию драйвера устройства со вспомогательными ап-
       паратными средствами. Поскольку вспомогательные аппаратные средс-
       тва  вы можете использовать только для глобальной точки останова,


       перед доступом к этому  средству  нужно  проверить  переключатель
       Global  (Глобальная)  в диалоговом окне Breakpoint Options (Пара-
       метры точки останова).
                 Примечание: Простой способ задания аппаратной точки ос-
            танова вам предоставляет команда Hardware¦Breakpoint.

       TDeb 3.0 #1-3               = 182 =
            Перед активизацией "кнопки" Hardware в нижней части диалого-
       вого  окна важно  выбрать селективный переключатель Hardware. Ак-
       тивизация этой   "кнопки"  приводит  к  выводу  диалогового  окна
       Hardware Breakpoint Options (Параметры аппаратной  точки  остано-
       ва). Параметры, которые вы можете выбирать в данном окне, описаны
       в текстовом файле HDWDEBUG.TD на дистрибутивном диске.

       TDeb 3.0 #1-3               = 183 =
                      Селективные переключатели Action
       -----------------------------------------------------------------
            Селективные переключатели  Action (Действие) позволяют уста-
       навливать пять параметров:
                                     Break
       -----------------------------------------------------------------
            Значение Break (Останов) приводит к тому, что при срабатыва-
       нии точки останова программа останавливается.  Экран Турбо отлад-
       чика будет выведен заново,  и вы можете вводить команды для прос-
       мотра структур данных программы.
                                    Execute
       -----------------------------------------------------------------
            Значение Execute (Выполнить) приводит к выполнению выражения
       (выражение запрашивается в поле ввода Action Expression). Выраже-
       ние должно иметь некоторые побочные эффекты, например, присваива-
       ние  значения переменной.  Эта возможность позволяет вам включить
       выражение,  которое будет выполняться перед кодом вашей программы
       в  строке с текущим номером ("вставка кода").  Такое средство по-


       лезно использовать,  когда вы хотите изменить поведение  подпрог-
       раммы,  чтобы проверить "диагноз" или скорректировать ошибку. Это
       позволяет при проверке минимальных изменений в программе  не  вы-
       полнять цикл компиляции и компоновки.
            Конечно, этот метод ограничен включением выражения перед уже
       существующей строкой  кода,  и его нельзя использовать для непос-
       редственной модификации строк исходного кода.
                                      Log
       -----------------------------------------------------------------
            Задание Log (Регистрация) приводит к тому,  что значение вы-
       ражения будет записано в окне Log. Вам выводится подсказка. В от-
       вет на нее вы должны ввести выражение, значение которого требует-
       ся зарегистрировать. Будьте внимательны, чтобы выражение не имело
       никаких неожиданных побочных эффектов.
                 Примечание: Описание  выражений и побочных эффектов со-
            держится в Главе 9.
                             "Кнопка" Enable group
       -----------------------------------------------------------------
            "Кнопка" Enable  group  (Разрешение  группы) позволяет вновь
       активизировать запрещенную ранее группу точек останова.
                             "Кнопка" Disable group
       -----------------------------------------------------------------

       TDeb 3.0 #1-3               = 184 =
            "Кнопка" Disable  group  (Запрещение  группы)  позволяет вам
       запретить группу точек останова.  При запрещении группы точек ос-
       танова они не стираются, а просто маскируются на время сеанса от-
       ладки.

       TDeb 3.0 #1-3               = 185 =
                         Задание условий и действий
       -----------------------------------------------------------------
            Наиболее важный шаг при задании точки останова состоит в за-


       дании условий,  при которых будет срабатывать точка  останова,  и
       действий, которые  будут  выполняться при ее срабатывании.  Этими
       параметрами управляют  два   текстовых   поля:   поле   Condition
       Expression (Выражение  условия)  и  Action  Expression (Выражение
       действия).
                              Выражение условия
       -----------------------------------------------------------------
            Когда вы выбираете селективный переключатель  Changed Memory
       (Изменение памяти),   Expression  True  (Выражение  истинно)  или
       Hardware Condition (Аппаратное условие), нужно задать набор усло-
       вий,  которые  будут  известны  Турбо  отладчику при срабатыванию
       точки останова. Набор условий состоит из одного или более выраже-
       ний.  Чтобы  весь набор условий принял истинное значение,  каждое
       условие должно принять истинное значение.
            С набором условий связывается набор действий.  Когда при вы-
       числении условия получается истинное значение,  выполняется соот-
       ветствующий набор действий.
                 Примечание: Подробнее о задании  действия, выполняемого
            по точке останова,  рассказывается ниже в разделе "Выражение
            действия".
            Чтобы добавить к точке останова условие, нужно:
            1. Выбрать селективный переключатель Changed Memory (Измене-
               ние  памяти),  Expression  True  (Выражение  истинно) или
               Hardware (Аппаратная).
            2. Выбрать "кнопку" Add(Добавление) под текстовым поле ввода
               Condition Expression.
            3. Ввести  в  текстовое поле Condition Expression (Выражения
               условия) условие или выражение с переменной.
            4. Если вы хотите,  чтобы для  конкретного  набора  действий
               проверялось  значение  нескольких переменных или условий,
               повторите шаги 2 и 3,  пока в  текстовое  поле  Condition


               Expression не будут добавлены все условия.
            5. Когда вы зададите набор условий, используйте для указания
               списка действий,  выполнение которых вы хотите задать при
               срабатывании точки останова, поле ввода Action Expression
               (Выражение действия).
            Одна точка останова может иметь несколько  наборов связанных
       с ней условий и действий. Если вы хотите связать с точкой остано-

       TDeb 3.0 #1-3               = 186 =
       ва более одного набора условий и действий,  то выберите после за-
       дания первой  последовательности  условий и действий "кнопку" OK.
       При этом будет закрыто диалоговое окно Conditions and  Actions, и
       вы вернетесь в диалоговое окно Breakpoint Options (Параметры точ-
       ки останова). Здесь выберите для добавления нового набора условий
       и  действий  команду Add (Добавление).  Если точка останова имеет
       несколько условий и действий,  каждое из них будет вычисляться  в
       том порядке, в каком они введены. Если при вычислении условий ис-
       тинное значение принимает несколько условий, то будет выполняться
       более одного набора действий.
            "Кнопка" Delete (Удаление),  которая находится под текстовым
       полем Condition Expression,  позволяет вам удалить из  текстового
       поля Condition  Expression (Выражение условия) текущее подсвечен-
       ное выражение.  Выберите эту "кнопку", если вы хотите удалить ус-
       ловие из набора условий.
                              Выражение действия
            При выборе  селективного переключателя Execute (Выполнение),
       Enable Group (Разрешение группы) или  Disable  Group  (Запрещение
       группы) должен быть предусмотрен набор действий,  благодаря кото-
       рым Турбо отладчик будет знать, что нужно делать при срабатывании
       точки останова. Набор действий может состоять из нескольких дейс-
       твий:


            Чтобы добавить к точке  останова  набор  действий,  сделайте
       следующее:
            1. Выберите  селективный переключатель Execute (Выполнение),
               Enable Group ( Разрешение группы) или Disable Group  (Зап-
               рещение группы).
            2. Выберите "кнопку" Add (Добавление), которая находится под
               текстовым полем Action Expression.
            3. Введите действие в текстовое поле Action Expression  (Вы-
               ражения действия).
               Если вы хотите, чтобы при срабатывании точки останова вы-
               полнялось несколько действий,  повторите шаги 2 и 3, пока
               все  они  не  будут  добавлены  в  текстовое  поле Action
               Expression.
            4. Когда вы закончите вводить действия,  выберите в диалого-
               вом окне Conditions and Actions "кнопку" OK.
            Если вы выбрали селективные переключатели Enable Group (Раз-
       решение группы) или Disable Group (Запрещение группы), для указа-
       ния  группы,  которую  вы ходите разрешить или запретить,  просто
       введите в текстовое поле Action Expression номер группы.
            "Кнопка" Delete (Удаление),  которая находится под текстовым

       TDeb 3.0 #1-3               = 187 =
       полем Action Expression, позволяет вам удалить текущее условие из
       набора условий.
                          Поле ввода Pass Count...
       -----------------------------------------------------------------
            Поле ввода Pass Count (Счетчик проходов) задает, сколько раз
       данное действие должно быть обнаружено перед тем,  как оно срабо-
       тает. Значение счетчика уменьшается только в том случае, если со-
       ответствующее точке останова условие принимает истинное значение.
       Это означает,  что если наряду с условием установили счетчик про-
       ходов, то точка останова сработает, когда условие n-ый раз примет
       истинное значение.



       TDeb 3.0 #1-3               = 188 =
                          Настройка точек останова
       -----------------------------------------------------------------
            Кроме того,  что вы можете останавливать  свою  программу  в
       конкретной точке,  вы  можете  расширить  возможности управления,
       обусловив остановку программу выполняемым по точке останова дейс-
       твием.
                           Простые точки останова
       -----------------------------------------------------------------
            При первоначальной установки точки останова она имеет назна-
       чаемые по умолчанию параметры Always Break. После установки точки
       останова выполняемые по ней действия и  условия  ее  срабатывания
       можно настроить. Точки останова можно задать несколькими способа-
       ми, каждый из них удобно использовать в определенных  обстоятель-
       ствах.
            1. Переместите курсор на нужную строку исходного кода (в ок-
               не Module или в области кода окна CPU)  и  дайте  команду
               Breakpoints¦Toggle (Точки останова¦Переключение) или наж-
               мите клавишу F2 (можно также  щелкнуть  кнопкой  "мыши").
               Если  дать  эту команду на строке,  где уже имеется точка
               останова, то эта точка останова будет удалена.
            2. Дайте команду локального меню Add  (Добавить)  в  области
               списка  точек  останова  окна Breakpoints и введите адрес
               кода,  по которому вы ходите задать точку останова. Адрес
               кода имеет тот же формат,  что и формат указателя исполь-
               зуемого языка.  Подробнее о выражениях  рассказывается  в
               Главе 9.
            3. Чтобы  установить точку останова на текущей строке в окне
               Module, дайте команду Breakpoints¦At  (Точки  останова¦По
               адресу...).
                          Глобальные точки останова
       -----------------------------------------------------------------


            Когда точка останова становится глобальной,  Турбо  отладчик
       будет проверять  точку  останова на каждой строке исходного кода.
       Если набор условий принимает истинное  значение,  то  выполняется
       соответствующее действие.
                 Примечание: Если  вы хотите установить аппаратные точки
            останова, проверьте переключатель Global.
            Поскольку действие отладчика  будет  выполняться  на  каждой
       строке исходного кода,  глобальные точки останова существенно за-
       медляют выполнение программы.  Используйте глобальные точки оста-
       нова осторожно. К ним следует прибегать только в том случае, если
       вы хотите точно определить, когда переменная изменяет значение, и
       когда становятся  истинными  некоторые  условия,  либо когда ваша

       TDeb 3.0 #1-3               = 189 =
       программа работает с данными.
                 Примечание: Быстрый способ задания глобальной точки ос-
            танова  предлагает  окно  Breakpoints.  Подробнее о командах
            Changed Memory Global и Expression True Global рассказывает-
            ся выше.
            Часто глобальные  точки останова используются для отслежива-
       ния изменения значения элемента данных. В этой ситуации Турбо от-
       ладчик проверяет  область  памяти  на  изменение после выполнения
       каждой строки кода.  В качестве альтернативы глобальной точке ос-
       танова вы  можете задать точку останова,  которая отслеживает из-
       менение только при достижении определенного оператора. Это намно-
       го более  эффективно,  поскольку существенно число операций Турбо
       отладчика, которые он должен выполнять для  обнаружения изменения
       (в этом случае Турбо отладчику не важно,  где изменяется элемент,
       а важен сам факт его изменения).
                   Остановка при изменении объектов данных
       -----------------------------------------------------------------
            Когда вы хотите определить, где в вашей программе изменяются


       определенные объекты данных, сначала с помощью одного из методов,
       описанных в предыдущем разделе, установите глобальную точку оста-
       нова.  Затем можно использовать селективный переключатель Changed
       Memory   (Измененная  память)  диалогового  окна  Conditions  and
       Actions (Условия и действия).  Введите выражение,  ссылающееся на
       область  памяти,  которую  вы хотите отслеживать и необязательный
       счетчик числа отслеживаемых объектов. Общее число байт отслежива-
       емой области соответствует произведению размера объекта, на кото-
       рое ссылается выражение,  на число объектов.  Предположим, напри-
       мер, что у вас имеется следующий массив Си:
            int string[81];
            Если вы  хотите отследить изменение первого элемента данного
       массива, введите в поле ввода Condition Expression следующий эле-
       мент:
            &sting[0], 10
            Наблюдаемая область памяти имеет длину 20 байт, так как зна-
       чение int занимает два байта, а вы задали отслеживание 10 байт.
            Если точка останова по изменению памяти (Changed Memory) яв-
       ляется глобальной, то ваша программа будет выполняться существен-
       но медленнее,  поскольку область памяти будет проверяться при вы-
       полнении каждой строки исходного кода.
            Если у вас установлен аппаратный драйвер, Турбо отладчик для
       отслеживания изменений в области данных попытается установить ап-
       паратную точку останова. Различные аппаратные отладчики поддержи-
       вают  различное число и типы аппаратных точек останова.  Увидеть,

       TDeb 3.0 #1-3               = 190 =
       используются ли  для точки останова аппаратные средства,  можно с
       помощью  окна  Breakpoints  (Точки  останова)  и  команды   View¦
       Breakpoints (Обзор¦Точки останова). Все точки останова, для кото-
       рых используются вспомогательные аппаратные средства, будут отме-
       чены  звездочками  (*).  Такие точки останова выполняются гораздо


       быстрее, чем другие глобальные точки останова, для которых не ис-
       пользуются вспомогательные аппаратные средства.
                              Выражения условия
       -----------------------------------------------------------------
            Имеется много случаев, когда нежелательно, чтобы точка оста-
       нова срабатывала  при каждом выполнении определенной строки (опе-
       ратора) исходного кода,  особенно,  когда эта строка  выполняется
       много раз до того,  как встретится интересующий вас случай. Турбо
       отладчик предоставляет вам два способа уточнения  ситуации, когда
       должна срабатывать точка останова: счетчики прохода и условия.
           Область действия выражений, заданных для точек останова
       -----------------------------------------------------------------
            И действием,  которое будет выполняться при достижении точки
       останова,  и условием,  при котором она срабатывает, можно управ-
       лять с помощью задаваемого вами выражения. Это выражение вычисля-
       ется  с  использованием области действия адреса,  где установлена
       точка останова,  а не той области действия,  где в данный  момент
       остановилась программа.  Это означает,  что в вашем выражении для
       точки останова могут использоваться только имена переменных,  ко-
       торые являются допустимыми в том месте программы, где задана точ-
       ка останова (если эта область действия не  переопределена).  Пол-
       ностью область действия обсуждается в Главе 9.
            Если вы хотите установить точку останова для выражения в мо-
       дуле, который в данный момент не загружен отладчиком, и Турбо от-
       ладчик не может найти данное выражение,  то вы можете переопреде-
       лить область действия и задать файл,  который содержит выражение,
       или использоваться  для  смены  модулей  команду View¦Module (Об-
       зор¦Модуль).
            Если вы используете переменные,  являющиеся по  отношению  к


       подпрограмме  локальными,  то такие точки останова обрабатываются
       гораздо медленнее, чем те, в которых используются только глобаль-
       ные или локальные по отношению к модулю переменные.

       TDeb 3.0 #1-3               = 191 =
                          Аппаратные точки останова
       -----------------------------------------------------------------
            Аппаратная точка останова использует поддерживающие средства
       аппаратной отладки  (плату  аппаратной отладки или отладочные ре-
       гистры процессора 80386 или старше).  Если в вашей системе  уста-
       новлены средства  аппаратной отладки (команда File¦Get Info пока-
       зывает установку Breakpoints в Hardware),  то с помощью одного из
       следующих методов вы можете задать аппаратную точку останова:
            - Выберите команду Breakpoints¦Changed Memory Global,  кото-
              рая чаще всего используется для аппаратных точек останова.
            - Выберите команду Breakpoints¦Hardware.
            - Выведите меню Breakpoint Options  (выберите  команду  окна
              Vies¦Breakpoints Breakpoints¦At  или  Set Options),  затем
              сделайте следующее:
                 - проверьте переключатель Global;
                 - активизируйте "кнопку" Change (Изменение)ж
                 - в диалоговом окне Conditions and Actions выберите се-
                   лективный переключатель Hardware (Аппаратная) и акти-
                   визируйте "кнопку" Hardware диалогового окна;
                 - для  вывода  диалогового  окна  Hardware   Breakpoint
                   Options (Параметры аппаратной точки останова) активи-
                   зируйте "кнопку" Hardware;
                 - выберите в диалоговом окне нужный параметр (параметры
                   описываются в текстовом файле HDWDEBUG.TD).
                       Регистрация значений переменных
       -----------------------------------------------------------------


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

       TDeb 3.0 #1-3               = 192 =
            Выберите селективный  переключатель Log (Регистрация) диало-
       гового окна Breakpoint Options (Параметры точки останова).  В от-
       вет  на выводимую подсказку введите выражение,  значение которого
       должно регистрироваться при каждом срабатывании  точки  останова.
       Если  вы  хотите  регистрировать  значение нескольких переменных,
       нужно установить несколько точек останова.
                 Примечание: При регистрации выражений  нужно  учитывать
            побочные эффекты.

       TDeb 3.0 #1-3               = 193 =
                          Точки останова и шаблоны
       -----------------------------------------------------------------
            Турбо отладчик поддерживает шаблоны C++.  Точки останова ус-
       танавливаются по-разному, в зависимости от использования F2 в ок-
       не Module,  в окне CPU или задании их с помощью диалогового  окна
       Breakpoint Options.
                      Точки останова и классы шаблонов
       -----------------------------------------------------------------
            Для задания точек останова в шаблонах имеется несколько  ме-
       тодов:
            - Если  вы установили точку останова в самом шаблоне,  нажав
              клавишу F2  при нахождении курсора в строке исходного кода
              шаблона в окне Module,  точки останова устанавливаются  во
              всех экземплярах классов этого шаблона.  Это средство поз-
              воляет вам отлаживать все поведение шаблона.


            - Если вы установили точку останова в шаблоне, нажав клавиши
              Alt-F2 для вывода диалогового окна Breakpoint Options (Па-
              раметры точки останова),  то ввод в окне Module адреса вы-
              ражения  шаблона выводит диалоговое окно,  позволяющее вам
              выбрать экземпляр класса,  для которого вы хотите  устано-
              вить точку останова.
            Вы можете  удалить точку останова шаблона точно так же,  как
       удаляете любую другую точку останова - позиционировавшись  в окне
       Module подсвеченную  строку  на шаблон и нажав клавишу F2 или ис-
       пользуя команду удаления окна Breakpoint. При этом удаляются так-
       же точки останова соответствующего экземпляра класса.
            Если вы  позиционируетесь  на  точке  останова  в экземпляре
       класса в окне CPU и нажмете клавишу F2, то удаляется только точка
       останова для данного экземпляра класса.

       TDeb 3.0 #1-3               = 194 =
                      Точки останова в шаблонах функций
       -----------------------------------------------------------------
            Вы можете устанавливать и отменять точки останова для шабло-
       нов функций  точно также,  как это делается для шаблонов классов.
       При этом используются два метода - нажатие клавиши F2 или исполь-
       зование диалогового  окна  Breakpoint Options.  Они имеют для эк-
       земпляров функций тот же эффект, что и для экземпляров классов.
          Точки останова в шаблонах экземпляров классов и объектов
       -----------------------------------------------------------------
            Аналогично обычным классам и объектам,  вы можете установить
       точки останова в шаблонах экземпляров классов и объектов.
                                  Окно Log
       -----------------------------------------------------------------
            Окно Log  (Регистрация)  можно   создать,   выбрав   команду
       View¦Log (Обзор¦Регистрация).  Это окно позволяет вам просмотреть


       список значащих событий,  которые имели место во время сеанса от-
       ладки.
                г[*]=Log==========================3==[ ][ ]==¬
                ¦At MCINPUT.124                              ^
                ¦Breakpoint at TPDEMO.220                    -
                ¦Breakpoint at TPDEMO.220                    -
                ¦Breakpoint at TPDEMO.220                    -
                ¦Breakpoint at TPDEMO.220                    -
                ¦Breakpoint at TPDEMO.220                    -
                ¦Breakpoint at TPDEMO.220                    -
                ¦Breakpoint at TPDEMO.220                    -
                ¦We are now entering procedure Params...     -
                ¦Breakpoint-at-TPDEMO.180--------------------v
                L<----------------------------------------->--
            Рис. 7.6 Окно Log
            В окне  Log  (Регистрация)  выводится  пролистываемый список
       строк (вывод в окно).  Если зарегистрировано более 50  строк,  то
       самые  старые  строки списка теряются.  Для настройки числа строк
       используйте параметр командной строки при запуске Турбо отладчика
       или  измените  это число с помощью программы установки TDINST.  С
       помощью команды локального меню Open Log File (Открыть  файл  ре-
       гистрации)  можно сохранить всю регистрацию,  записывая ее непре-
       рывно в файл на диске.
            Перечислим, какие причины могут вызвать запись строк в  про-
       токол регистрации:
            - Ваша программа остановилась по заданному адресу.  Адрес ее
              останова регистрируется.

       TDeb 3.0 #1-3               = 195 =
            - Вы дали команду локального меню Add Comment (Добавить ком-
              ментарий).  Выводится  подсказка,  по которой нужно ввести
              комментарий, регистрируемый в протоколе.
            - Срабатывает точка останова,  которая регистрирует значение
              выражения.


Это значение помещается в протокол регистрации.
            - Вы  использовали команду Window¦Dump Pane To Log (Окно¦Вы-
              вод области в протокол регистрации)  (из  основного  меню)
              для записи текущего содержимого области окна.
            - Вы  отлаживаете прикладную программу для Microsoft Windows
              и использовали команду View¦Windows Messages  (Обзор¦Сооб-
              щения Windows) для вывода окна Windows Messages,  и теперь
              находитесь в локальном меню области Messages  этого  окна.
              Вы переключаете  параметр  Send  to Log Window (Передача в
              окно регистрации) в значение Yes (Да),  чтобы все приходя-
              щие в данное окно сообщения также отображались в Log.
            - Вы  отлаживаете прикладную программу для Microsoft Windows
              и используете команду Display Window Info (Вывод  информа-
              ции  Windows) локального меню окна Log для записи в журнал
              информации о глобальной динамически распределяемой области
              памяти,  информации о локальной динамически распределяемой
              области или списка модулей.

       TDeb 3.0 #1-3               = 196 =
                           Локальное меню окна Log
       -----------------------------------------------------------------
            Команды данного  меню позволяют вам управлять записью прото-
       кола регистрации в файл на диске,  останавливая и начиная регист-
       рацию, добавляя в протокол регистрации комментарий, и очищая про-
       токол.
            Локальное меню окна Log (Регистрация) выводится  при нажатии
       клавиш Alt-F10. Если разрешено использовать сокращения с клавишей
       Ctrl, то для непосредственного доступа к команде этого меню можно
       нажать клавишу Ctrl совместно с первой буквой нужной команды.
                                      -------------------------¬
            Открыть файл регистрации  ¦ Open log file...       ¦


            Закрыть файл регистрации  ¦ Close log file         ¦
            Регистрация               ¦ Logging        YES     ¦
            Добавить комментарий      ¦ Add comment...         ¦
            Стереть файл регистрации  ¦ Erase log              ¦
            Вывести информацию        ¦ Display Windows Info...¦
             Windows                  L-------------------------
                          Команда Open Log File...
       -----------------------------------------------------------------
            По команде  Open  Log  File  (Открыть  файл регистрации) все
       строки, записываемые в протокол регистрации, записываются также в
       файл на диске.  Вам выводится подсказка с запросом имени файла, в
       который нужно записывать протокол регистрации.
            Когда вы  открываете  файл регистрации,  в него записываются
       все строки, которые уже выведены на экран в окне регистрации. Это
       позволяет  вам  открыть файл на диске после того,  как вы увидите
       что-то вас интересующее и захотите записать это на диск.
            Если вы хотите начать регистрацию на диске, не включая в нее
       строки,  которые уже выведены на экран,  то перед выбором команды
       Open File Log (Открыть файл регистрации) выберите сначала команду
       Erase Log File (Стереть файл регистрации).

       TDeb 3.0 #1-3               = 197 =
                           Команда Close Log File
       -----------------------------------------------------------------
            Команда Close Log File (Закрыть файл регистрации) останавли-
       вает запись строк в файл регистрации,  заданный в команде локаль-
       ного меню Open Log File (Открыть файл регистрации).  Данный  файл
       закрывается.
                               Команда Logging
       -----------------------------------------------------------------
            Команда Logging (Регистрация) разрешает  или  запрещает  ре-
       гистрацию, управляя выводом в окно Log (Регистрация).


                             Команда Add Comment
       -----------------------------------------------------------------
            Команда Add Comment  (Добавить  комментарий)  позволяет  вам
       включить  в  регистрируемую  информацию  комментарий.  В ответ на
       подсказку можно ввести строку  текста,  которая  может  содержать
       столько символов, сколько вам требуется.
                              Команда Erase Log
       -----------------------------------------------------------------
            Команда Erase Log (Стереть регистрацию) очищает  список  ре-
       гистрации.  Окно Log (Регистрация) заполняется пробелами.  Это не
       влияет на запись регистрации в файл на диске.
                        Команда Display Windows Info
       -----------------------------------------------------------------
            Данная команда  выводит  диалоговое окно Windows Information
       (Информация Windows),  позволяющий получить информацию о глобаль-
       ной  и  локальной  динамически  распределяемой области памяти или
       списке модулей,  входящих в вашу прикладную программу. Это средс-
       тво описано подробнее в Главе 17.

       TDeb 3.0 #1-3               = 198 =
                   Глава 8. Просмотр и модификация файлов
       -----------------------------------------------------------------
            При отладке  программы  Турбо отладчик обрабатывает файлы на
       диске  как естественное расширение программы. Вы можете проверить
       и  модифицировать  любой  файл на диске,  просматривая его в коде
       ASCII или в шестнадцатиричном виде. Из среды Турбо отладчика мож-
       но также изменить текcтовые файлы с  помощью  используемого  вами
       текстового процессора или редактора.
            В данной главе рассказывается, как можно анализировать и мо-
       дифицировать два вида файлов на диске: файлы, в которых содержит-
       ся исходный код программы,  и другие файлы.
                     Просмотр исходных файлов программы


       -----------------------------------------------------------------
            Исходными файлами  программы  являются  те файлы,  с помощью
       компиляции которых создаются  выполняемые  модули  (файлы  .EXE).
       Обычно  их просматривают,  когда хотят проанализировать поведение
       программы или написать фрагмент кода. При отладке часто приходит-
       ся просматривать исходный код функции, чтобы определить, допусти-
       мы ли ее аргументы и корректно ли возвращаемое ей значение.
                 Примечание: Загрузка и отладка модулей Windows DLL опи-
            сывается в Главе 17.
            При прохождении программы с использованием  Турбо  отладчика
       он автоматически выводит на экран ту часть исходного кода,  кото-
       рая соответствует текущему адресу программы.
            Файлы, включенные в исходный файл с использованием директивы
       компилятора, которая генерирует номера строк (аналогично директи-
       ве #include в языке Си и INCLUDE в Ассемблера) также рассматрива-
       ются, как исходные файлы программы. Для просмотра исходных файлов
       программы всегда нужно использовать  окно  View¦Module  (Окно¦Мо-
       дуль),  поскольку это указывает Турбо отладчику,  что файл предс-
       тавляет собой исходный модуль.  Для выбора одного из файлов нужно
       использовать команду локального меню File (Файл).

       TDeb 3.0 #1-3               = 199 =
                                 Окно Module
       -----------------------------------------------------------------
            Окно Module (Модуль) можно создать,  выбрав в  главном  меню
       команду View¦Module (Обзор¦Модуль) (или нажав клавишу F3).
         г=[*]=Module: TPDEMO File: TPDEMO.PAS 217 ====================¬
         ¦      end;                                                   ^
         ¦   Writeln;                                                  -
         ¦  end; { ParmsOnHeap }                                       -
         ¦                                                             -


         ¦> begin                                                      -
         ¦    Init;                                                    -
         ¦    Buffer := GetLine;                                       -
         ¦    while Buffer <> '' do                                    -
         ¦    begin                                                    -
         ¦      ProcessLine(Buffer);                                   -
         ¦      Buffer := GetLine;                                     -
         ¦    end;                                                     -
         ¦    ShowResult;                                              -
         ¦    ParmsOnHeap;                                             -
         ¦  end.                                                       -
         ¦                                                             -
         ¦                                                             -
         ¦                                                             -
         ¦                                                             v
         L<----------------------------------------------------------->-
            Рис. 8.1 Окно Module
            В диалоговом окне вы можете ввести имя модуля, который хоти-
       те просмотреть.
            Если вы отлаживаете прикладную программу Windows,  в  данном
       диалоговом окне выводится список, в котором показаны модули прог-
       раммы, и список, в котором показаны файлы DLL и .EXE, загруженные
       в данный момент Windows.
                 Примечание: При запуске отладчика TDW вам требуется как
            файл .EXE, так и исходные текстовые файлы, а также выполняе-
            мый  и  исходный код всех написанных для программы библиотек
            DLL.
            При этом Турбо отладчик загрузит  исходный  файл  выбранного
       модуля. Поиск исходного файла он выполняет в следующем порядке:
            1. В каталоге, в котором находится выполняемый файл компиля-


               тора.
            2. В каталогах,  заданных командой  Options¦Path  (Параметры
               ¦Маршрут) для команды Source (Исходный модуль), или в па-
               раметре командной строки -sd.

       TDeb 3.0 #1-3               = 200 =
            3. В текущем каталоге.
            4. В каталоге, где содержатся отлаживаемые программы.
            В окне Module (Модуль) выводится содержимое  исходного файла
       выбранного модуля. В заголовке окна Module показывается имя прос-
       матриваемого модуля,  имя исходного файла и номер строки, в кото-
       рой находится  курсор.  Текущий  адрес  программы (CS:IP) отмечен
       символом стрелки (>) в первой позиции окна.
            Если после имени файла в заголовке выводится  сообщение opt,
       то программа  оптимизирована  компилятором.  При поиске некоторых
       исключенных при оптимизации переменных вы  можете  столкнуться  с
       трудностями. Кроме того,  переменные, которые стали регистровыми,
       не будут иметь адреса.
            Если после имени файла в заголовке появляется слово modified
       (модифицирован), то со времени последней компиляции или компонов-
       ки для создания отлаживаемой программы файл был изменен.  Это оз-
       начает,  что  номера  строк программ в обновленном исходном файле
       могут не соответствовать номерам  строк  отлаживаемой  программы.
       Это может привести к тому,  что стрелка, показывающая текущий ад-
       рес в программе (CS:IP), будет указывать на неверную строку.
                         Локальное меню окна Module
       -----------------------------------------------------------------
            В локальном меню окна Module (Модуль) предусмотрено несколь-
       ко команд,  позволяющих вам перемещаться в указанном модуле, ссы-
       латься на элементы данных и проверять их, а также выводить в окно
       новый файл или модуль.
            Вероятно, при работе с  отладчиком  вы  будете  пользоваться


       этим  меню чаще,  чем другими меню,  поэтому лучше ближе познако-
       миться с различными его возможностями.
            Для вывода локального меню данного окна  можно  использовать
       комбинацию клавиш Alt-F10. Если разрешено использовать сокращения
       с клавишей Ctrl, то для непосредственного доступа к команде этого
       меню можно  нажать клавишу Ctrl вместе с первой буквой нужной ко-
       манды (например, при нажатии Ctrl-S вызовется команда Search).
                                               -------------¬
                   Проверка                    ¦ Inspect    ¦
                   Просмотр                    ¦ Watch      ¦
                                               +------------+
                   Модуль                      ¦ Module...  ¦
                   Файл                        ¦ File...    ¦
                                               +------------+
                   Предыдущий                  ¦ Previous   ¦
                   Строка                      ¦ Line...    ¦
                   Поиск                       ¦ Search...  ¦

       TDeb 3.0 #1-3               = 201 =
                   Следующий                   ¦ Next...    ¦
                   Начало                      ¦ Origin     ¦
                   Переход                     ¦ Goto...    ¦
                   Редактирование              ¦ Edit       ¦
                                               L-------------
                               Команда Inspect
       -----------------------------------------------------------------
            Команда Inspect (Проверка) открывает окно проверки,в котором
       выводится содержимое переменной программы,  расположенной в теку-
       щей позиции курсора. Перед тем как дать эту команду вы можете по-
       местить курсор в исходном файле на одну из  переменных программы,
       или ввести ее имя в поле ввода выводимого диалогового окна.
            Поскольку эта  команда  избавляет вас от ввода каждого имени


       проверяемой переменной,  с ее помощью можно  проверить  множество
       переменных программы.
                                Команда Watch
       -----------------------------------------------------------------
            Команда Watch (Просмотр) добавляет в окно просмотра перемен-
       ную,  расположенную в текущей позиции курсора. Ее полезно исполь-
       зовать, если вы хотите при выполнении программы непрерывно отсле-
       живать  значение переменной.  Перед тем,  как давать эту команду,
       нужно поместить в исходном файле курсор  на  одну  из  переменных
       программы.
                 Примечание: Если курсор не находится на переменной, вам
             выведется подсказка для ее ввода.
                              Команда Module...
       -----------------------------------------------------------------
            Команда Module (Модуль) позволяет вам просмотреть другой мо-
       дуль  (который  можно выбрать из выводимого списка модулей).  Эту
       команду полезно использовать,  когда вас больше не интересует те-
       кущий модуль, но вы не хотите открывать еще одно окно Module.
                               Команда File...
       -----------------------------------------------------------------
            Команда File  (Файл) позволяет вам переключиться на просмотр
       того или иного исходного файла,  входящего в состав просматривае-
       мого  модуля.  Выберите файл,  который вы хотите просмотреть,  из
       списка файлов.  Большинству модулей соответствует  один  исходный
       файл,  в котором находится весь исходный код. В других включаемых
       в данный файл файлах содержатся обычно только определенные  конс-
       танты и структуры данных. Используйте данную команду, если исход-
       ный код вашего модуля содержится в нескольких файлах.

       TDeb 3.0 #1-3               = 202 =
            Если вы  хотите просматривать одновременно несколько файлов,
       то для  создания другого окна File (Файл) используйте команду ос-


       новного меню View¦Another¦File (Обзор¦Другой¦Файл), или для того,
       чтобы просмотреть первый файл - команду View¦File (Обзор¦Файл).
                              Команда Previous
       -----------------------------------------------------------------
            Команда Previous (Предыдущий) возвращает вас в последний ис-
       ходный модуль,  который вы просматривали. Эту команду можно также
       использовать для возврата к предыдущему месту после того,  как вы
       дали команду, которая изменила позицию в текущем модуле.
                               Команда Line...
       -----------------------------------------------------------------
            Команда Line (Строка) позиционирует вас в файле на  строку с
       другим номером.  Введите номер новой строки, на которую вы хотите
       перейти.  Если вы введете номер строки, превышающий число строк в
       файле, во эта команда переместит вас на последнюю строку файла.
                              Команда Search...
       -----------------------------------------------------------------
            Команда Search (Поиск) выполняет  поиск  символьной  строки,
       начиная  от текущей позиции курсора.  Если курсор позиционируется
       на что-либо, напоминающее имя переменной, выводится подсказка по-
       иска,  инициализированная данным именем.  Кроме того,  если с по-
       мощью клавиши Ins вы отметили в файле блок,  то этот  блок  будет
       использован для инициализации подсказки поиска. Это позволяет вам
       избежать ввода строки, которая уже видна в файле.
            При поиске допускается задавать простые трафаретные символы:
       ?,  задающий один символ, и *, показывающую 0 или более символов.
       При достижении конца файла поиск не будет продолжен с его начала.
       Чтобы выполнить поиск по всему файлу, перейдите на начало файла с
       помощью клавиш Ctrl-PgUp.
                                Команда Next
       -----------------------------------------------------------------


            Команда Next (Следующий) выполняет поиск следующего  вхожде-
       ния  символьной  строки,  которую вы задали в команде Search (По-
       иск). Эту команду можно использовать только после команды Search.
            Иногда команда поиска,  найдя соответствие,  останавливается
       не  на  нужной строке,  а нужная строке находится дальше в файле.
       Команда Next позволяет вам возобновить поиск без повторного ввода

       TDeb 3.0 #1-3               = 203 =
       искомой строки.
                               Команда Origin
       -----------------------------------------------------------------
            Команда Origin (Начало) позиционирует вас на  тот  модуль  и
       номер  строки,  которые  соответствуют  текущему адресу программы
       (определяемому содержимым регистров CS:IP).  Если просматриваемый
       в данный момент модуль не является  модулем,  содержащим  текущий
       адрес программы, окно Module (Модуль) переключится, и будет выве-
       ден нужный модуль.  Данную команду полезно использовать после то-
       го,  как  вы  просмотрели  исходный код и хотите вернуться к тому
       месту, где в данный момент остановилась программа.

       TDeb 3.0 #1-3               = 204 =
                               Команда Goto...
       -----------------------------------------------------------------
            Команда Goto  (Перейти на...) позиционирует вас на любой ад-
       рес в программе. От вас требуется ввести соответствующий "адрес".
       При этом допускается вводить номер строки,  имя функции или шест-
       надцатиричный адрес.  Полное описание способов задания адреса со-
       держится в Главе 9.
            Эту команду можно вызвать, если просто начать вводить метку,
       на которую вы хотите перейти. Это приведет к выводу окна подсказ-
       ки (как  если бы вы использовали команду Run¦Execute to (Выполне-
       ние¦Выполнение до курсора)).  Для часто используемой команды  это


       является удобным сокращением.
                 Примечание: Если  адресу не соответствует строка исход-
            ного кода, то открывается окно CPU.
                                Команда Edit
       -----------------------------------------------------------------
            Команда Edit (Редактирование) позволяет выбрать  редактор, с
       помощью которого вы можете внести изменения в исходный файл прос-
       матриваемого модуля.  Задать команду,  запускающую ваш  редактор,
       можно с помощью программы установки  параметров  Турбо  отладчика
       TDINST.
                       Просмотр других файлов на диске
       -----------------------------------------------------------------
            С помощью окна File (Файл) вы можете проверить и модифициро-
       вать любой файл в вашей системе.  Просматривать файл можно в коде
       ASCII (текстовый вид) или в шестнадцатиричном виде,  либо в  виде
       шестнадцатиричных байт  данных  (для  этого  используются команда
       Display As, описанная далее в данной главе).

       TDeb 3.0 #1-3               = 205 =
                                  Окно File
       -----------------------------------------------------------------
            Окно File  (Файл)  можно  создать,  выбрав команду View¦File
       (Обзор¦Файл) из основного меню.  Для получения списка файлов  для
       выбора допускается использовать трафаретные символы DOS.
           г[*]=File: C:\tc\doc.h 197========================[ ][ ]¬
           ¦ char _Cdecl peekb (unsigned segment, unsigned offset);^
           ¦ void _Cdecl poke  (unsigned segment, unsigned offset, -
           ¦ void _Cdecl pokeb (unsigned segment, unsigned offset, -
           ¦ int  _Cdecl randbrd (struct fcb *fcb, int rcnt);      -
           ¦ int  _Cdecl segread (struct fcb *fcb, int rcnt);      -
           ¦ void _Cdecl setblock(unsigned segx, unsigned newsize);-
           ¦ int  _Cdecl setcbrk (int cbrkvalue);                  -


           ¦ int  _Cdecl setdate (struct date *datep);             -
           ¦ void _Cdecl setswrichar  (char ch);                   -
           ¦ void _Cdecl settime (struct time *timep);             -
           ¦ void _Cdecl setvect (int interruptno, void interrupt (-
           ¦ void _Cdecl setverify   (int value);                  -
           ¦ void _Cdecl sleep (unsigned seconds);                 -
           ¦ void _Cdecl sound (unsigned frequency);               v
           L<----------------------------------------------------->-
            Рис. 8.2 Окно File
            В окне File (Файл) выводится содержимое выбранного вами фай-
       ла. Имя просматриваемого файла,  а также номер строки, на которой
       в файле находится курсор, выводится в заголовке окна (как текст в
       коде ASCII).
            При первом создании окна File файл может выводиться  либо  в
       виде текста в коде ASCII,  либо в шестнадцатиричном виде, в зави-
       симости от того, рассматривает ли Турбо отладчик данный файл, как
       текстовый файл (ASCII) или как двоичные данные. С помощью команды
       локального меню  Display  As (Вывести,  как...) можно переключить
       режим вывода на экран (эта команда описана далее).

       TDeb 3.0 #1-3               = 206 =
           г[*]=File: C:\tc\doc.h 197========================[ ][ ]¬
           ¦0000: 2f 2a 09 64 6f 73 2e 68 ¦* dis.h                 ^
           ¦0008: 0d 0a 0d 0a 09 44 65 66      Def                 -
           ¦0010: 69 6e 65 73 20 73 74 72 ines str                 -
           ¦0018: 75 63 74 73 2c 20 75 6e ucts, un                 -
           ¦0020: 69 6f 6e 73 2c 20 6d 61 lons, ma                 -
           ¦0028: 63 72 6f 73 2c 20 61 6e cros, an                 -
           ¦0020: 63 20 66 75 6e 63 74 69 d functi                 -
           ¦0038: 6f 6e 73 20 74 6e 67 0d ons for                  -
           ¦0040: 64 65 61 6c 20 68 6e 4d dealing                  -


           ¦0048: 0a 09 77 69 20 61 20 4d   with M                 -
           ¦0050: 53 44 4f 53 41 49 6e 64 SDOS and                 -
           ¦0058: 20 74 68 65 63 50 6e 74  the Int                 -
           ¦0060: 65 6c 20 69 50 72 58 38 el iAPx8                 -
           ¦0068: 36 20 6d 69 41 72 6f 70 6 microp                 -
           ¦0070: 72 6f 63 65 63 73 6f 72 rocessor                 v
           L<----------------------------------------------------->-
            Рис. 8.3 Окно File с выводом шестнадцатиричных данных
                          Локальное меню окна File
       -----------------------------------------------------------------
            Локальное меню окна File (Файл) содержит команды для переме-
       щения по файлу на диске,  изменения характера вывода  содержимого
       файла на экран и внесения в файл изменений.
            Для вывода  локального меню окна File используйте комбинацию
       клавиш Alt-F10. Если разрешено использовать сокращения с клавишей
       Ctrl, то для непосредственного доступа к команде этого меню можно
       нажать клавишу Ctrl совместно с первой буквой нужной команды.
                 --------------------¬
                 ¦ Goto...           ¦   Переход
                 ¦ Search...         ¦   Поиск
                 ¦ Next              ¦   Следующий
                 +-------------------+
                 ¦ Display as  Ascii ¦   Вывести в виде...
                 ¦ File...           ¦   Файл
                 ¦ Edit              ¦   Редактирование
                 L--------------------
                                Команда Goto
       -----------------------------------------------------------------
            Эта команда позиционирует вас на строку с другим номером или
       смещением.  Если  вы просматриваете файл в текстовом виде (в коде
       ASCII),  введите номер строки, на которую вы хотите перейти. Если
       вы просматриваете текст в виде  шестнадцатиричных  байт,  введите


       смещение  относительно начала файла,  с которого вы хотите начать

       TDeb 3.0 #1-3               = 207 =
       вывод на экран.  При вводе смещения вы можете использовать полный
       анализатор выражений. Если вы зададите строку, номер которой пре-
       вышает число строк в файле, во эта команда переместит вас на пос-
       леднюю строку файла (в конец файла).
                               Команда Search
       -----------------------------------------------------------------
            Команда Search (Поиск) выполняет  поиск  символьной  строки,
       начиная от текущей позиции курсора (для ввода  символьной  строки
       вам выводится подсказка).  Если курсор позиционируется на что-ли-
       бо, напоминающее имя переменной, выводится подсказка поиска, ини-
       циализированная данным именем. Кроме того, если с помощью клавиши
       Ins вы отметили в файле блок,  то этот блок будет использован для
       инициализации подсказки поиска.  Это позволяет вам избежать ввода
       строки, которая уже видна в файле.
            Если файл выводится в коде ASCII, при поиске допускается за-
       давать простые трафаретные символы: ?, задающий один символ, и *,
       показывающую 0 или более символов.
           Если файл выводится в шестнадцатиричном виде,  то нужно зада-
       вать список байт,  состоящий из байтовых значений или заключенных
       в кавычки строк символов (используется тот  же  синтаксис  языка,
       что и при вводе выражений).
            Например, в языке Си список байт,  состоящий из шестнадцати-
       ричного числа 0408, вводится следующим образом:
            Ox0884
            Если текущим языком является Паскаль,  то тот же список байт
       вводится так:
            $0804
                 Примечание: Полная  информация о списках байт приведена
            в Главе 9.
            При достижении конца файла поиск не будет  продолжен  с  его
       начала. Чтобы выполнить поиск по всему файлу, перейдите на начало


       файла с помощью клавиш Ctrl-PgUp.
            Вы можете вызвать эту команду, просто начав набирать строку,
       которую хотите найти.  При этом,  как при команде Search (Поиск),
       будет выведено окно подсказки.
                                Команда Next
       -----------------------------------------------------------------
            Команда Next  (Следующий) выполняет поиск следующего вхожде-
       ния символьной строки,  которую вы задали в команде  Search  (По-
       иск).  Эту команду можно использовать только после команды Search

       TDeb 3.0 #1-3               = 208 =
       (Поиск).
            Иногда команда поиска,  найдя соответствие,  останавливается
       не  на  нужной строке,  а нужная строке находится дальше в файле.
       Команда Next позволяет вам возобновить поиск без повторного ввода
       искомой строки.
                             Команда Display As
       -----------------------------------------------------------------
            Команда Display As (Вывести как...)  позволяет переключаться
       между выводом файла в виде текста ASCII и в шестнадцатиричном ви-
       де.  При выборе вывода на экран в коде ASCII файл выводится в та-
       ком виде, как вы видите его при работе с редактором или текстовым
       процессором.  Если вы выберете  шестнадцатиричный  вывод,  каждая
       строка будет начинаться с шестнадцатиричного смещения в файле. На
       строке может выводиться 8 или 16 байт данных,  в  зависимости  от
       ширины области окна. Справа от шестнадцатиричного вывода байт вы-
       водятся соответствующие каждому байту символы.Поскольку может вы-
       водиться полный набор символов,  байтовые значения < 32 или > 127
       выводятся на экран в виде соответствующих символов.
                               Команда File...
       -----------------------------------------------------------------
            Команда File (Файл) позволяет вам переключиться  на просмотр


       другого файла. Для получения списка файлов для выбора допускается
       использовать трафаретные символы DOS, либо можно ввести имя конк-
       ретного файла,  который и будет загружен. Если вы хотите просмат-
       ривать на экране два различных файла одновременно,  то для созда-
       ния    другого    окна    File    (Файл)    используйте   команду
       View¦Ahother¦File (Обзор¦Другой¦Файл).
                                Команда Edit
       -----------------------------------------------------------------
            Если вы просматриваете файл в  виде  текста  ASCII,  команда
       Edit  (Редактирование)  позволяет  вам  вносить в файл изменения,
       вызвав редактор, выбранный с помощью программы установки парамет-
       ров отладчика TDINST.
            Если вы просматриваете файл в виде  шестнадцатиричных  байт,
       то  отладчик  не  запускает редактор.  Вместо этого вам выводится
       подсказка для замены байт в текущей позиции. Введите список байт,
       как это делается в команде поиска.
                Примечание: Полное  описание  списков  байт содержится в
            Главе 9.
       TDeb 3.0 #3-3                 = 1 =
     Глава 17. Турбо отладчик для Windows (TDW)........................8
       Требования для запуска TDW......................................8
       Установка TDW...................................................9
       Настройка конфигурации TDW.....................................10
       Использование параметров командной строки TDW..................10
       Использование TDINST для TDW...................................12
       Использование TDW..............................................12
       Различия между TDW и Турбо отладчиком..........................12
       Новые средства TDW.............................................14
       Регистрация сообщений Windows..................................14
       Выбор окна.....................................................16


       Добавление выбранного окна.....................................16
       Выбор окна для прикладной программы, использующей
        ObjectWindows.................................................17
       Получение описателя окна.......................................18
       Задание окна с разрешенной поддержкой ObnjectWindows...........19
       Добавление выбора окна с разрешенной поддержкой
        ObjectWindows.................................................19
       Отмена выбора окна.............................................21
       Задание класса сообщений и действия............................22
       Добавление класса сообщений....................................22
       Удаление класса сообщений......................................25
       Просмотр сообщений.............................................26
       Замечания по сообщениям окна...................................26
       Получение содержимого памяти и списка модулей..................28
       Получение списка содержимого...................................29
       Листинг содержимого локальной динамически распределяемой
        области.......................................................30
       Формат вывода локальной динамически распределяемой области.....32
       Получение списка модулей.......................................32
       Формат вывода списка модулей Windows (Таблица 17.7)............33
       Отладка динамически компонуемых библиотек (DLL)................33
       Использование диалогового окна Load Modules or DLLs............35
       Переход к другому исходному модулю.............................36
       Работа с DLL и программами.....................................36
       Добавление DLL в список DLLs & Programs........................37
       Установка параметров отладки для DLL...........................39
       Управление загрузкой TDW таблиц имен идентификаторов DLL.......39
       Отладка начального кода загрузки DLL...........................39


       Преобразование описателей памяти в адреса......................42
       Рекомендации по отладке........................................42
       Сообщения об ошибках TDW.......................................44
     Глава 18. Отладка прикладной программы для Windows...............45
       Примеры программ...............................................45
       Компиляция и компоновка демонстрационных программ..............47
       Отладка программы BCWDEMOA.....................................47
       Принятие решения о дальнейших действиях........................47
       Завершение BCWDEMOA............................................48
       Регистрация сообщений..........................................50
       Анализ протокола сообщений.....................................50
       Поиск ошибки...................................................51
       Пошаговое выполнение программы.................................52
       Анализ DoPaint.................................................55

       TDeb 3.0 #3-3                 = 2 =
       Нахождение ошибки..............................................55
       Завершение BCWDEMOA............................................55
       Отладка BCWDEMOB...............................................56
       Переключение из программы......................................57
       Тестирование программы.........................................57
       Принятие решения...............................................57
       Сравнение списков объектов глобальной памяти...................58
       Нахождение ошибки: функциональный подход.......................59
       Выбор элементов меню...........................................59
       Рисование фигуры...............................................60
       Рисование фигуры (и нахождение позиции ошибки).................60
       Перерисовка экрана.............................................62
       Заключение.....................................................62


     Глава 19. Отладка программы, использующей ObjectWindows..........63
       О программе....................................................63
       Определение оконного типа ScribbleWindow.......................64
       Конструктор ScribbleWindow.....................................66
       GetWindowClass.................................................66
       WMRButtonDown..................................................66
       WMLButtonUp....................................................66
       WMRButtonDown..................................................66
       WMMouseMove....................................................66
       Подпрограммы цвета пера........................................67
       Создание прикладной программы..................................68
       Отладка программы..............................................68
       Выявление первой ошибки........................................68
       Поиск функции, которая вызывает Windows........................68
       Отладка функции WMLButtonDown..................................70
       Отладка MoveTo.................................................70
       Исправление ошибки.............................................70
       Проверка исправлений...........................................72
       Поиск ошибки назначения цвета пера.............................72
       Установка точки останова по сообщению окна.....................72
       Задание точки останова по сообщению окна по описателю..........74
       Установка точки прерывания по сообщению на объекте окна........76
       Проверка wParam................................................76
       Проверка исправления...........................................78
       Поиск ошибки рисования за пределом экрана......................78
       Регистрация сообщений Windows..................................79
       Обнаружение ошибки.............................................79
       Исправление ошибки.............................................79


       Проверка исправлений...........................................82
       Поиск ошибки стирания экрана...................................82
       Анализ причины ошибки..........................................83
       Исправление ошибки.............................................83
       Проверка исправления...........................................83
     Глава 20. Отладка резидентных программ и драйверов
        устройств.....................................................84
       Что такое резидентная программа?...............................84
       Отладка резидентной в памяти программы.........................85
       Что такое драйвер устройства?..................................88
       Отладка драйвера устройства....................................90
       Завершение сеанса отладки......................................92

       TDeb 3.0 #3-3                 = 3 =
     Приложение A. Параметры командной строки.........................94
     Приложение B. Технические замечания..............................96
       Измененный адрес загрузки и свободная память...................96
       Сбой системы...................................................96
       Трассировка в DOS и переключение идентификатора процесса.......97
       Использование сопроцессора 8087/80287 и эмулятора..............97
       Прерывания, используемые Турбо отладчиком......................97
       Прерывание 1/Прерывание3.......................................97
       Прерывание 2...................................................97
       Прерывание 9...................................................98
       Отладка при использовании прерываний INT3 и INT1...............98
       Сохранение содержимого и переключение режима экрана............98
       Потребности в памяти...........................................99
       Поддержка EMS..................................................99
       Сохранение и восстановление вектора прерываний................100


     Приложение C. Ключевые слова встроенного Ассемблера.............101
       Мнемонические обозначения команд процессора 80386.............102
       Мнемонические обозначения команд процессора 80486 Таблица C.3.102
       Регистры процессора 80386         Таблица C.4.................102
       Регистры центрального процессора      Таблица C.5.............102
       Специальные зарезервированные слова    Таблица C.6............102
       Мнемонические обозначения команд сопроцессора 8087/80287......103
       Мнемонические обозначения команд сопроцессора 80387 ..........103
     Приложение D. Настройка Турбо отладчика.........................104
       Запуск программы TDINST.......................................104
       Параметры командной строки TDWINST............................105
       Параметр -C...................................................105
       Параметр -W...................................................106
       Параметр -P...................................................106
       Установка цветов экрана.......................................106
       Настройка цветов экрана.......................................106
       Окна..........................................................107
       Диалоговые окна...............................................109
       Меню..........................................................111
       Экран.........................................................111
       Цвета, используемые по умолчанию..............................112
       Установка параметров экрана Турбо отладчика...................112
       Переключатели Display Swapping................................113
       Переключатель Integer Format..................................113
       Параметр Beginning Display....................................114
       Переключатель Screen Lines....................................114
       Tab Size......................................................114
       Maximum Tiled Watch...........................................114


       Параметр Fast Screen Update...................................114
       Параметр Permit 43/50-Line Mode...............................115
       Параметр Full Graphics Save...................................115
       Переключатель User Screen Updating............................115
       Поле ввода Log List Length....................................117
       Поле ввода Floating Precision.................................117
       Поле ввода Range Inspect......................................117
       Установка параметров Турбо отладчика..........................117

       TDeb 3.0 #3-3                 = 4 =
       Параметр Directories..........................................117
       Параметр Input and Prompting..................................119
       Диалоговое окно Source Debugging..............................121
       Параметр Ignore Symbol Case...................................121
       Параметр OWL window messages..................................121
       Диалоговое окно Miscellaneous Options.........................123
       NMI intersept (Перехват немаскируемого прерывания)............124
       Use Expanded Memory (Использование расширенной памяти)........124
       Change Process ID (Смена идентификатора процесса).............124
       Full Trace History (Полный протокол трассировки)..............124
       Параметр International (Международный)........................125
       DOS Shell Swap Size...........................................126
       Spare Symbol Memory...........................................126
       Remote Type (Тип удаленной отладки)...........................126
       Remote Link Port (Порт удаленной связи).......................126
       Link Speed (Cкорость коммуникаций)............................126
       Network Local Name (Локальное имя в сети).....................126
       Network Remote Name (Удаленное имя в сети)....................126
       Задание режимов вывода........................................128


       Параметры командной строки и их эквиваленты в программе
        TDINST.......................................................129
       В процессе работы.............................................131
       Сохранение файла конфигурации.................................131
       Модификация файла TD.EXE......................................131
       Выход из программы TDINST.....................................131
     Приложение E. Удаленная отладка.................................133
       Требования к программному и аппаратному обеспечению...........134
       Отладка удаленных прикладных программ DOS.....................134
       Установка удаленной системы...................................135
       Настройка конфигурации TDREMOTE...............................136
       Настройка TDREMOTE............................................136
       Удаленный драйвер DOS.........................................137
       Запуск удаленного последовательного драйвера..................137
       Запуск удаленного драйвера LAN................................138
       Как установить удаленную связь в DOS..........................138
       Последовательное соединение...................................138
       Соединение через LAN..........................................139
       Удаленная отладка прикладных программ для Windows.............140
       Подготовка удаленной системы..................................140
       Конфигурация WREMOTE..........................................141
       Установка WREMOTE и WRSETUP в Windows.........................142
       Связь через последовательный порт.............................142
       Связь через LAN...............................................144
       Параметры командной строки программы WREMOTE..................145
       Запуск удаленного драйвера Windows............................145
       Установка связи с удаленной системой с Windows................145
       Связь через последовательный порт.............................146


       Связь через LAN...............................................146
       Загрузка программы в удаленную систему........................147
       Сеансы удаленной отладки......................................147
       Возможные затруднения.........................................148
       Сообщения утилиты TDREMOTE....................................149
       Сообщения программы WREMOTE...................................152

       TDeb 3.0 #3-3                 = 5 =
     Приложение F. Подсказки и сообщения об ошибках..................153
       Подсказки.....................................................153
       Ошибки........................................................162
       Фатальные ошибки..............................................162
       Сообщения об ошибках..........................................164
       ')' expected..................................................164
       ':' expected..................................................164
       ']' expected..................................................164
       Already logging to a file.....................................165
       Ambiguous symbol name.........................................165
       Bad or mission configuration file name........................165
       Cannot access an inactive scope...............................165
       Cannot be changed.............................................165
       Can't do this when Turbo Debugger is resident.................165
       Can't do this when user program is resident...................165
       Can't execute DOS command processor...........................166
       Can't go resident until user program terminates...............166
       Can't set a breakpoint at this address........................166
       Can't set any more hardware breakpoints.......................166
       Can't set hardware condition on this breakpoint...............166
       Can't have more then one segment override.....................166


       Can't set a breakpoint at this location.......................167
       Can' t set that sort of hardware breakpoint....................167
       Can't set hardware condition on this breakpoint...............167
       Can't swap user program to disk...............................167
       Constructors and destructors cannot be called.................167
       Count value too large.........................................167
       Ctlr-Alt-SysRq interrupt. System crash possible. Continue?....168
       Destination too far away......................................168
       Divide by zero................................................168
       DLL already in list...........................................168
       Edit program not specified....................................168
       Error loading program.........................................169
       Error opening file___.........................................169
       Error opening log file___.....................................169
       Error reading block into memory...............................169
       Error saving configuration....................................169
       Error swaping in user program, press key to load..............169
       Error writing block on disk...................................169
       Error writing log file........................................170
       Error writing to file.........................................170
       Expression too complex........................................170
       Expressions with side effects not permitted...................170
       Extra input after expression..................................170
       Help file ___ not found.......................................171
       Illegal procedure or function call............................171
       Immediate operand out of range................................171
       Initialization not complete...................................171
       Invalid argument list.........................................171


       Invalid character constant....................................172
       Invalid format string.........................................172
       Invalid function parameter(s).................................172
       Invalid instruction...........................................172

       TDeb 3.0 #3-3                 = 6 =
       Invalid instruction mnemonic..................................172
       Invalid number entered........................................173
       Invalid operand(s)............................................173
       Invalid operator/data combination.............................173
       Invalid pass count entered....................................173
       Invalid register..............................................173
       Invalid register combination in address expression............173
       Invalid register in address expression........................174
       Invalid symbol in operand.....................................174
       Invalid type cast.............................................174
       Invalid value entered.........................................174
       Keyword not a symbol..........................................175
       Left side not a record, structure or union....................175
       No coprocessor or emulator installed..........................175
       No hardware debugging avaliable...............................175
       No help for this context......................................175
       No modules with line number information.......................176
       No previous search expression.................................176
       No program loaded.............................................176
       No source file for module___..................................176
       No type information for this symbol...........................176
       Not a function name...........................................176
       Not a record, structure, or union member......................177


       Not enough memory for selected operation......................177
       Not enogh memory to load program..............................177
       Not enough memory to load symbol table........................177
       Only one operand size allowed.................................178
       Operand must be memory location...............................178
       Operand size unknown..........................................178
       Overlay not loaded............................................178
       Path not found................................................178
       Path or file not found........................................179
       Program has no object or classes..............................179
       Program has no symbol table...................................179
       Program linked with wrong linker version......................179
       Program not found.............................................179
       Register cannot be used with this operator....................180
       Register or displacement expected.............................180
       Run out of space for reystroke macros.........................180
       Search expression not found...................................180
       Source file ___ not found.....................................180
       Symbol not found..............................................181
       Symbol table not found........................................181
       Syntax error..................................................181
       Too many files match wildcard mask............................181
       Type EXIT to return to Turbo Debugger.........................181
       Unexpected end of line........................................181
       Unknown character.............................................182
       Unknown record, union or structure name.......................182
       Unknown symbol................................................182
       Unterminated string...........................................182


       Value must be between nn and nn...............................182
       Value out of range............................................182

       TDeb 3.0 #3-3                 = 7 =
       Video mode not avaliable......................................183
       Video mode swithed while flipping pages.......................183
       You are not debugging a Window program........................183
       Информационные сообщения......................................184
       Waiting for handshake from TDREMOTE (Ctrl-Break to quit)......184

       TDeb 3.0 #3-3                 = 8 =
                 Глава 17. Турбо отладчик для Windows (TDW)
       -----------------------------------------------------------------
            Турбо отладчик для Windows (TDW) позволяет отлаживать  прик-
       ладные  программы,  написанные для Microsoft Windows версии 3.0 и
       старше. Он работает под управлением Windows на той же машине, что
       и  отлаживаемая  программа,  и выполняет переключения между собс-
       твенными экранами и экранами отлаживаемой  прикладной  программы,
       как это делает Турбо отладчик.
            Отладка происходит  во  многом  аналогично отладке с помощью
       Турбо отладчика, за исключением того, что здесь вы получаете дос-
       туп к информации, являющейся специфичной для Windows, например:
            - Сообщения,  принимаемые  и  посылаемые  окнами  прикладной
              программы;
            - Глобальная динамически распределяемая область памяти;
            - Локальная динамически распределяемая область памяти;
            - Полный список  модулей  (включая  динамически  компонуемые
              библиотеки DLL), загружаемых Windows;
            - Отладка динамически компонуемых библиотек (DLL).
                         Требования для запуска TDW
       -----------------------------------------------------------------
            Отладчик TDW работает в стандартном  или  улучшенном  режиме
       386, что означает необходимость иметь компьютер с процессором как


       минимум 80286 или выше, и как минимум один мегабайт памяти.
            TDW поддерживает только стандартные графические режимы дисп-
       лея:  CGA,  EGA,  VGA,  SVGA  и  монохромную  графическую   плату
       Hercules. Если  вы  используете необычный драйвер,  то прежде чем
       запускать Windows и TDW,  перейдите на стандартный драйвер.  Если
       вы  попытаетесь использовать при работе с TDW нестандартный драй-
       вер,  то не сможете переключаться между экранами TDW и прикладной
       программы.
            Используя DLL с именем TDVIDEO.DLL  TDW  поддерживает  Super
       VGA. С  TDW распространяется множество DLL,  которые поддерживают
       различные платы Super VGA (описанные в файле README на  дистрибу-
       тивной дискете).  Чтобы использовать c TDW эти DLL, скопируйте их
       в каталог, где находится TDW.EXE, и назовите TDVIDEO.DLL.
            Если  вы  не найдете DLL, поддерживающую  плату  Super  VGA,
       свяжитесь с фирмой Borland.
            Как и Турбо отладчик, TDW может использовать второй монитор,
       подключенный  к компьютеру,  что дает возможность на одном экране

       TDeb 3.0 #3-3                 = 9 =
       просматривать вывод TDW,  а на другом - прикладной программы. Для
       этого  нужно  запустить TDW с параметром командной строки -do или
       выполнить утилиту TDINST, установив User Screen Updating в значе-
       ние Other display.
                                Установка TDW
       -----------------------------------------------------------------
            При установке в системе Турбо отладчика программа  установки
       помещает файлы, относящиеся к работе в Windows, в тот же каталог,
       что и файлы Турбо отладчика. Это файлы:
            - TDW.EXE, собственно отладчик TDW;
            - TDWHELP.TDH, файлы системы подсказки TDW;
            - WRSETUP.EXE,  утилита настройки конфигурации для программы
              удаленной отладки в Windows WREMOTE;
            - WREMOTE.EXE,  программа удаленной отладки прикладных прог-


              рамм для Windows.  (Удаленная отладка в Windows описана  в
              Приложении E);
            - WINDEBUG.DLL,  динамически компонуемая библиотека, необхо-
              димая для выполнения TDW и WREMOTE;
            - TDDEBUG.386,  программа, которую загружает Window для под-
              держки прерывания программы по Ctrl-Alt-SysRq и аппаратной
              отладки.
            Процесс установки создает пиктограммы  для  TDW,  WRSETUP  и
       WREMOTE  и помещает их под группой Windows Applications (приклад-
       ные программы для Windows) менеджера программ Windows.  Вы можете
       запустить  одну из этих программ,  выбрав соответствующую пиктог-
       рамму, как и для любых других прикладных программ Windows.

       TDeb 3.0 #3-3                = 10 =
                         Настройка конфигурации TDW
       -----------------------------------------------------------------
            Как и в случае работы с Турбо отладчиком,  вы можете настро-
       ить  конфигурацию TDW двумя способами - при помощи параметров ко-
       мандной строки или при помощи утилиты TDINST  (с  параметром  ко-
       мандной строки -w).
               Использование параметров командной строки TDW
       -----------------------------------------------------------------
            Как и для Турбо отладчика, вы можете установить конфигурацию
       TDW, используя различные параметры командной строки,  за которыми
       может следовать необязательное имя программы со своими  собствен-
       ными параметрами.  Имени программы может предшествовать имя марш-
       рута.
            Поскольку TDW является программой для Windows,  вы  вероятно
       будете вводить параметры командной строки либо при помощи команды
       File¦Run (Файл¦Выполнение) менеджера программ,  либо  при  помощи
       команды File¦Properties (Файл¦Свойства) менеджера программ, чтобы
       изменить свойства командной строки пиктограммы TDW.  Вы также мо-


       жете запустить Windows из командной строки DOS и использовать ко-
       манду TDW,  за которой могут в произвольном порядке следовать па-
       раметры  командной  строки,  либо имя программы с параметрами или
       без,  либо и то,  и другое - и  все  это  как  аргументы  команды
       Windows.
            Синтаксис командной строки для TDW имеет следующий вид:
            TDW [параметры] [имя_программы [аргументы_программы]]
            Отладчик TDW имеет меньше параметров командной  строки,  чем
       Турбо отладчик TD.  За исключением параметра -t,  используемые им
       параметры совпадают с параметрами Турбо отладчика,  которые расс-
       матривались выше.
            Ниже приводятся параметры командной строки TDW:
        -----------T---------------------------------------------------¬
        ¦-?, -р    ¦  Обращение  за  подсказкой  о параметрах командной¦
        ¦          ¦  строки TDW.                                      ¦
        ¦          ¦                                                   ¦
        ¦-c<файл>  ¦  Использование файла конфигурации <файл>.         ¦
        ¦          ¦                                                   ¦
        ¦-do       ¦  Запуск TDW на вторичном дисплее.                 ¦
        ¦          ¦                                                   ¦
        ¦-ds       ¦  Обновление   экранов  путем  свопинга  (подкачки)¦
        ¦          ¦  страниц.                                         ¦
        ¦          ¦                                                   ¦
        ¦-l        ¦  Запуск в режиме Ассемблера. Отладка  кода началь-¦
        ¦          ¦  ной загрузки библиотеки DLL.                     ¦

       TDeb 3.0 #3-3                = 11 =
        ¦          ¦                                                   ¦
        ¦-p        ¦  Использование "мыши".                            ¦
        ¦          ¦                                                   ¦


        ¦-sc       ¦  Игнорировать регистр в именах идентификаторов.   ¦
        ¦          ¦                                                   ¦
        ¦-sdкаталог¦  Установить в качестве каталога с исходными файла-¦
        ¦          ¦  ми указанный каталог.                            ¦
        ¦          ¦                                                   ¦
        ¦-tкаталог ¦  Установить в качестве начального каталога  запус-¦
        ¦          ¦  ка указанный каталог.                            ¦
        L----------+----------------------------------------------------
            Один из этих параметров командной строки, параметр t, досту-
       пен только в TDW. Этот параметр изменяет начальный каталог запус-
       ка TDW, т.е. каталог, в котором TDW ищет файл конфигурации и фай-
       лы .EXE,  не заданные с полным маршрутом. Синтаксис этой парамет-
       ра:
            -tимя_каталога
            Этот параметр позволяет установить только один начальный ка-
       талог запуска.  Если  ввести с помощью одного параметра несколько
       таких каталогов, то TDW все их игнорирует. Если указать несколько
       параметров -t  с разными каталогами,  то TDW использует последний
       из них.

       TDeb 3.0 #3-3                = 12 =
                        Использование TDINST для TDW
       -----------------------------------------------------------------
            Чтобы воспользоваться  программой TDINST для TDW,  запустите
       TDINST с параметром командной строки -w.  TDINST для TDW работает
       аналогично TDINST для Турбо отладчика,  за исключением того,  что
       файл конфигурации по умолчанию будет называться  TDCONFIG.TDW,  и
       доступно меньше  параметров.  (См.  список  параметров  командной
       строки TDW в предыдущем разделе).
            Описание использования TDINST см. в Приложении D.
                              Использование TDW
       -----------------------------------------------------------------


            При запуске TDW он появляется в полноэкранном символьном ре-
       жиме DOS, а не в окне. Несмотря на такой внешний вид,  TDW -  это
       прикладная программа Windows и работать может только в Windows.
            В отличие от других работающих в Windows программ, вы не мо-
       жете использовать оперативные клавиши Windows (типа  Alt-Esc  или
       Ctrl-Esc)  для  выхода из экрана TDW.  Однако,  если отлаживаемая
       прикладная программа является активной (курсор активен в одном из
       ее окон),  вы  можете использовать эти клавиши или "мышь" для пе-
       реключения на другие программы.
            Отладка в TDW во многом похожа на отладку в Турбо отладчике,
       за исключением нескольких свойств Турбо отладчика,  которые рабо-
       тают иначе,  и нескольких дополнительных свойств, помогающих при-
       отладке программ для Windows.
                    Различия между TDW и Турбо отладчиком
       -----------------------------------------------------------------
            Различными являются следующие свойства:
            - Переключение из вашей прикладной программы в TDW  выполня-
              ется при помощи комбинации клавиш Ctrl-Alt-SysRq. Эта опе-
              рация аналогична использованию Ctrl-Break для переключения
              из прикладной программы для DOS в Турбо отладчик,  за иск-
              лючением того,  что при этом прикладная программа для  DOS
              завершается, а для Windows - только приостанавливается.
            - Параметр  командной  строки -l не только позволяет отлажи-
              вать начальный код загрузки вашей прикладной  программы, а
              также позволяет отлаживать ассемблерный начальной код заг-
              рузки любой DLL, компонуемой с вашей программой.
            - Если это возможно, выполните вашу программу до ее нормаль-
              ного  конца  или  используйте команду System для выхода из
              нее до выхода из TDW или загрузки другой программы для от-


              ладки. Нештатный выход из прикладной программы для Windows
              может привести к тому,  что не будут освобождены ее ресур-

       TDeb 3.0 #3-3                = 13 =
              сы,  что  в  свою очередь может вызвать проблемы у TDW или
              другой прикладной программы.
            - Запись нажатий клавиш не выполняется.
            - Нельзя отлаживать драйверы устройств или резидентные прог-
              раммы.
            - Не поддерживается аппаратная отладка. (Если хотите, вы мо-
              жете оставить устройство TDH386.SYS в CONFIG.SYS.  Это  не
              помешает работе Windows или TDW).
            - Следующие команды меню File недоступны,  поскольку TDW ра-
              ботает под управлением Windows:
                 * DOS Shell, т.к. оболочка отсутствует;
                 * Resident,  т.к.  TDW  не может по завершении остаться
                   резидентным;
                 * Table Relocate, поскольку вы не можете установить ба-
                   зовый сегмент таблицы символических имен.

       TDeb 3.0 #3-3                = 14 =
                             Новые средства TDW
       -----------------------------------------------------------------
            Новые свойства,   поддерживаемые   отладчиком  программ  для
       Windows:
            - Окно просмотра Windows Messages (Сообщения Windows), пока-
              зывающее сообщения,  передаваемые окнам в вашей программе.
            - В окне регистрации Log вы имеете возможность выводить сле-
              дующие три типа данных:
                 * Сегменты данных, расположенные в локальной динамичес-
                   ки распределяемой области вашей прикладной программы;
                 * Сегменты  данных,  расположенные в глобальной динами-
                   чески распределяемой области;
                 * Полный список модулей,  составляющих программу, вклю-
                   чая динамически компонуемые библиотеки (DLL);


                 * Приведение типа выражений от логических номеров памя-
                   ти к дальним указателям.
            - Отладка динамически компонуемых библиотек (DLL).
            - Параметр  командной  строки -t,  позволяющий устанавливать
              начальный каталог запуска TDW,  чтобы можно было использо-
              вать файл конфигурации или файлы .EXE из этого каталога.
                        Регистрация сообщений Windows
       -----------------------------------------------------------------
            Для трассирования передаваемых в окна вашей прикладной прог-
       раммы сообщений   выберите    команду    View¦Windows    Messages
       (Обзор¦Сообщения Windows),  чтобы  открыть окно Windows Messages.
       Это окно показывает сообщения,  которые Windows посылает  в  одно
       или более окон вашей программы.

       TDeb 3.0 #3-3                = 15 =
            Окно Windows  Messages  (Сообщения  Windows) состоит из трех
       областей: области выбора окна Window Selection (верхняя левая об-
       ласть), области  класса  сообщений  Message Class (верхняя правая
       область) и области сообщений Messages (нижняя область). Сообщения
       показывает область Messages.
           г=[*]===Windows messages===================3======[ ][ ]¬
           ¦Windowproc wndproc-------¦Log-message-WM-PAINT---------¦
           ¦                         ¦                             ¦
           ¦                         ¦                             ¦
           ¦                         ¦                             ¦
           ¦--------------------------<--------------------------->¦
           ¦Hwnd:2214 wParam:0000 lParam:000000000 (000f) WM PAINT ¦
           L=======================================================-
             Рис. 17.1 Окно Windows Messages

       TDeb 3.0 #3-3                = 16 =
                                 Выбор окна
       -----------------------------------------------------------------


            ---------------¬
            ¦ Add...       ¦         Добавить
            ¦ Remove       ¦         Удалить
            ¦ Delete All   ¦         Удалить все
            L---------------
            Прежде чем вы сможете регистрировать  сообщения,  вы  должны
       сначала указать, для которого окна будут регистрироваться сообще-
       ния. Это выполняется в верхней левой области, области выбора окна
       Window Selection. Локальное меню этой области (активируемое нажа-
       тием клавиш  Alt-F10) позволяет добавить выбранное окно,  удалить
       выбранное окно или удалить все выбранные окна.
                         Добавление выбранного окна
       -----------------------------------------------------------------
            Для того, чтобы добавить выбранное окно, вы можете либо выб-
       рать  команду  Add (Добавление) из локального меню области Window
       Selection (Выбор окна),  либо просто начать ввод в области. В том
       и другом случае вы получите окно диалога:
            Вы можете  в этом окне ввести либо имя подпрограммы, которая
       обрабатывает сообщения для окна (выбрав  "кнопку"  Window  Proc),
       либо значение логического номера (выбрав "кнопку" Handle). Введи-
       те столько имен подпрограмм или логических номеров, сколько нужно
       для трассировки сообщений для ваших окон.
                  г[*]==Add window or handle to watch======¬
                  ¦                                        ¦
                  ¦ Window identifier                      ¦
                  ¦ -----------------              OK      ¦
                  ¦                                ------  ¦
                  ¦                                Cancel  ¦
                  ¦ Identify by                    ------  ¦
                  ¦   (*) Window proc              Help    ¦
                  ¦   ( ) Handle                   ------  ¦
                  ¦                                        ¦


                  L========================================-
            Рис. 17.2 Диалоговое окно Add Window
            Add window or handle to watch - добавить окно  или описатель
       для просмотра;  Window identifier - идентификатор окна;  Identify
       by - идентификация по...;  Window proc - процедура окна; Handle -
       описатель; OK - нормально; Cancel - отмена; Help - справка.
                 Примечание: Ввод в этом окне первого значения также ус-
            танавливает класс сообщений в "Log all messages" ("Регистра-
            ция всех сообщений").

       TDeb 3.0 #3-3                = 17 =
            Легче указать окно по имени подпрограммы, обрабатывающей его
       сообщения  (например,  WndProc),  поскольку  вы можете ввести имя
       подпрограммы в любой момент после загрузки вашей программы.
            Если вы предпочитаете использовать имя переменной с логичес-
       ким номером, вы должны сначала перейти по программе к строке, где
       этой переменной присваивается логический номер.  (Для  пошагового
       перемещения по программе служат клавиши F7 или F8). Если вы пыта-
       етесь ввести  имя переменной до этого оператора присваивания, TDW
       не сможет принимать сообщения для этого логического номера.
       Выбор окна для прикладной программы, использующей ObjectWindows
       -----------------------------------------------------------------
            Если вы   отлаживаете   прикладную  программу,  использующую
       ObjectWindows, и выбираете  команду  View¦Windows  Messages  (Об-
       зор¦Сообщения Windows), то по умолчанию выводится диалоговое окно
       Windows Messages (Сообщения Windows),  показанное на  Рис.  17.1.
       Для стандартных   программ   Windows   и  программ,  использующих
       ObjectWindows, это окно работает одинаково,  только имя процедуры
       Windows вы  использовать не сможете.  Вместо этого для того окна,
       сообщения которого вы хотите  регистрировать  или  по  сообщениям


       которого хотите установить прерывания,  нужно использовать описа-
       тели окна.

       TDeb 3.0 #3-3                = 18 =
                          Получение описателя окна
       -----------------------------------------------------------------
            Перед тем, как вы сможете использовать описатель объекта ок-
       на, нужно выполнить программу и пройти то место, где он инициали-
       зируется. Для этого можно использовать несколько методов.
            - Простейший  способ  состоит  в  запуске  вашей программы и
              возврате в TDW по Ctrl-Alt-SysRq.
            - Другая  возможность заключается в задании точки останова в
              подпрограмме обработки сообщений (примером  которой  может
              быть подпрограмма, обрабатывающая сообщения WM_MOUSEMOVE),
              и последующем выполнении в окне действия, которое приведет
              к срабатыванию точки останова (например,  перемещения "мы-
              ши").
            - Если основные проблемы у вам заключаются в самом окне (та-
              кие, как невосстановимая ошибка прикладной программы, воз-
              никающая при первоначальном выводе окна),  получать указа-
              тель окна придется более длинным путем.
              Так как описатель инициализируется  функцией ObjectWindows
              CreateWindow, и данная функция выполняется после того, как
              вы инициализируете окно,  то  нужно переопределить в клас-
              се  окна  эту функцию и для получения описателя установить
              на ней точку прерывания.
              Например, в следующем исходном коде данная функция переоп-
              ределяется для  класса   окна   ScribbleWindow   программы
              TDODEMO:
                void ScribbleWindow()
                {
                         TWindow::SetupWindow();
                }
              Далее позиционируйте курсор на строке после оператора ини-
              циализации и нажмите F4 для выполнения  программы  до  той


              точки,  где  инициализируется описатель окна,  диалогового
              окна или управляющего элемента. В данном примере нужно по-
              зиционировать  курсор  на  закрывающей  квадратной  скобке
              функции SetupWindow.
            После того,  как  описатель инициализирован и вы вернулись в
       TDW, выбрав команду Data¦Inspect (Данные¦Проверка)  и  введя  имя
       соответствующего объекта          окна         (в         TDODEMO
       WinMain#MyApp.MainWindow), можно получить описатель окна. Найдите
       элемент данных  HWindow  и скопируйте его в окно Clipboard (нажав
       клавиши Shift-F3).  После этого вы  можете  вставлять  содержимое
       HWindow в  качестве  описателя в диалоговом окне Add (Добавление)
       или в верхней левой области окна Window Messages (нажмите клавиши
       Shift-F4 в текстовом поле ввода диалогового окна).

       TDeb 3.0 #3-3                = 19 =
            Задание окна с разрешенной поддержкой ObnjectWindows
       -----------------------------------------------------------------
            Если вы запускаете программу TDINST с  параметром  командной
       строки -w,  то можете включить в TDW поддержку сообщений окна для
       ObjectWindows. Когда данный параметр включен, вы можете использо-
       вать имена оконных объектов,  как если бы они описывались в вашей
       прикладной программе.
            При выборе команды  View¦Windows  Messages  (Обзор¦Сообщения
       окна) при  включенном  параметре OWL на экран выводится следующий
       экран:
           г=[*]===OWL Windows Messages===============3======[ ][ ]¬
           ¦Window-object-11c5:006e--¦Log-all-messages-------------¦
           ¦                         ¦                             ¦
           ¦                         ¦                             ¦
           ¦                         ¦                             ¦
           ¦-------------------------+<--------------------------->¦


           ¦Hwnd:2214 wParam:0000 lParam:000000000 (000f) WM PAINT ¦
           ¦                                                       ¦
           ¦                                                       ¦
           ¦                                                       ¦
           L=======================================================-
            Рис. 11. 1 Окно Windows  Messages  с  разрешенной  поддержкой
       ObjectWindows
                   --------------¬
                   ¦ Add...      ¦      Добавить
                   ¦ Remove      ¦      Отменить
                   ¦ Delete All  ¦      Удалить все
                   L--------------
            Перед тем,  как  вы сможете регистрировать сообщения,  нужно
       сначала указать,  для какого окна регистрируются  сообщения.  Это
       можно сделать в левой верхней области - области выбора окна.  Ло-
       кальное меню области (которое активизируются с помощью клавиш Alt
       -F10) позволяет вам добавить окно, удалить окно, или отменить все
       выбранные окна.
        Добавление выбора окна с разрешенной поддержкой ObjectWindows
       -----------------------------------------------------------------
            Перед тем,  как  вы сможете использовать объект окна,  нужно
       выполнить программу и пройти то место,  где он  инициализируется.
       Обычно объект инициализируется в операторе, аналогичном следующе-
       му оператору в определении функции в TDODEMO:
            void CScribbleAllocation::InitMainWindow()
            {
                MainWindow = new ScribbleWindow(NULL, Name);

       TDeb 3.0 #3-3                = 20 =
            }
            Позиционируйте курсор  на строке после оператора инициализа-
       ции и нажмите клавишу F4 для выполнения программы до  той  точки,
       где инициализируется  окно,  диалоговое окно или управляющий эле-
       мент. В данном примере нужно позиционировать  курсор на  закрыва-
       ющей фигурной скобке функции.


            После инициализации  оконного объекта вы можете добавить его
       в область выбора окна.  Для добавления выбранного окна вы  можете
       либо выбрать команду Add (Добавление) локального меню области вы-
       бора окна,  либо начать ввод в этом окне имени объекта.  Любой из
       методов выводит диалоговое окно Add Window (Добавление окна).
            Если вы  не  находитесь в той подпрограмме,  где описывается
       объект, для доступа  к  нему  требуется  переопределение  области
       действия. Например, в TDODEMO MainWindow является элементом MyApp
       (так как MyApp представляет собой тип CScribbleApplication, кото-
       рый является производным от TApplication, а TApplication содержит
       элемент данных с именем MainWindow). Однако, поскольку MyApp опи-
       сывается в  функции WinMain,  то если вы не находитесь в этой фу-
       нкции, доступа к MyApp у вас нет. Таким образом, переопределением
       области действия,  которое  обеспечивает  работу в данном модуле,
       является  WinMain#MyApp.MainWindow.

       TDeb 3.0 #3-3                = 21 =
                  г[*]=Add window or handle to watch========¬
                  ¦                                         ¦
                  ¦ Window identifiers                      ¦
                  ¦ ---------------------------             ¦
                  ¦                                   OK    ¦
                  ¦                                 ------- ¦
                  ¦                                         ¦
                  ¦                                  Cancel ¦
                  ¦ Identified by                   ------- ¦
                  ¦  (.) Window object                      ¦
                  ¦  ( ) Handle                      Help   ¦
                  ¦                                 ------- ¦
                  ¦                                         ¦
                  L=========================================-


            Рис. 17.4  Диалоговое окно Add Window с разрешенной поддерж-
       кой ObjectWindows
                 Примечание: Ввод в данном окне первого  значения  уста-
            навливает   также   класс  сообщений  в  значение  "Log  all
            messages" ("Регистрация всех сообщений").
            Вы можете ввести либо имя подпрограммы, которая обрабатывает
       сообщения для  окна  (выберите  переключатель  Window Object) или
       значение-описатель  (выберите  переключатель   Handle).   Введите
       столько  имен подпрограмм или значений описателей,  сколько нужно
       для отслеживания сообщений ваших окон.
                             Отмена выбора окна
       -----------------------------------------------------------------
            Для отмены  выбора окна переместите курсор на элемент, затем
       либо выберите локальное меню и используйте команду  Remove  (Уда-
       лить), либо нажмите клавиши Del, Ctrl-Y или Ctrl-R.
            Чтобы отменить  все окна,  выберите в локальном меню команду
       Delete All (Удалить все).

       TDeb 3.0 #3-3                = 22 =
                     Задание класса сообщений и действия
       -----------------------------------------------------------------
            Верхняя правая  область  - это область класса сообщений.  Ее
       локальное меню идентично локальному меню области  выбора  окна  и
       позволяет  вам добавить класс сообщения,  удалить класс сообщения
       или удалить все классы, которые вы добавили.
                  --------------¬
                  ¦ Add...      ¦           Добавить
                  ¦ Remove      ¦           Отменить
                  ¦ Delete All  ¦           Удалить все
                  L--------------
            Перед тем,  как добавить в данной области класс сообщений, в
       области выбора окна нужно задать процедуру окна или описатель.
            Если вы  не  задаете  конкретный  класс  сообщений или класс


       просматриваемых сообщений, то TDW наблюдает за всеми сообщениями,
       передаваемыми процедуре окна или его описателю.
                         Добавление класса сообщений
       -----------------------------------------------------------------
            Чтобы добавить класс сообщений,  выберите в  области  класса
       сообщений  команду локального меню Add (Добавление).  TDW выводит
       следующее диалоговое окно:
                   г[*]===Set message filter=================¬
                   ¦ Message Class                     OK    ¦
                   ¦  ( ) All messages               ------- ¦
                   ¦  ( ) Mouse                              ¦
                   ¦  ( ) Window                      Cancel ¦
                   ¦  ( ) Input                      ------- ¦
                   ¦  ( ) System                             ¦
                   ¦  ( ) Initialization              Help   ¦
                   ¦  ( ) Clipboard                  ------- ¦
                   ¦  ( ) DDE                                ¦
                   ¦  ( ) Non-client                         ¦
                   ¦  ( ) Other                              ¦
                   ¦  (.) Single message      ( ) Break      ¦
                   ¦                          (.) Log        ¦
                   ¦  Single Message name                    ¦
                   ¦  ----------------------                 ¦
                   L=========================================-
            Рис. 17.5 Диалоговое окно Set Message Filter
            Message Class - класс сообщений;  All messages - все сообще-
       ния; Mouse - "мышь"; Window - окно; Input - ввод; System - систе-
       ма; Initialization - инициализация; Clipboard - буфер вырезанного
       изображения; DDE  - динамический обмен данными ;  Non-client - не
       пользовательское;  Other - прочее; Single message - отдельное со-

       TDeb 3.0 #3-3                = 23 =


       общение;  Break - прерывание;  Log - регистрация;  Single message
       name - имя отдельного сообщения.
            Диалоговое окно  Set Message Filter (Задание фильтра сообще-
       ния) выводит вам подсказку как для класса,  так и  для  действия,
       выполняемого при приеме сообщения.
            Отладчик TDW по умолчанию регистрирует все сообщения,  начи-
       нающиеся с WM_.  Поскольку поступает так много сообщений, вы, ве-
       роятно, захотите ограничить их, выбрав в списке классов сообщений
       один из классов.  Вы можете добавлять только по одному классу со-
       общений. Поэтому, если вы хотите отслеживать сообщения нескольких
       классов, для каждого класса сообщений нужно использовать параметр
       Add.

       TDeb 3.0 #3-3                = 24 =
            Классы сообщений описываются в следующей таблице:
                           Классы сообщений Windows        Таблица 17.1
        -----------------------T--------------------------------------¬
        ¦  Класс сообщения     ¦  Описание                            ¦
        +----------------------+--------------------------------------+
        ¦ All messages         ¦  Все сообщения, начинающиеся с WM_.  ¦
        ¦ (все сообщения)      ¦                                      ¦
        ¦                      ¦                                      ¦
        ¦ Mouse                ¦  Сообщения, генерируемые событием от ¦
        ¦ ("мышь")             ¦  "мыши" (например, WM_LBUTTONWODN и  ¦
        ¦                      ¦  WM_MOUSEMOVE)                       ¦
        ¦                      ¦                                      ¦
        ¦ Window               ¦  Сообщения от менеджера Windows      ¦
        ¦ (окно)               ¦  (например, WM_PAINT и WM_CREATE)    ¦
        ¦                      ¦                                      ¦
        ¦ Input                ¦  Сообщения, генерируемые по событию  ¦
        ¦ (ввод)               ¦  от клавиатуры или при доступе       ¦


        ¦                      ¦  пользователя к меню System, полосе  ¦
        ¦                      ¦  прокрутки, или блоку размера        ¦
        ¦                      ¦  (например, WM_KEYDOWN и             ¦
        ¦                      ¦  WM_SYSCOMMAND)                      ¦
        ¦                      ¦                                      ¦
        ¦ System               ¦  Сообщения, генерируемые при         ¦
        ¦ (система)            ¦  изменениях в системе (например,     ¦
        ¦                      ¦  WM_FONTCHANGE и WM_SPOOLERSTATUS)   ¦
        ¦                      ¦                                      ¦
        ¦ Initialization       ¦  Сообщения, генерируемые при         ¦
        ¦ (инициализация)      ¦  создании диалогового блока или окна ¦
        ¦                      ¦  (например, WM_INITDIALOG и          ¦
        ¦                      ¦  WM_INITMENU)                        ¦
        ¦                      ¦                                      ¦
        ¦ Clipboard            ¦  Сообщения, генерируемые, когда одна ¦
        ¦ (буфер вырезанного   ¦  прикладная задача пытается получить ¦
        ¦ изображения)         ¦  доступ к буферу вырезанного         ¦
        ¦                      ¦  изображения или окну другой         ¦
        ¦                      ¦  прикладной задачи (например,        ¦
        ¦                      ¦  WM_SIZECLIPBOARD и WM_DRAWCLIPBOARD)¦
        ¦                      ¦                                      ¦
        ¦ DDE                  ¦  Сообщения динамического обмена      ¦
        ¦ (динамический        ¦  данными, генерируемые прикладными   ¦
        ¦ обмен данными)       ¦  программами при коммуникации с      ¦
        ¦                      ¦  окнами другой прикладной программы  ¦
        ¦                      ¦  (например, WM_DDE_INITIATE и        ¦
        ¦                      ¦  WM_DDE_ACK)                         ¦
        ¦                      ¦                                      ¦


        ¦ Non_client           ¦  Сообщения, генерируемые Windows     ¦
        ¦ (не пользователь)    ¦  для обслуживания непользовательской ¦
        ¦                      ¦  области окна прикладной задачи      ¦
        ¦                      ¦  (например, WM_NCHITTEST и           ¦
        ¦                      ¦  WM_NCCREATE)                        ¦
        ¦                      ¦                                      ¦

       TDeb 3.0 #3-3                = 25 =
        ¦ Other                ¦  Любые сообщения, начинающиеся с     ¦
        ¦ (прочие)             ¦  WM_, которые не попадают в другие   ¦
        ¦                      ¦  категории, например, другие         ¦
        ¦                      ¦  сообщения управления отображением   ¦
        ¦                      ¦  и многие интерфейсные               ¦
        ¦                      ¦  документирующие сообщения           ¦
        ¦                      ¦                                      ¦
        ¦ Single Message       ¦  Любое отдельное сообщение,          ¦
        ¦ (отдельное сообщение)¦  начинающееся с WM_, которое вы      ¦
        ¦                      ¦  хотите зарегистрировать или         ¦
        ¦                      ¦  прервать программу по сообщению     ¦
        L----------------------+---------------------------------------
            Для отслеживания  отдельного   сообщения   выберите   Single
       Message  (Отдельное сообщение) и введите имя или номер сообщения.
       Если вы вводите имя сообщения,  учтите, что все буквы должны быть
       заглавными.
            Действие по умолчанию - помещение сообщения в журнал. Другое
       возможное  действие,  прерывание  программы по данному сообщению,
       эквивалентно установки для данного сообщения точки останова.
            Например, если вы хотите отслеживать  сообщение  WM_PAINT  и
       останавливать программу всякий раз, как в окно посылается это со-
       общение, вы выбираете область Window Selection (Выбор окна) и вы-


       полняете следующие действия:
            1. Выверите правую верхнюю область, Message Class (Класс со-
               общений).
            2. Вызовите ее локальное меню и выберите команду Add (Добав-
               ление).
            2. В окне диалога выберите при помощи селективных переключа-
               телей Action (Действие) установку  Break  (Прерывание)  и
               при помощи  селективных  переключателей Message Name (Имя
               сообщение) установку Single  Message  (Отдельное  сообще-
               ние).
            4. В  блоке  ввода  Message  Name  (Имя  сообщения)  введите
               WM_PAINT и нажмите клавишу Return.
            На Рис.  17.1  показано,  как выглядит окно Windows Messages
       после того, как вы сделали данный выбор, и поступило сообщение.
                          Удаление класса сообщений
       -----------------------------------------------------------------
            Для удаления класса сообщений поместите курсор  на удаляемый
       элемент и либо вызовите локальное меню и выберите из него команду
       Remove, либо нажмите Delete или клавиши Ctrl-Y.
            Для удаления всех классов выберите команду Delete All  (Уда-

       TDeb 3.0 #3-3                = 26 =
       лить все) из локального меню.
            После того,  как  вы  удалите все классы,  будет установлено
       умолчание "Log all messages" ("Регистрация всех  сообщений").  Вы
       не можете удалить этот класс командами Remove или Delete All.
                             Просмотр сообщений
       -----------------------------------------------------------------
            -------------------------¬
            ¦ Send to log window   No¦       Передача в окно регистрации
            ¦ Erase log              ¦       Стереть регистрацию
            L-------------------------
            Оконные сообщения  выводятся  в  нижней области окна Windows
       Messages. Эта область может содержать до 200 сообщений.


             Если вы  хотите сохранить сообщения в файле,  вы должны отк-
       рыть файл журнала для окна Log (выбрав команду View¦Log File (Об-
       зор¦Файл  регистрации),  а  затем команду Open Log File (Открытие
       файла регистрации) из локального меню).  Затем вы должны  перейти
       обратно в область Messages (Сообщения) и изменить  установку Send
       To  Log  Window  (Передача  в окно регистрации) локального меню в
       значение Yes (это означает, что запись в протокол разрешена).
            Если вы  хотите очистить область от всех сообщений, выберите
       команду Erase Log (Стереть протокол) из локального меню. На сооб-
       щения, записываемые в окно Log (Регистрация), эта команда не вли-
       яет.
                        Замечания по сообщениям окна
       -----------------------------------------------------------------
            Если вы выводите сообщения более чем для одного окна,  то не
       регистрируйте  все  сообщения.  Регистрируйте  вместо  этого  для
       каждого окна конкретные сообщения или конкретный класс сообщений,
       поскольку  большое число сообщений,  передаваемых между Windows и
       TDW может привести к "зависанию" системы.
            При установки прерывания по классу сообщений от "мыши" нужно
       учитывать,  что перед тем,  как снова станет активной клавиатура,
       за  сообщением mouse down (перемещение "мыши" вниз) должно следо-
       вать сообщение mouse up (перемещение "мыши" вверх). Это ограниче-
       ние означает,  что когда вы возвращаетесь в прикладную программу,
       вам может потребоваться несколько раз нажать кнопку "мыши", чтобы
       получить  сообщение mouse up.  Вы узнаете,  что в Windows принято
       сообщение,  когда увидите  его  в  нижней  области  окна  Windows
       Messages (Сообщения Windows).
            Если вы вводите имя описателя, но указываете, что это проце-
       дура, TDW будет воспринимать ваш ввод.


Однако, когда вы запустите
       программу,  TDW  не будет регистрировать никаких сообщений.  Если
       TDW не регистрирует сообщения после того,  как вы установили опи-

       TDeb 3.0 #3-3                = 27 =
       сатель, чтобы увидеть, выбрали ли вы "кнопку" Handle (Описатель),
       проверьте диалоговое окно Set Message Filter (Задание фильтра со-
       общений).

       TDeb 3.0 #3-3                = 28 =
                Получение содержимого памяти и списка модулей
       -----------------------------------------------------------------
            Для получения содержимого глобальной или  локальной  динами-
       чески распределяемой  области  или списка модулей вашей программы
       для Windows сначала вызовите окно Log командой View¦Log (Просмотр
       ¦Протокол:), а затем вызовите локальное меню.  Последней командой
       локального  меню  окна Log (Регистрация) является команда Display
       Windows info (Вывод информации Windows). Выбор этой команды вызо-
       вет на экран окно диалога Windows Information, из которого вы мо-
       жете выбрать тип списка,  который вы хотите вывести на экран, и с
       какого места начать вывод.
                     г[*]=====Windows information========¬
                     ¦ Display                           ¦
                     ¦   (*) Global heap         OK----  ¦
                     ¦   ( ) Local heap                  ¦
                     ¦   ( ) Module list         Cancel  ¦
                     ¦                           ------  ¦
                     ¦ Started at                        ¦
                     ¦   (*) Top                 Help    ¦
                     ¦   ( ) Bottom              ------  ¦
                     ¦   ( ) Handle                      ¦
                     ¦                                   ¦
                     ¦ Starting handle                   ¦
                     ¦ <not avaliable>                   ¦
                     ¦                                   ¦


                     L===================================-
            Рис. 17.6 Диалоговое окно Windows information
            Windows information - информация Windows;  Display -  вывод:
       Global heap - глобальная динамически распределяемая область памя-
       ти; Local heap - локальная динамически распределяемая область па-
       мяти;  Module  list - список модулей;  Started at - начало на...;
       Top - вершина;  Bottom -  конец;  Handle  -  описатель;  Starting
       handle - начальный описатель;  not avaliable - недоступно; Cancel
       - отмена; Help - справка.
            Если вы выбрали параметр вывода содержимого глобальной дина-
       мически распределяемой области памяти, то вы можете выбрать вывод
       с  верхнего адреса динамически распределяемой области до нижнего,
       с нижнего до верхнего, либо с позиции, определяемой начальным ло-
       гическим номером (описателем).
            Начальный логический номер - это имя логического номера гло-
       бальной памяти, устанавливаемого в вашей прикладной программе при
       вызове   подпрограммы   выделения   памяти   Windows,    например
       GlobalAlloc. Выбор начального логического номера  заставляет  TDW
       вывести на экран объект, соответствующий этому логическому номеру
       (описателю), а также следующие за ним четыре объекта в динамичес-
       ки распределяемой памяти.

       TDeb 3.0 #3-3                = 29 =
                        Получение списка содержимого
                 глобальной динамически распределяемой памяти
       -----------------------------------------------------------------
            Глобальная динамически распределяемая память -  это  область
       глобальной  памяти,  которую  Windows  делает  доступной для всех
       прикладных программ. Если вы выделяете такие ресурсы, как пиктог-
       раммы, элементы изображения, диалоговые окна или шрифты, либо ес-
       ли вы выделяете память при помощи функции GlobalAllc,  ваша прик-


       ладная программа будет использовать глобальную динамически  расп-
       ределяемую область памяти.
            Для получения списка объектов данных в глобальной динамичес-
       ки распределяемой  области  выберите  селективный   переключатель
       Global  Heap (Глобальная динамически распределяемая область памя-
       ти) в окне диалога Windows Information,  а затем выберите  "кноп-
       ку" OK.  Объекты  данных  будут перечислены в окне Log (Регистра-
       ция).  Поскольку этот список скорее всего  превысит  число  строк
       окна Log (по умолчанию это число равно 50),  вы должны либо запи-
       сать содержимое в файл журнала (при помощи локального  меню  окна
       Log)  или увеличить число строк,  которое может использовать окно
       Log (для этого служит утилита TDINST).  Можно установить максимум
       до 200 строк.
            Следующая таблица  показывает пример с двумя строками вывода
       для глобальной  динамически  распределяемой области памяти и дает
       объяснения по каждому их полю:
           Формат вывода глобальной динамически распределяемой области
                                                            Таблица 17.2
       ----------------------------------------------------------------¬
       ¦0EC5      00000040b PDB (OF1D)                                 ¦
       ¦053 (053D)00002DC0b GDI DATA MOVEABLE LOCKED=0001 PGLOCKED=0001¦
       +--------------T------------------------------------------------+
       ¦Поле          ¦ Описание                                       ¦
       +--------------+------------------------------------------------+
       ¦OEC5          ¦Описатель или объект памяти, выраженный         ¦
       ¦              ¦в виде шестнадцатиричного значения из 4 цифр или¦
       ¦              ¦слова FREE, что указывает на свободный блок     ¦
       ¦              ¦памяти.                                         ¦
       ¦              ¦                                                ¦


       ¦(053D)        ¦ Селектор памяти, указывающий на запись в таблице¦
       ¦              ¦глобальных дескрипторов. Если у него то же      ¦
       ¦              ¦значение, что и у описателя памяти, то селектор ¦
       ¦              ¦не выводится.                                   ¦
       ¦              ¦                                                ¦
       ¦00000040b     ¦Шестнадцатиричное число, представляющее длину   ¦
       ¦00002DC0b     ¦сегмента в байтах.                              ¦
       ¦              ¦                                                ¦
       ¦PDB           ¦Для кого распределяется сегмент. Обычно это     ¦
       ¦GDI           ¦прикладная программа или библиотечный модуль.   ¦
       ¦              ¦PDB - это блок описания процесса, который       ¦
       ¦              ¦называют также префиксом программного сегмента  ¦

       TDeb 3.0 #3-3                = 30 =
       ¦              ¦PSP.                                            ¦
       ¦              ¦                                                ¦
       ¦(0F1D)        ¦Описатель, указывающий на владельца PDB.        ¦
       ¦              ¦                                                ¦
       ¦DATA          ¦Тип объекта памяти. Тип может быть следующим:   ¦
       ¦              ¦ DATA - сегмент данных прикладной программы или ¦
       ¦              ¦        DLL                                     ¦
       ¦              ¦ CODE - сегмент кода прикладной программы или   ¦
       ¦              ¦        DLL                                     ¦
       ¦              ¦ PRIV - системный объект или глобальные данные  ¦
       ¦              ¦        для прикладной программы или DLL.       ¦
       ¦              ¦                                                ¦
       ¦MOVEABLE      ¦Атрибут распределения памяти. Объект может      ¦
       ¦              ¦иметь атрибуты FIXED, MOVEABLE или MOVEABLE     ¦
       ¦              ¦DISCARDABLE.                                    ¦


       ¦              ¦                                                ¦
       ¦LOCKED=00001  ¦ Для объекта MOVEABLE или MOVEABLE DISCARDABLE   ¦
       ¦              ¦это число блокировок объекта, который           ¦
       ¦              ¦используется с помощью функции GlobalLock или   ¦
       ¦              ¦LockData.                                       ¦
       ¦              ¦                                                ¦
       ¦FGLOCKED=00001¦Для улучшенного режима 386 число блокировок     ¦
       ¦              ¦страниц для объекта, который использует         ¦
       ¦              ¦функцию GlobalPageLock. Если страничная         ¦
       ¦              ¦блокировка установлена на объект памяти, то     ¦
       ¦              ¦Windows не может выгрузить на диск ни одну      ¦
       ¦              ¦из 4-килобайтовых страниц объекта.              ¦
       L--------------+-------------------------------------------------
       Листинг содержимого локальной динамически распределяемой области
       -----------------------------------------------------------------
            Локальная динамически  распределяемая  область  памяти - это
       частная область памяти для прикладной программы. Для других прик-
       ладных  программ  Windows (включая другие экземпляры той же прог-
       раммы) она недоступна.
            Программа не обязательно имеет локальную динамически распре-
       деляемую  область  памяти.  Windows создает локальную динамически
       распределяемую область  памяти  прикладной  программы  с  помощью
       функции LocalAlloc.
            Чтобы просмотреть список объектов данных в локальной динами-
       чески распределяемой области памяти,  выберите селективный перек-
       лючатель Local Heap (Локальная динамически распределяемая область
       памяти)  в  диалоговом  окне  Windows   Information   (Информация
       Windows), затем выберите "кнопку" OK. В окне Log (Протокол) выве-
       дется список объектов данных.



       TDeb 3.0 #3-3                = 31 =
            Поскольку размер списка будет вероятно превышать число строк
       в  окне Log (по умолчанию 50),  вам следует записать содержимое в
       файл регистрации (с помощью локального меню окна Log) или  увели-
       чить  число строк в окне Log (с помощью программы TDWINST). Можно
       задать до 200 строк.
            В следующей таблице приведена типичная строка вывода локаль-
       ной  динамически  распределяемой области с последующим пояснением
       ее формата.

       TDeb 3.0 #3-3                = 32 =
       Формат вывода локальной динамически распределяемой области
                                                            Таблица 17.3
       ----------------------------------------------------------------¬
       ¦ 05CD:    0024   BUSY   (10AF)                                 ¦
       +-------------T-------------------------------------------------+
       ¦ Поле        ¦ Описание                                        ¦
       +-------------+-------------------------------------------------+
       ¦ OEC5        ¦ Смещение объекта в локальном сегменте данных.   ¦
       ¦             ¦                                                 ¦
       ¦ 0024        ¦ Длина объекта в байтах.                         ¦
       ¦             ¦                                                 ¦
       ¦ BUSY        ¦ Размещение объекта памяти:                      ¦
       ¦             ¦  FREE - нераспределенный блок памяти;           ¦
       ¦             ¦  BUSY - распределенный объект.                  ¦
       ¦             ¦                                                 ¦
       ¦ (10AF)      ¦ Описатель локальной памяти для объекта.         ¦
       L-------------+--------------------------------------------------
                          Получение списка модулей
       -----------------------------------------------------------------
            Чтобы увидеть список модулей задачи или DLL,  которые загру-


       жены Windows,  выберите  селективный  переключатель  Module  List
       (Список модулей) в диалоговом окне Windows Information  (Информа-
       ция Windows), затем выберите "кнопку" OK. Список модулей выведет-
       ся в окне Log (Протокол).
            В следующей таблице показан пример - три выводимые строки
       списка модулей с последующим пояснением по каждому полю.

       TDeb 3.0 #3-3                = 33 =
            Формат вывода списка модулей Windows (Таблица 17.7)
       ----------------------------------------------------------------¬
       ¦Пример вывода списка модулей                                   ¦
       +---------------------------------------------------------------+
       ¦0985 TASK TDW      C:\TD\TDW.EXE                               ¦
       ¦0E2D DLL  WINDEBUG C:\WIN3\WINDEBUG.DLL                        ¦
       ¦0EFD TASK GENERIC  C:\TD\GENERIC.EXE                           ¦
       +------------------T--------------------------------------------+
       ¦Поле              ¦               Описание                     ¦
       +------------------+--------------------------------------------+
       ¦0EFD              ¦Логический номер сегмента памяти, выраженный¦
       ¦                  ¦4-значным шестнадцатиричным значением.      ¦
       ¦                  ¦                                            ¦
       ¦TASK              ¦Тип модуля. Модуль может быть либо задачей, ¦
       ¦                  ¦либо DLL.                                   ¦
       ¦                  ¦                                            ¦
       ¦GENERIC           ¦Имя модуля.                                 ¦
       ¦                  ¦                                            ¦
       ¦C:\TD\GENERIC.EXE ¦Маршрут к выполняемому файлу модуля.        ¦
       L------------------+---------------------------------------------
               Отладка динамически компонуемых библиотек (DLL)
       -----------------------------------------------------------------


            DLL представляет  собой  библиотеку  подпрограмм  и ресурсов
       Windows,  компонуемых с вашей прикладной программой во время  вы-
       полнения,  а не компиляции.  Такая компоновка во время выполнения
       позволяет нескольким прикладным программам разделять  одну  копию
       подпрограмм,  данных  или драйверов устройств,  экономя тем самым
       память.  При запуске прикладной программы,  использующей  DLL,  в
       случае,  если DLL еще не загружена в память, Windows загружает ее
       таким образом, чтобы программе стали доступны ее точки входа.
            При загрузке в TDW прикладной программы,  с которой компону-
       ются DLL,  TDW определяет,  какие из этих библиотек DLL (если они
       используются) имеют таблицы имен идентификаторов (были  скомпили-
       рованы с параметром включения отладочной информации) и трассирует
       для вас эти библиотеки. Если во время выполнения прикладной прог-
       раммы  TDW встречает вызов точки входа одной из этих DLL,  то TDW
       загружает таблицу имен идентификаторов и исходный код этой библи-
       отеки  и устанавливает маркер строки модуля в начало подпрограммы
       DLL, вызываемой прикладной программой. Затем DLL становится в ок-
       не Module, так же как и коды вашей прикладной программы.
                 Примечание: Отладчик TDW может загрузить DLL,  не имею-
            щую  таблицы  имен  идентификаторов,  но только в окно CPU и
            только при отладке именно в окне CPU.
            При выходе из подпрограммы  DLL  TDW  перезагружает  таблицу
       имен идентификаторов и исходный код вашей программы и  устанавли-
       вает маркер строки на следующий оператор после вызова точки входа
       DLL.

       TDeb 3.0 #3-3                = 34 =
            Если вы выполняете трассировку программы с помощью клавиш F7
       и F8,  для TDW может оказаться невозможным возврат  в  вызывающую
       программы из подпрограммы,  поскольку DLL может возвращать управ-


       ление через  вызов функции Windows.  В этом случае ваша программа
       просто выполняется так,  как если бы вы нажали клавишу F9.  Такое
       проведение  является общим для кода начальной загрузки библиотеки
       DLL.  Чтобы принудительно вернуться в прикладную программу  перед
       началом трассировки прикладной программы до вызова DLL установите
       в вашей прикладной программе точку останова на строке после обра-
       щения к DLL. При отладке кода начальной загрузки DLL (кода иници-
       ализации) установите точку останова на первой  строке  прикладной
       программы.
            Поскольку отладка DLL в  TDW  значительно  автоматизирована,
       вам не нужно задавать, какую DLL нужно загрузить. Однако, вам мо-
       жет понадобиться выполнить и другие задачи, например:
            - Добавить DLL в список DLL;
            - Установить точки останова,  прерывания,  слежения и т.д. в
              DLL;
            - Задать, какие DLL TDW не должен загружать;
            - Отладить начальный код загрузки DLL.
            Для выполнения любой из этих задач вы должны  войти  в  окно
       диалога Load Modules or DLLs ("Загрузка модулей или DLL") при по-
       мощи команды View¦Modules (Обзор¦Модули).  (Это  диалоговое  окно
       также выводится при нажатии клавиши F3).

       TDeb 3.0 #3-3                = 35 =
            г[*]==========Load modules or DDL symbols==================¬
            ¦                                                          ¦
            ¦ Source modules            DDLs & Programs                ¦
            ¦ -demo-----------  Load    -SCRNFUNC.DDL*--  Symbol load  ¦
            ¦ ----------------          -DEMO.EXE*------  -----------  ¦
            ¦ ----------------  Cancel  -WINDEBUG.DDL---  Load symbols ¦
            ¦ ----------------          -WREMOTE.EXE----   ( )  No     ¦
            ¦ ----------------  Help    -NWPOPUP.EXE----   (*)  Yes    ¦
            ¦ ----------------  -----   -PROGRAM.EXE----               ¦


            ¦ ----------------          -USER.EXE-------  Debug startup¦
            ¦ ----------------          -GDI.EXE--------   ( )  No     ¦
            ¦ ----------------          -KRNL386.EXE----   (*)  Yes    ¦
            ¦ ----------------          ----------------               ¦
            ¦ ----------------                                         ¦
            ¦ ----------------          DDL name                       ¦
            ¦ ----------------          ----------------  Add DDL      ¦
            ¦ ----------------          ----------------  -----------  ¦
            ¦                                                          ¦
            L==========================================================-
            Рис. 17. 7 Диалоговое окно Load modules or DDLs
            Load modules or DDL symbols - загрузка модулей или идентифи-
       каторов DDL;  Source modules - исходные модули; DDLs & Programs -
       библиотеки DDL и программы;  Load - загрузка;  Symbol load - заг-
       рузка идентификаторов;  Cancel  - отмена;  Help - справка;  Debug
       startup - отладка кода инициализации; Add DDL - добавить DDL; DDL
       name - имя библиотеки DDL.
             Использование диалогового окна Load Modules or DLLs
       ------------------------------------------------------------------
            Это диалоговое окно позволяет:
            - Перейти к другому исходному модулю вашей прикладной  прог-
              раммы;
            - Выполнить операции (такие, как загрузка файла имен иденти-
              фикаторов и исходного файла) с DLL и файлами .EXE.

       TDeb 3.0 #3-3                = 36 =
                     Переход к другому исходному модулю
       -----------------------------------------------------------------
            Если вы отлаживаете прикладную программу,  состоящую из нес-
       кольких исходных модулей,  скомпонованных в один файл .EXE, и вам
       нужен доступ к модулю программы,  отличному от текущего загружен-


       ного  в окно Module,  вы можете вызвать окно Load Modules or DLLs
       (Загрузка модулей или DDL) и выбрать  один  из  модулей  в  левом
       списке,  который  называется Source Modules (Исходные модули).  В
       этом списке перечислены все модули,  скомпонованные в вашей прик-
       ладной программе.
            Для того, чтобы выбрать модуль, выделите его, нажмите клави-
       шу Enter или дважды нажмите кнопку  "мыши",  либо  выберите  окно
       Load (Загрузка). Отладчик TDW выведет на дисплей окно Module (Мо-
       дуль), и в нем будет находиться новый исходный модуль.
                         Работа с DLL и программами
       -----------------------------------------------------------------
            При отладке прикладной программы, с которой связана одна или
       более DLL (это верно для любых прикладных программ  для Windows),
       и  вы вызвали окно диалога Load Modules or DLLs (Загрузка модулей
       или DDL),  вы увидите там список DLLs & Programs (DLL и  програм-
       мы), в котором перечислены DLL и файлы .EXE. Этот список включает
       в себя все DLL и файлы .EXE,  загруженные Windows в  текущий  мо-
       мент,  а также все библиотеки DLL,  запускаемые при запуске прик-
       ладной программы.  Он не включает DLL,  которые  ваша  прикладная
       программа  запускает вызовом LOADLIBRARY,  если только они уже не
       загружены программой или Windows.
            Элементы в верхней части списка,  помеченные справа многото-
       чием, это файлы .EXE вашей прикладной программы и DLL с таблицами
       имен идентификаторов, вызываемые вашей прикладной программой. Ес-
       ли вы не не делали изменений, отладчик TDW автоматически загружа-
       ет таблицу имен идентификаторов и исходный код для  каждой  поме-
       ченной  DLL,  всякий  раз при вызове этой DLL из вашей программы.
       Кроме того,  TDW автоматически загружает таблицу имен идентифика-
       торов и исходный код любой библиотеки DLL, которую ваша программа


       запускает вызовом LOADLIBRARY,  даже хотя сначала эта DLL может и
       не  присутствовать в списке.  (Она там появится после загрузки ее
       TDW).
            "Кнопки" справа от списка позволяют выполнять операции с вы-
       деленными вами DLL или прикладными программами.  Окно  текстового
       ввода под списком позволяет добавить в список DLL.  Вы можете ис-
       пользовать эти средства следующим образом:

       TDeb 3.0 #3-3                = 37 =
         Управляющие "кнопки"окна диалога DLLs & Programs  Таблица 17.5
       --------------------T-------------------------------------------¬
       ¦ Кнопка            ¦                 Описание                  ¦
       +-------------------+-------------------------------------------+
       ¦ Symbol load       ¦ Загружает таблицу имен идентификаторов и  ¦
       ¦                   ¦ исходные файлы для DLL или прикладной     ¦
       ¦                   ¦ программы. Эта команда изменяет содержимое¦
       ¦                   ¦ окна Module (Модуль), и вы можете         ¦
       ¦                   ¦ устанавливать точки останова, сообщения   ¦
       ¦                   ¦ Windows, и т.д. для DLL.                  ¦
       ¦                   ¦                                           ¦
       ¦ Load Symbols      ¦ Задает, загружать ли таблицу имен         ¦
       ¦ (No/Yes)          ¦ идентификаторов DLL и ее исходный код,    ¦
       ¦                   ¦ когда прикладная программа вызывает DLL.  ¦
       ¦                   ¦ Вы можете использовать этот параметр,     ¦
       ¦                   ¦ чтобы предотвратить загрузку данной       ¦
       ¦                   ¦ информации для библиотеки, которая не     ¦
       ¦                   ¦ требует отладки. По умолчанию будет       ¦
       ¦                   ¦ установлено значение Yes (Да).            ¦
       ¦                   ¦                                           ¦
       ¦ Debug startup     ¦ Задает, нужно ли отлаживать код начальной ¦


       ¦ (No/Yes)          ¦ загрузки DLL. По умолчанию устанавливается¦
       ¦                   ¦ No (Нет).                                 ¦
       ¦                   ¦                                           ¦
       ¦ DLL Name          ¦ Введите имя DLL, отсутствующей в списке   ¦
       ¦                   ¦ DLLs & Programs (DDL и программы), чтобы  ¦
       ¦                   ¦ добавить библиотеку в этот список.        ¦
       ¦                   ¦ Добавление DLL в список позволит затем    ¦
       ¦                   ¦ использовать для этой DLL одну из трех    ¦
       ¦                   ¦ предыдущих команд. При необходимости можно¦
       ¦                   ¦ задать полный маршрут.                    ¦
       ¦                   ¦                                           ¦
       ¦ Add DLL           ¦ Добавить DLL в текущий блок текстового    ¦
       ¦                   ¦ ввода в список DLLs & Programs.           ¦
       L-------------------+--------------------------------------------
                   Добавление DLL в список DLLs & Programs
       -----------------------------------------------------------------
            Прежде чем вы сможете установить отладочные параметры, необ-
       ходимость отлаживать начальный код  загрузки  DLL  или  загружать
       таблицу  имен идентификаторов и исходный код DLL,  эта DLL должна
       быть внесена в список DLL & Programs (DLL и программы). Библиоте-
       ка  DLL,  к которой обращается ваша программа,  может и не быть в
       этом списке,  поскольку сразу после загрузки программы TDW  знает
       только  о DLL,  компонуемых с начальным кодом загрузки прикладной
       программы.  Программа может также запустить DLL явно,  при помощи
       команды LOADLIBRARY.  TDW не знает об этом до вызова LOADLIBRARY.

       TDeb 3.0 #3-3                = 38 =
            Существует два различных типа кода начальной загрузки,  упо-
       минаемые в данном разделе:  начальный код загрузки вашей приклад-


       ной программы и начальный код загрузки DLL. Некоторые динамически
       компонуемые библиотеки  DLL  запускаются начальным кодом загрузки
       вашей прикладной программы.  Когда ваша программа запускает  DLL,
       выполняется начальный код загрузки DLL.
            Если вы хотите добавить DLL в список DLLs & Programs,  вызо-
       вите диалоговое окно Load Modules or DLLs (Загрузка  модулей  или
       DDL)  (нажмите  клавишу  F3  или используйте команду View¦Modules
       (Обзор¦Модули)), перейдите к блоку текстового ввода DLL Name (имя
       DLL),  введите имя DLL (если необходимо, введите полный маршрут),
       и активизируйте "кнопку" Add DLL,  чтобы добавить это имя в  спи-
       сок.

       TDeb 3.0 #3-3                = 39 =
                    Установка параметров отладки для DLL
       -----------------------------------------------------------------
            Если вы  хотите установить для DLL точки останова или слеже-
       ния,  или еще какие-либо параметры отладки, вызовите окно диалога
       Load  Modules or DLLs (Загрузка модулей или DDL) (нажмите клавишу
       F3 или выберите команду View¦Modules),  найдите DLL в списке DLLs
       & Programs,  выделите его и затем используйте команду Symbol Load
       (Загрузка идентификатора), чтобы получить окно Module с этой биб-
       лиотекой DLL в нем.  В окне Module (Модуль) вы можете выполнить с
       DLL интересующие вас операции.
          Управление загрузкой TDW таблиц имен идентификаторов DLL
       -----------------------------------------------------------------
            По умолчанию  TDW  загружает  таблицу имен идентификаторов и
       исходный код для каждой DLL, к которой обращается ваша прикладная
       программа,  но  только  если  DLL  имеет совместимую таблицу имен
       идентификаторов.  DLL имеет таблицу имен идентификаторов, совмес-
       тимую с TDW. При компиляции с включенной информации для отладки и
       с помощью компилятора Турбо Паскаля для Windows DLL содержит таб-


       лицу идентификаторов, совместимую с TDW.
            Поскольку загрузка  отладочной  информации  для  DLL и затем
       загрузка отладочной информации для прикладной программы после то-
       го,  как DLL отработает,  занимает время,  вам может понадобиться
       отменить стандартные действия для DLL, которую вы не хотите отла-
       живать.  Чтобы  TDW  не загружал таблицу имен идентификаторов для
       DLL, вызовите окно диалога Load Modules or DLLs (нажатием клавиши
       F3 или командой View¦Modules), найдите имя этой DLL в списке DLLs
       & Programs,  выделите  его  и активизируйте "кнопку" Load Symbols
       (Загрузка идентификаторов) со значением No (Нет).
                    Отладка начального кода загрузки DLL
       -----------------------------------------------------------------
            По умолчанию TDW не отлаживает начальный код загрузки DLL, а
       только  загружает  таблицу  имен идентификаторов DLL,  когда ваша
       прикладная программа вызывает точку входа этой DLL. Затем TDW вы-
       зывает окно Module (Модуль) или CPU (ЦП) с маркером текущей стро-
       ки на начале подпрограммы DLL, вызванной прикладной программой.
            Отладчик TDW будет отлаживать начальный  код  загрузки  DLL,
       если вы явно зададите это. Вы можете использовать TDW для отладки
       любого из двух типов начального кода загрузки DLL.
              Какого рода начальный код загрузки вы отлаживаете
            - Код инициализации, непосредственно после LibMain (по умол-
              чанию).
            - Ассемблерный  код,  скомпонованный с DLL,  выполняющий на-
              чальную загрузку и содержит  эмулированные  математические

       TDeb 3.0 #3-3                = 40 =
              пакеты  для используемой DLL модели памяти (выбираемой при
              запуске TDW параметром командной строки -l).
            После того,  как вы задали отладку начального кода  загрузки
       одной  или  более  DLL вашей прикладной программы,  TDW загружает


       таблицу имен идентификаторов для каждой библиотеки DLL либо когда
       начальный  код  загрузки вашей прикладной программы запускает эту
       DLL,  либо  когда  прикладная   программа   явно   делает   вызов
       LOADLIBRARY.
                  Загружена ли уже ваша прикладная программа?
            Если вы пытаетесь загрузить прикладную программу,  а уже за-
       тем задать отладку начального кода загрузки,  отладчик TDW  может
       повести  себя  иначе,  чем вы ожидали,  так как некоторые или все
       библиотеки DLL могут уже оказаться  загруженными.  Следовательно,
       задавать отладку начального кода нужно:
            - Установив  отладку  для  DLL  до загрузки вашей прикладной
              программы.
            - Загрузив вашу прикладную программу, указав DLL для отладки
              начального  кода загрузки,  а затем перезапустив программу
              (Ctrl-F2 или Run¦Program Reset).
                  Выполнение отладки начального кода загрузки
            Учитывая все эти предварительные замечания,  используйте для
       задания  отладки начального кода загрузки для одной или более DLL
       и для отладки начального кода загрузки этих  библиотек  следующие
       шаги:
            1. Вызовите окно диалога Load Modules or DLL (нажмите F3 или
               воспользуйтесь командой View¦Modules (Обзор¦Модули).
            2. Найдите DLL в списке DLLs & Programs и выделите ее.
            3. Активизируйте "кнопку" Debug Startup (Отладка кода иници-
               алиазции) значением Yes (Да).
            4. Повторите шаги 2 и 3, пока вы не зададите отладку началь-
               ного  кода  загрузки для всех библиотек DLL,  для которых
               это необходимо.
            5. Если нужная вам DLL находится не в списке  или  в  списке
               нет  DLL  (поскольку вы еще не загрузили прикладную прог-
               рамму),  используйте поле текстового ввода DLL  Name  для
               ввода каждого имени DLL и добавления его в список при по-


               мощи "кнопки" Add DLL (Добавление DLL),  а затем выберите
               "кнопку"  Debug Startup Yes (Отладка начального кода раз-
               решена).
            6. После того, как вы установили все DLL, для которых вы хо-

       TDeb 3.0 #3-3                = 41 =
               тите отлаживать начальный код загрузки,  следующим  шагом
               будет   либо   загрузка   при  помощи  команды  File¦Load
               (Файл¦Загрузка) вашей прикладной программы (если  вы  еще
               ее не загрузили),  либо перезагрузка программы при помощи
               команды Run¦Program  Reset  (Выполнение¦Сброс  программы)
               (если вы загрузили ее до того, как задали отладку началь-
               ного кода загрузки).
            7. Перед выполнением прикладной программы вам следует  уста-
               новить  точки  останова,  чтобы после выполнения кода на-
               чальной загрузки DLL возвращаться в прикладную программу.
               Когда в окне Module  находится  исходный  код  прикладной
               программы, сделайте следующее:
                 а) установите на  первой  строке  прикладной  программы
                    точку останова;
                 б) если вы отлаживаете код начальной загрузки для какой-
                    либо из DLL,  загруженной вызовом LoadLibrary, уста-
                    новите точку останова на первой  строке  кода  после
                    каждого из этих вызовов.
            7. Когда ваша прикладная программа запускает каждую  из DLL,
               отладчик  TDW  выводит либо LibMain DLL в окне Module (по
               умолчанию),  либо начало листинга ассемблерного кода  на-
               чальной загрузки библиотеки в окне CPU (так как TDW запу-
               щен с параметром -l).
            8. Когда вы закончили отлаживать начальный код загрузки DLL,
               нажмите клавишу F9 для того, чтобы выполнить до конца на-
               чальный код загрузки и вернуться к  прикладной программе.


               Если вы задали еще другие библиотеки DLL для отладки  на-
               чального  кода  загрузки,  TDW выводит на экран начальный
               код для этих библиотек DLL, как только программа запуска-
               ет каждую из них.
            Не забудьте выполнить до конца начальный код  загрузки  DLL,
       прежде  чем перезагрузить текущую прикладную программу или загру-
       зить новую.  Если вы забудете сделать это,  частично  выполненный
       начальный код DLL может привести к тому,  что Windows "зависнет",
       и вам придется перезагружаться.

       TDeb 3.0 #3-3                = 42 =
                  Преобразование описателей памяти в адреса
       -----------------------------------------------------------------
            Windows использует для объектов не адреса памяти, а логичес-
       кие номера (описатели) памяти,  так как выполняет собственную ор-
       ганизацию памяти и может изменить физическое расположение объекта
       в памяти. Если вам нужен фактический адрес, соответствующий логи-
       ческому номеру, вы можете использовать для этого встроенные имена
       Турбо  отладчика  -  lh2fp  (для  локальных логических номеров) и
       gh2fp (для глобальных логических номеров) для обращения по  логи-
       ческому номеру к адресу памяти.
            Вы можете использовать эти имена для приведения типов в TDW,
       как для приведения типов указателей в Турбо Паскале  обычные  ис-
       пользуются символические имена. Например, вы можете преобразовать
       локальный логический номер hLocalMemory двумя методами:
            - Вы можете использовать окно Data¦Inspect (Данные¦Проверка)
              для вычисления следующего выражения:
                (lh2fp) hLocalMemory
            - Вы можете использовать команду Type Cast (Приведение типа)
              окна Inspector (Проверка) и ввести там  lh2fp  в  качестве
              типа.
            В любом  случае  выражение  вычисляется  для первого символа


       блока памяти, на который указывает HLocalMemory.
            Вы можете также использовать любой из этих методов  для  вы-
       полнения более сложного приведения типов - например,  для двухша-
       гового приведения от логического номера  к  дальнему  символьному
       указателю  на дальний указатель данных в памяти,  следующим обра-
       зом:
            (Mystruct far *) (lh2fp)hLocalMemory
                           Рекомендации по отладке
       -----------------------------------------------------------------
            Поскольку прикладные программы для Windows являются интерак-
       тивными программами,  лучший способ отладки состоит в том,  чтобы
       запустить ее и останавливать в точках останова.
            Как первичное  средство  отладки  пошаговое  выполнение  или
       трассировка  программы для Windows может оказаться недостаточным,
       так как в конце концов вам встретится код,  который зациклится  в
       ожидании сообщения для окна.  Для таких случаев вы можете устано-
       вить, там где это возможно, точки останова для кода и для сообще-
       ний, выполнить программу до такой точки останова, а затем уже пе-
       рейти к пошаговому выполнению или трассировке.
            При пошаговом режиме в цикле приема сообщения вы можете  на-

       TDeb 3.0 #3-3                = 43 =
       жать  комбинацию  клавиш  Alt-F5,  чтобы  видеть экран прикладной
       программы, но вы не сможете с ней взаимодействовать. Для этого вы
       должны нажать клавишу F9 для запуска программы, чтобы видеть окна
       программы,  однако как быть, если вам нужно попасть обратно в TDW
       для трассировки ошибки,  которую вы обнаружили, пока использовали
       одно из окон вашей программы?
            В случае прикладной программы для DOS вы можете нажать Ctrl-
       Break, чтобы прервать программу и вернуться к Турбо отладчику,од-
       нако в случае Windows эта команда не работает.  Однако,  и  здесь
       есть   способ   прервать  программу:  нажмите  комбинацию  клавиш


       Ctrl-Alt-SysRq.  Попав обратно в TDW,  вы можете установить точки
       останова для кода и сообщений,  задать выражения просмотра, прос-
       мотреть все сообщения, зарегистрированные в протоколе, или выпол-
       нить любые другие действия по локализации ошибки.  Как только  вы
       будете готовы вернуться в отлаживаемую программу, нажмите клавишу
       F9.
            Когда ваша программа прервана, нельзя делать следующее:
            - Продолжить отладку пошаговым выполнением.  Попытка пошаго-
              вого выполнения после того, как произошло прерывание, при-
              ведет к непредсказуемым результатам,  поскольку ваша прог-
              рамма  могла  выполнять код Windows.  Обычно в этом случае
              Windows завершает как вашу  прикладную  программу,  так  и
              TDW,  выводя сообщение:  "Unrecoverable application error"
              ("Невосстановимая ошибка прикладной программы").
            - Если ваша прикладная программа выполняла код  Windows,  не
              завершайте выполнение ни прикладной программы, ни отладчи-
              ка TDW.  Если вы это сделаете,  то Windows может сбиться и
              "зависнуть",  и вам придется перезагружать систему. Если в
              этой ситуации вы попытаетесь выйти из программы или  пере-
              загрузить ее, TDW выведет диалоговое окно с запросом:
              Ctrl-Alt-SysRq interrupt. System crash possible. Continue ?
              (Прерывание по Ctrl-Alt-SysRq. Возможен сбой системы. Про-
              должить?)

       TDeb 3.0 #3-3                = 44 =
                          Сообщения об ошибках TDW
       -----------------------------------------------------------------
            Существует два сообщения об  ошибке,  возвращаемые  исключи-
       тельно отладчиком TDW. Кроме того, могут возвращаться и сообщения
       об ошибках Турбо отладчика,  распространяющиеся и на работу  TDW,
       например "Symbol not found" в ответ на несуществующее имя оконной


       процедуры.
            Ctrl-Alt- SysRq interrupt. System crash possible. Continue ?
            (Прерывание по Ctrl-Alt-SysRq.  Возможен сбой системы.  Про-
            должить?)
            Вы пытались либо выйти из TDW, либо перезагрузить отлаживае-
       мую  прикладную программу,  когда программа была приостановлена в
       результате нажатия клавиш Ctrl-Alt-SysRq. Поскольку в момент при-
       остановки программы выполнялся код ядра Windows, выход из TDW или
       перезагрузка прикладной программы может привести к  непредсказуе-
       мым результатам (вероятнее всего, к зависанию системы и необходи-
       мости ее перезагрузки).
            Если это возможно,  установите в коде точку останова и снова
       запустите программу.  Когда ваша программа встретит эту точку ос-
       танова и выйдет в TDW, вы можете завершить работу с TDW или пере-
       загрузить вашу программу.
            Invalid window handle
            (Неверный логический номер окна)
            Пытаясь установить  регистрацию  сообщений  для  окна  вашей
       программы, вы  ввели  имя переменной логического номера (описате-
       ля), которой не был присвоен логический номер. Пройдите в пошаго-
       вом режиме до оператора,  где этот логический номер присваивается
       переменной, и попробуйте снова ввести это имя.

       TDeb 3.0 #3-3                = 45 =
             Глава 18. Отладка прикладной программы для Windows
       -----------------------------------------------------------------
            В данной главе описывается  отладка  стандартной  прикладной
       программы Windows,    написанной    без    библиотечного   класса
       ObjectWindow.
            Как было сказано в Главе 17,  отладка  прикладной  программы
       для  Microsoft  Windows во многом похожа на отладку программы для
       DOS,  особенно если речь идет об интерактивной программе для DOS.
       Все методы  отладки,  описанные в Главе 14,  "Отладка программы",


       применимы также и для программы для Windows.
            Поскольку прикладная программа для Windows использует интер-
       фейс   прикладных   программ  для  Windows  (Application  Program
       Interface - API),  существует множество  дополнительных  способов
       работы с программой. Данная глава не претендует на то, чтобы нау-
       чить вас способам безошибочного программирования  в  Windows.  Ее
       цель состоит в том, чтобы продемонстрировать средства TDW на при-
       мере отладки прикладной программы.
                              Примеры программ
       -----------------------------------------------------------------
            С  отладчиком  TDW поставляются три примера программ,  и все
       они требуют наличия "мыши". Это программы:
            - BCWDEMO.EXE,  выполняемый файл программы Simple Paint. Эта
              программа позволяет строить линии, эллипсы и прямоугольни-
              ки тремя цветами и тремя толщинами линии. Она устанавлива-
              ется для работы под управлением менеджера программ,  и мо-
              жет  быть  вызвана  посредством   выбора   соответствующей
              пиктограммы. Вместе с BCWDEMO.EXE также поставляются файлы
              исходного текста, BCWDEMO.C, и файл проекта, BCWDEMO.PRJ.
            - BCWDEMOA.EXE, выполняемый файл, который содержит все ошиб-
              ки.  С  ним  также  поставляются  файлы  исходного текста,
              BCWDEMOA.C, и файл проекта, BCWDEMOA.PRJ.
            - BCWDEMOB.EXE, выполняемый файл, который содержит все те же
              ошибки,  что и BCWDEMOA, кроме первой. С ним также постав-
              ляются файлы исходного текста, BCWDEMOB.C, и файл проекта,
              BCWDEMOB.PRJ.

       TDeb 3.0 #3-3                = 46 =
            Кроме того,  имеется  несколько файлов,  общих для всех трех
       версий программы, а именно:
            - BCWDEMO.DEF, это файл определения модуля.
            - BCWDEMO.H, это файл заголовка.


            - BCWDEMO.RC, это исходный  файл  для  получения  ресурсного
              файла.
            - BCWDEMO.RES это скомпилированный ресурсный файл.

       TDeb 3.0 #3-3                = 47 =
              Компиляция и компоновка демонстрационных программ
       -----------------------------------------------------------------
            Вам предоставляется три версии  демонстрационной  программы,
       которые упрощают изучение данной главы. При желании вы можете са-
       ми внести  изменения  в  эти  программы.  С  помощью  компилятора
       Borland C++ вы можете скомпилировать и скомпоновать их в интерак-
       тивной среде разработки разработки  программ  Borland,  используя
       имеющиеся файлы проекта.
            Более подробную информацию о компиляции программ для Windows
       с  использованием файлов проекта см.  в "Руководстве пользователя
       для Borland C++."
                         Отладка программы BCWDEMOA
       -----------------------------------------------------------------
                 Примечание: Прежде чем начать сеанс отладки,  вы можете
            немного  поэкспериментировать  с BCWDEMO.EXE,  чтобы понять,
            что собственно должна делать эта программа.
            Первая отлаживаемая программа называется BCWDEMOA. Запустите
       Windows,  TDW и запустите BCWDEMOA.  Когда в окне Module появится
       исходный  код  программы,  нажмите клавишу F9 для запуска примера
       программы.
            На экране появится курсор в виде "песочных  часов",  который
       означает,  что программа работает и выполняет некоторые действия.
       Обычно курсор в виде часов скоро исчезает, и на его месте появля-
       ется курсор в виде стрелки.  Если песочные часы не исчезают, зна-
       чит, что-то происходит неверно.
            Чтобы перейти  в  TDW  для выяснения причин неверной работы,
       нажмите клавиши Ctrl-Alt-SysRq,  чтобы  приостановить  выполнение
       программы.


                   Принятие решения о дальнейших действиях
       -----------------------------------------------------------------
            После того, как вы оказались в TDW, следующим шагом вы долж-
       ны решить,  каким именно образом выяснить, что в программе невер-
       но.  Обычно если прикладная программа для Windows зависает  и  не
       позволяет судить о ходе ее выполнения,  вы перезагружаетесь и на-
       чинаете пошаговую отладку подпрограмм инициализации  окна.  Дойдя
       до  цикла  сообщений,  вы  можете  задать  регистрацию  сообщений
       Windows, можете установить их регистрацию,  чтобы  затем  посмот-
       реть, какие сообщения поступают в программу.
            Так как  исходный  экран программы все же был отображен,  вы
       знаете, что программа дошла до цикла сообщений, поскольку для то-
       го, чтобы нарисовать этот экран, она должна была обрабатывать со-
       общения Windows.  Следовательно,  вы можете вместо пошагового вы-
       полнения сразу же перейти к регистрации  сообщений.  Зная,  какие

       TDeb 3.0 #3-3                = 48 =
       сообщения  были  обработаны,  вы как минимум будете знать,  какие
       участки кода программы были выполнены.
                             Завершение BCWDEMOA
       -----------------------------------------------------------------
            В этой точке вы можете задать, какие сообщения вы хотите ре-
       гистрировать,  и вернуться к программе,  нажав клавишу F9, однако
       выйдя из программы и снова запустив ее, вы сможете получить более
       точную картину происходящего. Поскольку с помощью клавиш Ctrl-Alt
       -SysRq вы только приостановили выполнение программы,  то выход из
       программы в этой точке может привести к зависанию системы (если в
       момент  приостановки  выполнялось  ядро Windows).  Для завершения
       программы выполните следующие шаги:
            1. Перезагрузите   программу   командой   Run¦Program  Reset


               (Выполнение¦Сброс программы) (клавиши Ctrl-F2).
            2. После перезагрузки вы получите окно модуля с WinMain. Ес-
               ли все так и произошло, вы можете пропустить все дальней-
               шие шаги и перейти к разделу "Регистрация сообщений".
            3. Если  же  вы  получили  окно с сообщением "Ctrl-Alt-SysRq
               Interrupt. System Crash possible. Continue?" ("Прерывание
               по Ctrl-Alt-SysRq.  Возможен сбой системы.  Продолжить?",
               выберите No (Нет),  чтобы отменить выход из программы.  В
               этом случае выход должен выполняться в точке  останова по
               сообщению.
            4. Вызовите  команду  View¦Windows  Messages,  чтобы вызвать
               окно Windows Message (Сообщения Windows).
            5. Курсор  находится  в  верхней   левой   области,   Window
               Selection (Выбор  окна).  Вызовите  локальное меню (нажав
               Alt-F10) и в нем выберите команду Add (Добавление).
            6. Введите имя подпрограммы,  в которой обрабатываются сооб-
               щения  для данного окна.  В этой программе имеется только
               одно окно,  и следовательно, только одна подпрограмма об-
               работки сообщений, WndProc.
            7. Нажмите клавишу Enter, чтобы подтвердить ввод.
            8. При  помощи клавиши Tab или "мыши" перейдите в правую об-
               ласть, Message Class (Класс  сообщений),  затем  вызовите
               локальное  меню  этой  области и выберите там команду Add
               (Добавление).

       TDeb 3.0 #3-3                = 49 =
            9. В окне диалога Set Message Filter (Установка фильтра  со-
               общений) выберите All Messages (Все сообщения) в качестве
               класса сообщений и Break (Прерывание)  в  качестве  дейс-
               твия,  и нажмите Enter, чтобы добавить этот класс сообще-
               ний.  TDW затем прекратит выполнение программы на  первом


               же сообщении.
           10. Для возобновления работы программы нажмите F9. На следую-
               щем же сообщении программа прервется,  и управление возв-
               ратится в TDW.
           11. В  TDW  установите курсор на WinMain и при помощи команды
               Run¦Program Reset (Выполнение¦Сброс программы) перезагру-
               зите программу. Затем вы сможете продолжить отладку.

       TDeb 3.0 #3-3                = 50 =
                            Регистрация сообщений
       -----------------------------------------------------------------
            На этот раз, прежде чем запустить программу, вы зададите TDW
       регистрацию всех сообщений. Откройте окно Windows Messages (Сооб-
       щения Windows) при  помощи  команды  View¦Windows  messages  (Об-
       зор¦Сообщения   Windows)  и  добавьте  в  верхней  левой  области
       WndProc. В правой верхней области должна  появиться  надпись  Log
       all messages (Регистрация всех сообщений). Это именно то, что вам
       нужно, и работа с этим окном закончена.
            Поскольку заранее число регистрируемых сообщений неизвестно,
       может случиться так,  что до выхода из программы предельное число
       регистрируемых сообщений (200) будет превышено, поэтому вы должны
       обеспечить запись сообщений в файл. Для этого:
            1. Перейдите  в  нижнюю область окна Windows Messages (Сооб-
               щения Windows) и вызовите локальное меню.
            2. Выберите команду Send To Log Window (Пересылка в окно ре-
               гистрации). Если  эта  установка имеет значение No (Нет),
               переключите ее на Yes (Да), нажав клавишу Enter.
            3. Перейдите  в  окно  Log  (Регистрация),  выбрав   команду
               View¦Log (Обзор¦Регистрация), и вызовите локальное меню.
            4. Выберите команду Open Log File (Открыть файл регистрации)
               и нажмите клавишу Enter,  чтобы подтвердить имя файла ре-


               гистрации (журнала) по умолчанию, BCWDEMOA.LOG.
            Теперь вы готовы запустить программу, нажав клавишу F9. Ког-
       да появится экран, нажмите клавиши Ctrl-Alt-SysRq, чтобы вернуть-
       ся к TDW.
                          Анализ протокола сообщений
       -----------------------------------------------------------------
            В нижней  области  окна Windows Messages (Сообщения Windows)
       вы увидите множество сообщений WM_PAINT, и вероятно, больше ника-
       ких других.  Для того,  чтобы просмотреть все сообщения, выберите
       команду View¦File  (Обзор¦Файл)  и  получите список всех файлов в
       текущем каталоге.  Выберите из этого  списка  файл  BCWDEMOA.LOG,
       представляющий собой протокол сообщений.
            При этом вы получите достаточно  короткий  список  сообщений
       инициализации окна (16 или около этого), за которым следует очень
       длинный  список  сообщений  WM_PAINT.  причиной является то,  что
       Windows начала посылать сообщения,  чтобы установить исходный эк-
       ран,  но "застряла" на сообщении WM_PAINT. Данный анализ отражает
       то, что вы видели при запуске программы: экран появился, но боль-
       ше ничего не происходило.

       TDeb 3.0 #3-3                = 51 =
                                Поиск ошибки
       -----------------------------------------------------------------
            Итак, что делать дальше? Можно начать с просмотра кода, что-
       бы  найти  там  тот,  участок,  который  отвечает  за   обработку
       WM_PAINT.  Однако, существует более привлекательная альтернатива,
       которая состоит в том, чтобы установить точку останова по сообще-
       нию, позволяющую сразу выйти на нужный участок программы, а затем
       начать пошаговое выполнение, которое позволит точно выяснить при-
       чину ошибки.
            Установка точки останова по сообщению также отменит действие
       выхода по Ctrl-Alt-SysRq,  который делает небезопасным дальнейшее


       пошаговое выполнение программы или выход из TDW.  Так как сообще-
       нием, на котором "застряла" программа, является WM_PAINT, устано-
       вите  для  TDW прерывание по сообщению WM_PAINT и снова запустите
       программу, следующим образом:
            1. Снова   войдите   в   окно  Windows  Messages  (Сообщения
               Windows),  перейдите в правую верхнюю  область,  вызовите
               локальное меню и выберите Add (Добавление).
            2. Появится блок диалога Set Message Filter (Задание фильтра
               сообщений)  с уже выбранным значением Single Message (От-
               дельное сообщение), а курсор в это время будет находиться
               в текстовом поле ввода Single Message Name (Имя отдельно-
               го  сообщения).  Введите WM_PAINT (только заглавными бук-
               вами,  иначе TDW не сможет найти соответствие),  а в  ка-
               честве действия выберите Break (Прерывание).
            3. Для запуска программы нажмите F9.
            Программа немедленно  прервется,  и  вы  окажитесь на первой
       строке WndProc.  (Чтобы получить полный  обзор  кода,  вы  должны
       очистить с экрана окно Windows Messages). Эта подпрограмма состо-
       ит из оператора switch для сообщений, специальным образом обраба-
       тываемых программой.
            Подпрограмма WndProc:
            long FAR PASCAL WndProc (HWND hWnd, unsigned Message,
                                     WORD wParam, LONG lParam)
            {
               switch(Message)
               {
                  case WM_COMMAND:
                     return DoWMCommand(wParam, hWnd);
                  case WM_LBUTTONDOWN:
                     DoLButtonDown(hWnd,lParam);
                     break;
                  case WM_LBUTTONUP:
                     DoLButtonUp(hWnd,lParam);
                     break;

       TDeb 3.0 #3-3                = 52 =
                  case WM_MOUSEMOVE:
                     DoMouseMove(hWnd,lParam);


                     break;
                  case WM_PAINT:
                     DoPaint(hWnd);
                     break;
                  default:
                     return DefWindowProc(hWnd,Message,wParam,lParam);
               }
               return 0;
            }
                       Пошаговое выполнение программы
       -----------------------------------------------------------------
            Для пошагового  выполнения  программы нужно нажимать клавишу
       F7.  Маркер текущей строки дойдет до оператора case  WM_PAINT,  и
       наконец до подпрограммы DoPaint.
            Подпрограмма DoPaint:
            void DoPaint(HWND hWnd)
            {
               int     i,
                       saveROP;
               HDC     hdc,
                       hMemDC;
               RECT    theRect,
                       destRect;
               HBITMAP      the Bitmap;
               PAINTSTRUCT  ps;
               if (CurrentPoint >= 0)
               {
                  hdc = BeginPaint(hWnd,&ps);
               /*
                * Определить, какая прямоугольная область отмечена
                * как недопустимая.
                * Если ни один прямоугольник не помечен как
                * недопустимый, то экран будет полностью перерисован.
                */
               GetUpdateRect(hWnd,&theRect,0);
               if (IsRectEmpty(&theRect))
                   GetClientRect(hWnd,&theRect);
               /*
                * Создание DC (контекста устройства) и области
                * того же размера, что и обновляемый прямоугольник.
                */

       TDeb 3.0 #3-3                = 53 =
                hMemDC = CreateCompatibleDC(hdc);
                theBitmap = CreateCompatibleBitmap(hdc,
                                  theRect.right-theRect.left
                                  theRect.bottom-theRect.top);
                SelectObject(hMemDC,theBitmap);
               /*


                * Стирание memBitmap
                */
                BitBlt(hMemDC, 0, 0,
                       theRect.right-theRect.left
                       theRect.bottom-theRect.top,
                       hdc, 0, 0, SCRCOPY);
               /*
                * Рисование только тех фигур, которые находятся
                * внутри обновляемого прямоугольника.
                */
                for (i = 0; i <= CurrentPoint; ++i)
                {
                   IntersectRect(&destRect, &thisShape[i].Points,
                                   &theRect);
                   if (!IsRectEmpty(&destRect))
                       DrawShape(hMemDC,
                          thisShape[i].Points.left-theRect.left,
                          thisShape[i].Points.top-theRect.top,
                          thisShape[i].Points.right-theRect.left,
                          thisShape[i].Points.bottom-theRect.top,
                          thisShape[i].theShape,thisShape[i].PenWidth,
                          thisShape[i].PenColor,thisShape[i].slope);
               /*
                * Отметим, что при рисовании фигуры программа переместила
                * ее точку начала координат т.о., что она оказалась в
                * верхнем левом углу обновляемого прямоугольника.
                * Это точка (0,0) области, в которую будет выполнено
                * отображение (theRect.left,theRect.right).
                */
                }
               /*
                * И наконец, копирование области в область обновляемого
                * прямоугольника.
                */
                BitBlt(hdc, theRect.left, theRect.top,
                       theRect.right-theRect.left,
                       theRect.bottom-theRect.top,
                       hMemDC, 0, 0, SRCCOPY);
                DeleteDC(hMemDC);

       TDeb 3.0 #3-3                = 54 =
                DeleteObject(theBitmap);
                EndPaint(hWnd,&ps);


               }
            }
            По мере продолжения пошагового выполнения  вы  увидите,  что
       единственная строка кода, выполняемая внутри DoPaint, это:
            if (CurrentPoint >= 0)
            Затем управление  возвращается  в цикл сообщений,  в котором
       программа принимает следующее сообщение,  WM_PAINT, и затем снова
       уходит на цикл с WndProc и DoPaint.  Подпрограмма DoPaint, безус-
       ловно, что-то делает не так, и нужно сначала выяснить, что же она
       должна делать на самом деле?

       TDeb 3.0 #3-3                = 55 =
                               Анализ DoPaint
       -----------------------------------------------------------------
            Назначение данной подпрограммы состоит либо в рисовании все-
       го экрана при первом вызове подпрограммы,  либо в перерисовке об-
       ласти  экрана,  текущего  прямоугольника,  если  на  экране  было
       что-либо нарисовано. Чтобы определить, было ли что-нибудь нарисо-
       вано,  DoPaint проверяет значение переменной Currentpoint, перво-
       начально устанавливаемой в -1.  (CurrentPoint указывает число на-
       рисованных объектов).  Если CurrentPoint имеет  значение  -1,  то
       есть  значение,  которое было установлено при запуске и рисовании
       исходного экрана,  то брать и перерисовывать содержимое  текущего
       прямоугольника нет необходимости,  поэтому все коды внутри опера-
       тора if опускается, и происходит возврат, а Windows перерисовыва-
       ет все окно.
            Если вы   будете  проверять  значение  CurrentPoint  в  окне
       View¦Watches (Обзор¦Просмотр),  то вы увидите,  что оно  остается
       равным  -1 при пошаговом прохождении программы.  Это так и должно
       быть, поскольку нарисовать что-либо вы не имели возможности.
                              Нахождение ошибки
       -----------------------------------------------------------------
            Теперь, если  вы обратитесь к книге Чарльза Петцольда "Прог-


       раммирование  для   Windows"   ("Charles   Petzold,   Programming
       Windows"),  то причина ошибки станет вам ясна.  Минимальная реак-
       ция,  которая нужна Windows в ответ на сообщение WM_PAINT, должна
       состоять в вызове BeginPaint,  за которым следует EndPaint.  Если
       эти подпрограммы не вызываются, то Windows не знает, что было по-
       лучено  сообщение WM_PAINT,  и продолжает посылать WM_PAINT прог-
       рамме.
            Обратите внимание,  что вызов  BeginPaint  находился  внутри
       оператора if,  и подпрограмма при первой прорисовке экрана не вы-
       зывалась. Чтобы решить проблему, вы должны вынести оператор с вы-
       зовом BeginPaint за пределы условного оператора if.
            Как обстоит  дело  с оператором EndPaint?  Он тоже находится
       внутри if, вместе с вызовом подпрограммы ReleaseDC, которая осво-
       бождает hdc,  логический  номер (описатель) контекста устройства,
       устанавливаемый вызовом BeginPaint.  Эти две строки должны  нахо-
       диться вне конструкции if.
                             Завершение BCWDEMOA
       -----------------------------------------------------------------
            В BCWDEMOB,  второй версии программы, которую вы будете изу-
       чать,  ошибка,  связанная с WM_PAINT,  уже исправлена. Прежде чем
       загружать эту программу,  нужно завершить работу BCWDEMOA,  чтобы
       освободить используемые ей ресурсы.  Поскольку единственная проб-
       лема с этой программой состояла в том,  что при первом проходе не
       выполнялся  код  внутри оператора if,  установка CurrentPointer в

       TDeb 3.0 #3-3                = 56 =
       ноль приведет к выполнению этого кода,  что  позволяет  нормально
       выйти из программы.  Для завершения программы выполните следующие
       шаги:
            1. В окне Windows Messages (Сообщения Windows)  уберите  имя
               оконной  процедуры WndProc в левой верхней области, чтобы


               программа  не  была  прервана  при  получении   сообщения
               WM_PAINT.
            2. Нажимайте F7, пока на дисплее не появится следующая стро-
               ка:
                         if (Currentpointer >= 0)
            3. Выделите  CurrentPoint,  затем  нажмите  клавиши Ctrl-F4,
               чтобы перейти к экрану Evaluate/Modify  (Вычисление/Моди-
               фикация).
            4. Выберите Eval (Вычисление).
            5. Поместите  курсор  на  поле ввода New Value (Новое значе-
               ние),  введите 0,  а затем выберите Modify (Модификация),
               чтобы изменить значение переменной. Теперь при выполнении
               программы оператор if при вычислении условия даст  значе-
               ние True,  а  BeginPaint  и  EndPaint будут выполнены при
               первом же проходе.
            6. Выберите клавишу F9 для выполнения программы.
            7. Выберите Quit для выхода из программы.  Чтобы эта команда
               сработала,  вам  может понадобиться нажать клавишу,  пос-
               кольку Windows может отказаться освободить сообщения вво-
               да от "мыши" из системной очереди.  Нажатие клавиши осво-
               бодит из очереди все находящиеся там в текущий момент со-
               общения ввода от "мыши".
                              Отладка BCWDEMOB
       -----------------------------------------------------------------
            Завершив работу  программы  BCWDEMOA,  вы  можете  загрузить
       программу BCWDEMOB.  Когда программа появится на экране,  нажмите
       для  ее  запуска  клавишу  F9,  и попробуйте немного поработать с
       программой.
            Если вы нарисовали большое число объектов,  и  особенно  при
       интенсивном перемещении  "мыши" при нажатой кнопке,  вы увидите в
       конце-концов, что с программой начинают происходить странные  ве-
       щи. Сначала вы сможете заметить,что программа стала медленнее ра-


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

       TDeb 3.0 #3-3                = 57 =
       памяти. Чтобы проверить, так ли это, и найти местоположение ошиб-
       ки,  повторите загрузку Windows,  выполните только менеджер прог-
       рамм и TDW, если это возможно (чтобы минимизировать использование
       памяти), и загрузите BCWDEMOB и TDW снова.
                          Переключение из программы
       -----------------------------------------------------------------
            Прежде чем продолжить сеанс отладки, может потребоваться ор-
       ганизовать  отладку  таким   образом,   чтобы   не   использовать
       Ctrl-Alt-SysRq для  переключения  из перекладной программы в TDW,
       поскольку использование данного метода требует осторожности.  Ре-
       шение состоит в том,  чтобы установить единственное сообщение, по
       которому должно выполняться прерывание,  и которое вы  по  своему
       желанию можете генерировать в программе, и которое обычно само по
       себе не появляется.
            Так как BCWDEMO - это работающая с "мышью" графическая прог-
       рамма, не принимающая графического ввода, то работа с клавиатурой
       здесь обычно не нужна.  Следовательно,  лучше всего  организовать
       прерывание по сообщению WM_KEYFIRST.  После задания этого сообще-
       ния в окне View¦Windows Message (Обзор¦Сообщения  Windows)  прог-
       рамма  будет  прерываться при каждом нажатии клавиши.  (Поскольку
       программа не реагирует и на нажатие  правой  кнопки  "мыши",  для
       этой цели можно использовать и сообщение WM_RBUTTONDOWN).
                           Тестирование программы
       -----------------------------------------------------------------
            Теперь вы можете нажать клавишу F9,  чтобы начать выполнение


       программы BCWDEMOB. Прежде чем сделать что-либо в программе, про-
       верьте, какой процент системной памяти  доступен  программам  для
       Windows,  переключившись  на  менеджер программ,  выбрав "кнопку"
       Help (Справка) и затем выбрав About Program Manager  (О менеджере
       программ). Появится информационный блок, в котором будет показана
       текущая версия Windows, объем свободной памяти и в нижней части -
       интересующие  вас  статистические данные,  процентные соотношения
       свободной памяти для системных ресурсов.
            Теперь вернемся в программа Simple Paint и немного порисуем.
       Затем  снова перейдем на экран About Program Manager (О менеджере
       программ),  и вы увидите,  что доступная память для системных ре-
       сурсов  уменьшилась.  Если  вы и дальше продолжите рисование,  то
       объем этой памяти будет продолжать уменьшаться до нуля,  и вы по-
       лучите тот же эффект, что и ранее.
                              Принятие решения
       -----------------------------------------------------------------
            Что вам известно в данный момент?  Прежде  всего,  программа
       явно распределяет  глобальную  память,  так  как она в результате
       расходует все системные ресурсы, доступные Windows. С этого можно
       начать: вы можете перезагрузить программу, воспользоваться средс-

       TDeb 3.0 #3-3                = 58 =
       твами TDW контроля глобальной памяти для сохранения списка объек-
       тов глобальной памяти в файл регистрации (протокол),  немного по-
       рисовать в Simple Paint и затем снова  получить  список  объектов
       глобальной памяти, записав его в другой файл.
            Так как Windows за это время, вероятно, перемещала объекты в
       памяти,  то два полученных списка могут не совпадать.  Вы  должны
       просмотреть каждый объект в списке и сопоставить его с объектами,
       имеющими того же владельца в другом списке,  чтобы найти  несоот-


       ветствия.
            Поскольку этот метод занимает много времени, то предлагается
       он только как упражнение по просмотру глобальной  памяти.  Метод,
       которым вы будете пользоваться фактически,  состоит в том,  чтобы
       просмотреть объекты памяти,  выделяемые программой,  и проверить,
       выполняет ли программа и их освобождение.
               Сравнение списков объектов глобальной памяти
       -----------------------------------------------------------------
            Для получения списка объектов глобальной памяти нужно выпол-
       нить следующие действия:
            1. Перезапустите Windows,  чтобы обеспечить очистку глобаль-
               ной памяти от  любых  объектов,  выделенных  BCWDEMOB.  И
               опять,  избегайте  запускать  ненужные  программы,  чтобы
               уменьшить число объектов глобальной памяти.
            2. Если  вы  находитесь  в  TDW и загрузили BCWDEMOB,  снова
               установите прерывание программы по сообщению WM_KEYFIRST.
            3. Нажмите клавишу F9 для запуска программы, а затем нажмите
               клавишу для выхода обратно в TDW.
            4. Выберите  команду View¦Log (Обзор¦Регистрация) и вызовите
               локальное меню.
            5. Выберите  команду  Open  Log¦File (Открыть файл¦Регистра-
               ция), введите в появившемся окне диалога имя файла журна-
               ла и нажмите клавишу Enter.
            6. Снова вызовите локальное меню окна Log (Регистрация), вы-
               берите команду Display  Windows  Info  (Вывод  информации
               Windows),  а затем нажмите клавишу Enter,  когда появится
               окно диалога Windows  Information  (Информация  Windows).
               Нажатие  Enter принимает установки по умолчанию, задающие
               вывод списка объектов глобальной памяти,  начиная с верх-
               них адресов памяти.
            7. Когда  отладчик  TDW  закончит листинг глобальной памяти,


               снова вызовите список объектов глобальной памяти и  выбе-
               рите команду Close Log File (Закрытие файла регистрации),
               чтобы закрыть файл.

       TDeb 3.0 #3-3                = 59 =
            8. Выберите из локального меню команду  Erase  Log  (Стереть
               протокол), чтобы очистить протокол.
            9. Нажмите F9, чтобы снова запустить программу, и при помощи
               "мыши" проконтролируйте информацию в блоке  About Program
               Manager.  Запомните проценты, приведенные там для систем-
               ных ресурсов.
           10. Нарисуйте в Simple Paint достаточно, чтобы уменьшить сис-
               темные ресурсы на 20-30 процентов.
           11. Нажмите  клавишу для возврате в TDW и повторите шаги 4-8,
               на этот раз с другим именем  файла  протокола  (регистра-
               ции).
           12. Выйдите из TDW,  распечатайте файлы протоколов и сравните
               их.
            Проделав это, вы отметите следующее:
            - Объекты памяти,  принадлежащие BCWDEMOB,  не увеличились в
              размерах.
            - Объекты памяти GDI увеличились в размерах.
            Первое из этих примечаний подтверждает то, что вы уже знаете
       о программе:  отлаживаемый код программы BCWDEMOB  выделяет  гло-
       бальную память, а не локальную.
            Второе говорит вам нечто новое:  BCWDEMOB  выделяет  объекты
       Интерфейса графических устройств (GDI) и не освобождает их.
                  Нахождение ошибки: функциональный подход
       -----------------------------------------------------------------
            Теперь, зная характер ошибки,  вы можете начать искать место
       в  программе,  где  выделяются  объекты памяти,  не освобождаемые
       впоследствии.  Для этого  полезно  сделать  функциональный  обзор
       программы и исследовать каждую подпрограмму  в последовательности
       их вызова.
                            Выбор элементов меню


       -----------------------------------------------------------------
            Выбор элементов  меню выполняется посредством помещения кур-
       сора в меню,  нажатия левой кнопки "мыши" и перемещения по меню к
       желаемому  элементу,  выбор которого изменяет цвет,  толщину пера
       или форму изображения. Изменение любого из этих значений вызывает
       посылку сообщения WM_COMMAND в подпрограмму WndProc,  которая об-
       рабатывает сообщение, вызывая для этого DoWMCommand.
            DoWMCommand содержит оператор switch, который сохраняет сде-

       TDeb 3.0 #3-3                = 60 =
       ланный вами выбор в переменной программы. Эти переменные хранятся
       в сегменте данных BCWDEMO и не влияют на глобальную память.
                              Рисование фигуры
       -----------------------------------------------------------------
            Для того,  чтобы нарисовать фигуру, вы устанавливаете курсор
       в предназначенную для графического ввода пользователя область ок-
       на,  удерживая нажатой левую кнопку "мыши" перемещаете  курсор  в
       другую точку и там отпускаете кнопку "мыши".  Если вы перемещаете
       "мышь" при ненажатой левой кнопке, вы можете заметить, что фигура
       по мере перемещения рисуется, стирается и снова рисуется. Остает-
       ся она на экране только при отпускании левой кнопки.
                          Нажатие левой кнопки "мыши"
       -----------------------------------------------------------------
            При нажатии левой кнопки в области пользовательского  графи-
       ческого   ввода   Windows  посылает  сообщение  WM_LBUTTONDOWN  в
       WndProc,  что приводит к вызову  DoButtonDown.  Эта  подпрограмма
       сохраняет текущую   позицию   "мыши"   (которая  далее  именуется
       меткой) и  выполняет  установки  характеристик  пера  в структуре
       thisShape. Эта структура представляет собой  переменную программы


       и влияет только на сегмент данных программы BCWDEMO.
                              Перемещение "мыши"
       -----------------------------------------------------------------
            Когда вы перемещаете "мышь" при нажатой левой кнопке в поль-
       зовательской области ввода, Windows посылает WM_MOUSEMOVE (или WM
       _MOUSEFIRST,  что  то  же  самое)  в  WndProc,  которая  вызывает
       DoMouseMove. Эта подпрограмма вызывает DrawShape для стирания фи-
       гуры от  предыдущей  позиции "мыши" до исходной,  а затем снова -
       для рисования фигуры от текущей позиции  до  метки.  Единственное
       использование глобальной памяти в DoMouseMove состоит в получении
       контекста устройства для текущего окна,  который освобождается  в
       конце подпрограммы вызовом ReleaseDC.
               Рисование фигуры (и нахождение позиции ошибки)
       -----------------------------------------------------------------
            Теперь рассмотрим подпрограмму DrawShape, которая дважды вы-
       зывается из DoMouseMove. DrawShape запоминает перо, которым рисо-
       валась предыдущая фигура,  создает новое перо и рисует линию, эл-
       липс или прямоугольник.  В конце своей работы она восстанавливает
       сохраненное на входе перо.
            Поскольку перо - это объект интерфейса графических устройств
       (GDI), выделяемый в глобальной памяти, подпрограмма DrawShape мо-
       жет содержать код, вызывающий проблемы с памятью. Эта подпрограм-
       ма вызывает особенное подозрение,  так как она вызывается  дважды
       при каждом перемещении мыши.  Если она создает перья и не удаляет
       их, то она "съест" память очень скоро.

       TDeb 3.0 #3-3                = 61 =
            Действительно, недалеко  от  начала  DrawShape выделяет перо
       вызовом SelectObject, но не освобождает выделенную ему память вы-
       зовом DeleteObject в конце. Чтобы исправить эту ошибку, вы должны


       заменить последнюю строку DrawShape следующим кодом:
            DeleteObject(SelectObject(hdc,saveObject));
            Возможно, найденная  ошибка  является  единственной причиной
       проблем с памятью,  однако желательно проверить и  все  остальные
       места программы, связанные с рисованием объектов.
                            Отпускание левой кнопки
       -----------------------------------------------------------------
            При отпускании  левой кнопки "мыши" BCWDEMOB рисует фигуру в
       последний раз и оставляет ее на экране. Отпускание кнопки застав-
       ляет  Windows  послать сообщение WM_LBUTTONUP в WndProc,  которая
       вызывает DoLButtonUp.  Эта подпрограмма сохраняет текущий прямоу-
       гольник  из  пользовательской  области  в  массив  текущей фигуры
       thisShape,  вызывает InvalidateRect для добавления области в  об-
       ласть обновления окна, а затем вызывает UpdateWindow, которая по-
       сылает сообщение WM_PAINT прямо в главное окно.  Эта подпрограмма
       не использует глобальную память.
            При выходе  из  DoLButtonUp  сообщение  WM_PAINT находится в
       очереди и готово к обработке в WndProc.

       TDeb 3.0 #3-3                = 62 =
                             Перерисовка экрана
       -----------------------------------------------------------------
            Когда WndProc  получает  сообщение  WM_PAINT,  она  вызывает
       DoPaint для перерисовки соответствующей области  экрана  (описана
       выше в этом разделе). При перерисовке обновляемого прямоугольника
       DoPaint вызывает две подпрограммы Windows, влияющие на глобальную
       память:  CreateCompatibleDC и SelectObject. В конце DoPaint вызы-
       ваются DeleteDC и DeleteObject,  которые освобождают выделенную в
       начале подпрограммы память.
                                 Заключение
       -----------------------------------------------------------------
            Так как вы рассмотрели все подпрограммы, вы можете быть уве-


       рены,  что ошибка,  связанная с памятью,  найдена. Этот метод был
       выбран потому,  что вы недостаточно детально знаете  отлаживаемую
       программу.  Разумеется,  в программе,  написанной лично вами,  вы
       нашли бы такую ошибку гораздо быстрее.
            Не мешает также и более  подробное  тестирование  программы.
       Хорошо зная программу, вы могли бы не искать ошибку в части прог-
       раммы, связанной с меню, так как обнаружили бы, что сбой програм-
       мы  наступает  и при одном только перемещении курсора по экрану с
       помощью "мыши".  Кроме  того,  обнаружив,  что проблема возникает
       только при перемещении "мыши" в области пользовательского  графи-
       ческого  ввода  при нажатой левой кнопке (это вы могли бы обнару-
       жить,  нажав кнопку и перемещая курсор до тех пор,  пока не прои-
       зойдет  сбой  программы),  вы  могли  бы сразу предположить,  что
       проблема связана с подпрограммой DoMouseMove и на ней  сосредото-
       чить свои усилия.

       TDeb 3.0 #3-3                = 63 =
            Глава 19. Отладка программы, использующей ObjectWindows
       -----------------------------------------------------------------
            Пример объектно-ориентированной  программы  данной главы был
       написан с помощью класса ObjectWindows,  который существенно  об-
       легчает  программирование в Windows.
            Примерами программ  служат  программа  TDODEMO и TDODEMOB (B
       обозначает версию программы с ошибками).  Программа TDODEMOB  со-
       держит  несколько ошибок,  которые вы выявите при работе с данной
       главой.
            Перед тем,  как продолжить изучение,  полезно  запустить  из
       Windows программу  TDODEMO  и немного поэкспериментировать с ней,
       чтобы получить представление, как она работает. Вы можете исполь-
       зовать для запуска TDODEMO.EXE команду File¦Run (Файл¦Выполнение)
       менеджера программ или добавить ее к программной группе в качест-


       ве пиктограммы.
                 Примечание: При   отсутствии  файлов  .EXE  для  файлов
            TDODEMO и TDODEMOB вам потребуется открыть их файлы проектов
            и перекомпилировать эти файлы с включением отладочной инфор-
            мации.
                              О программе
       -----------------------------------------------------------------
            TDODEMOB -   это   программа,  написанная  с  использованием
       ObjectWindows,  позволяющая рисовать на экране различными цветами
       с помощью "мыши".  Когда вы нажимаете левую кнопку "мыши" и пере-
       мещаете "мышь", то программа рисует на экране линию. Нажав правую
       кнопку "мыши",  вы можете очистить окно.  Программа TDODEMO имеет
       строку меню,  которая позволяет вам выбрать один из 4 цветов: Red
       (красный), Green (зеленый), Blue (голубой) или Black (черный).
            Вы можете рисовать,  нажимая кнопку "мыши", перемещая "мышь"
       и освобождая кнопку "мыши".  Программа легко выполняет эту задачу
       с помощью библиотеки ObjectWindows и динамических виртуальных ме-
       тодов.  Динамический виртуальный метод - это метод с  присвоенным
       ему числовым идентификатором.
            Поскольку Borland  C++  определяет  имена сообщений Windows,
       как числовые константы,  вы можете использовать номера  сообщений
       Windows в качестве идентификатора динамического метода.  При этом
       ObjectWindows может вызывать данный метод,  когда окно, для кото-
       рого объявлен метод, получает совпадающее с идентификатором мето-
       да сообщение. Если нет метода, идентификатор которого совпадает с
       идентификатором  метода,  ObjectWindows  вызывает используемую по
       умолчанию процедуру окна.
            Например, чтобы создать метод, который отвечает на сообщения
       WM_MOUSEMOVE,  вы можете определить метод в объекте окна, который


       выглядит следующим образом:

       TDeb 3.0 #3-3                = 64 =
            procedure WMMouseMove(var Msg: TMessage); virtual WM_MOUSE;
            Как вы можете видеть,  идентификатор WM_MOUSEMOVE можно при-
       соединить  к  процедуре  с помощью оператора virtual <идентифика-
       тор>, который непосредственно следует за описанием процедуры.
            Параметры процедуры окна Windows wParam  и  lParam  содержит
       тип TMessage.  Эти параметры часто содержат дополнительную инфор-
       мацию о сообщении, например, где позиционируется "мышь".
            В следующих  нескольких  разделах  поясняется,  как работает
       программа TDODEMOB.  В нее преднамеренно внесены ошибки,  которые
       вы сможете обнаружить позднее. Полезно также запустить Турбо Пас-
       каль для Windows и открыть файл TDODEMOB.PAS,  после чего вы смо-
       жете следовать по коду программы.
                  Определение оконного типа ScribbleWindow
       -----------------------------------------------------------------
            Тип ScribbleWindow определяется следующим образом:
            class ScribbleWindow : public TWindow
            {
            public:
                 HDC HandleDC;       // вывод содержимого для рисования
                 BOOL ButtonDown;    // флаг левой кнопки
                 HPEN ThePen;        // перо, которое используется для
                                     // рисования цветом
            ScribbleWindow(PTWindowObject AParent, LPSTR ATitle);
                -ScribbleWindow();
                void GetWindowClass(WNDCLASS &AWndClass);
                virtual void WMLButtonDown(RTMessage
            Msg)=[WN_First+WM_LBUTTONDOWN];
                virtual void WMLButtonUp(RTMessage MSG)=(WM_FIRST+
                              WM_LBUTTONUP);
                virtual void WMLMouseMove(RTMessage MSG)=(WM_FIRST+
                              WM_MOUSEMOVE);
                virtual void WMLButtonDown(RTMessage MSG)=(WM_FIRST+


                              WM_LBUTTONDOWN);
            virtual void SelectRedPen(RTMessage Msg)=(CM_FIRST+
                                                       CM_RED);
            virtual void SelectGreenPen(RTMessage Msg)=(CM_FIRST+
                                                        CM_GREEN);
            virtual void SelectBluePen(RTMessage Msg)=(CM_FIRST+
                                                        CM_BLUE);
            virtual void SelectBlackPen(RTMessage Msg)=(CM_FIRST+
                                                        CM_BLACK);
            virtual void SetupWindow();
            };

       TDeb 3.0 #3-3                = 65 =
            Класс ScribbleWindow определяет определяет объект окна,  ко-
       торый отвечает на следующий ввод пользователя:
            - перемещение "мыши";
            - нажатие и освобождение левой кнопки "мыши";
            - нажатие правой кнопки "мыши";
            - цвет и позицию пера.
            Имеются три  экземпляра  переменных  -  HandleDC,  ThePen  и
       ButtonDown, которые содержат класс устройства,  текущее перо, ко-
       торым рисует  пользователь,  и  состояние кнопки "мыши" соответс-
       твенно.

       TDeb 3.0 #3-3                = 66 =
                         Конструктор ScribbleWindow
       -----------------------------------------------------------------
            Конструктор ScribbleWindow  присоединяет  меню к программе и
       инициализирует элемент  данных  ButtonDown  значением  FALSE,   а
       ThePen - значением CM_BLACK.
                               GetWindowClass
       -----------------------------------------------------------------
            Функция-элемент GetWindowClass вызывает  стандартную функцию
       TWindow CegWindowClass устанавливает окно таким образом,  что оно
       ведет себя аналогично любому другому окну TWindow, а затем иници-
       ализирует пиктограмму программы.


                                WMRButtonDown
       -----------------------------------------------------------------
            Когда пользователь  нажимает  в  окне  ColorScribble  правую
       кнопку "мыши"  и  собирается  рисовать,  окно  получает сообщение
       WM_LBUTTONDOWN, которое приводит к тому,  что ObjectWindows вызы-
       вает  подпрограмму WMLButtonDown (так как она имеет идентификатор
       WM_FIRST+WM_LBUTTONDOWN).  Подпрограмм  WMLButtonDown  перемещает
       перо   в   текущую  позицию  "мыши"  и  устанавливает  переменную
       ButtonDown, чтобы указать,  что кнопка нажата,  а затем  выбирает
       ThePen в текущий контекст устройства. В Windows имеются также до-
       полнительные вызовы данной функции,  о чем будет рассказано ниже.
                                 WMLButtonUp
       -----------------------------------------------------------------
            Когда пользователь заканчивает рисование и освобождает кноп-
       ку "мыши",  окно получает сообщение WM_LBUTTONUP,  которое в свою
       очередь приводит  к  тому,  что  ObjectWindows  вызывает  функцию
       WMLButtonUp. Программа присваивает переменной ButtonDown значение
       False и освобождает класс устройства, связанный с данным окном.
                                WMRButtonDown
       -----------------------------------------------------------------
            Когда пользователь  нажимает  правую  кнопку  "мыши",  чтобы
       очистить экран, ObjectWindows вызывает функцию WMRButtonDown, ко-
       торая, в свою очередь, вызывает функцию Windows UpdateWindow. Вы-
       зов данной функции предназначен для очистки окна.
                                 WMMouseMove
       -----------------------------------------------------------------
            Когда пользователь  начинает перемещать курсор по окну, окно
       получает сообщение WM_MOUSEMOVE,  которое приводит  к  тому,  что
       ObjectWindows вызывает функцию WMMouseMove.


Если пользователь на-
       жал левую кнопку "мыши", то программа рисует при каждом перемеще-
       нии "мыши" линию. Если пользователь не нажимает кнопку "мыши", то

       TDeb 3.0 #3-3                = 67 =
       ничего не происходит.
                           Подпрограммы цвета пера
       -----------------------------------------------------------------
            Имеются также  четыре  функции,  устанавливающие  цвет пера,
       удаляя текущее перо и создавая новое перо с  нужным  цветом.  Эти
       функции отличаются только устанавливаемыми цветами.

       TDeb 3.0 #3-3                = 68 =
                        Создание прикладной программы
       -----------------------------------------------------------------
            Чтобы создать прикладную программу,  которая использует окно
       окно ColorScribble,  необходимо  создать  класс  на основе класса
       ObjectWindow в  TApplication.  Назначение  этого  класса  (класса
       CSribbleApplication) состоит в следующем:
            - Переопределении  функции  InitMainWindow,  благодаря  чему
              прикладная программа сможет  создавать  основное  окно  со
              свойствами окна CSribbleWindows.
            - Обеспечении  объектного  типа MyApp,  который используется
              для установки окна и запуска программы.
                 Примечание: MainWindow, используемое для задания преры-
            вания по сообщению окна,  которое описывается в данной главе
            ниже, является элементом MyApp.
            Теперь вы знаете как работает программа и можете  начать  ее
       отлаживать.
                              Отладка программы
       -----------------------------------------------------------------
            Если вы еще этого не сделали,  запустите  отладчик  TWD  под
       Windows, загрузите программу TDODEMOB.CPP затем  нажмите  клавишу
       F9  для запуска демонстрационной программы.  Вы можете перемещать


       "мышь" и даже выбирать команды меню, но когда вы нажимаете кнопку
       "мыши" и начинаете перемещать "мышь",  вы увидите, что происходит
       сбой программы и она возвращает управление в TDW с  сообщением об
       ошибке "Exception 13" ("Исключительная ситуация 13").
                 Примечание: TDW выводит сообщение "Exception 13", когда
            ваша программа приводит к невосстановимой ошибке.
                        Выявление первой ошибки
       -----------------------------------------------------------------
            Когда вы  нажимаете  клавишу  Esc и очищаете окно сообщений,
       TDW оставляет вас с окне CPU (ЦП). Данное окно выводится, так как
       во время сбоя ваша программа выполняет код Windows. Так как вы не
       вернулись в окно Module (Модуль),  то отсутствует удобный маркер,
       который  отмечал бы место,  в котором обращение вашей программы к
       Windows вызвало невосстановимую ошибку.
            Перед тем как продолжить, нажмите клавиши Alt-F3, чтобы зак-
       рыть окно CPU (в основном вы будете работать в окно Module).
                   Поиск функции, которая вызывает Windows
       -----------------------------------------------------------------
            Так как сбой в программе происходит при нажатии левой кнопки

       TDeb 3.0 #3-3                = 69 =
       "мыши", вероятно проблема заключается в функции WMLButtonUp.  Од-
       нако существует  другой  метод,  который  можно  использовать для
       определения того,  где  находилась  ваша  программа - трассировка
       стека.
            Для выполнения  трассировки стека выберите с помощью команды
       View¦Stack (Обзор¦Стек) окно Stack (Стек) и прокрутите вниз  спи-
       сок шестнадцатиричных  инструкций,  пока вы не дойдете до строки,
       указывающей подпрограмму вашей  программы  (имя  подпрограммы  вы
       увидите в коде ASCII).  Эта строка находится в так называемом яд-


       ре Windows.
            Как можно видеть в окне Stack,  подпрограммой, которую нужно
       рассмотреть,  в  самом  деле является подпрограмма WMLButtonDown.
       Чтобы перейти к данной подпрограмме в окне Module,  сначала щелк-
       ните в  этом  окне кнопкой "мыши".  Затем нажмите клавиши Ctrl-S,
       наберите WMLButtonDowm и нажмите  для  поиска  этой  подпрограммы
       клавишу Enter.  Если вы увидите сообщение "Search expression  not
       found" ("Искомое выражение не найдено"), перейдите к началу файла
       и клавиши Ctrl-N,  чтобы снова выполнить поиск (в TDW  вы  можете
       выполнять  поиск  только от текущей позиции курсора до конца фай-
       ла).  Возможно, перед тем как вы найдете функцию, вам потребуется
       несколько раз нажать Ctrl-N.

       TDeb 3.0 #3-3                = 70 =
                        Отладка функции WMLButtonDown
       -----------------------------------------------------------------
            Функция WMLButtonDown  воспринимает в качестве параметра пе-
       ременную типа RTMessage и выделяет  из  этого  сообщения  позицию
       "мыши". Затем  она вызывает функции Windows MoveTo и SelectObject
       для позиционирования пера в окне и  выбора  текущего  инструмента
       рисования.
            Так как  вы  видите  имя этой подпрограммы в окне Stack,  то
       приводящим к сбою обращением в Windows должен быть вызов одной из
       этих подпрограмм Windows.  Чтобы увидеть, какой это вызов, вы мо-
       жете выполнить программу до начала этой функции и выполнить ее по
       шагам, чтобы увидеть,  какой вызов вызывает невосстановимую ошиб-
       ку.
            При расположении курсора на строке WMLButtonDown  перезагру-
       зите программу TDODEMOB,  нажав клавиши  Ctrl-F2,  затем  нажмите
       клавишу  F4,  чтобы выполнить программу до этой точки. Команда вы
       увидите окно ColorScribble,  нажмите левую кнопку  "мыши",  чтобы


       программа  вернулась в TDW.  (Чтобы получить от Windows сообщения
       по событию от "мыши",  возможно придется нажать клавишу несколько
       раз.) На этот раз невосстановимой ошибки не возникает (по крайней
       мере пока),  поскольку поскольку все,  что пока выполнялось,  это
       вызов Windows  функции WMLButtonUp программы  TDODEMOB.  Отладчик
       TDW возвращает вас к первой строке этой функции.
            Начните нажимать  клавишу F7 для пошагового выполнения прог-
       раммы. Когда вы нажмете F7 на вызове MoveTo,  то увидите окно со-
       общений, в котором выводится "Exeption 13".  Вероятно, проблема в
       вызове MoveTo.
                               Отладка MoveTo
       -----------------------------------------------------------------
            Функция MoveTo работает с пером и текущими координатами кур-
       сора x и y. Координаты извлекаются из сообщения Msg, которое при-
       ходит от Windows. Если программа не извлекает неверную часть это-
       го сообщения (а это не так),  то с этими параметрами должно  быть
       все в порядке.
            Местом ошибки должен быть HandleDC - контекст описателя уст-
       ройства пера.
            В этой точке,  поскольку вы имеете две невосстановимых ошиб-
       ки, наиболее надежным способом будет выход в TDW и закрытие перед
       дальнейшей работой Windows.
                             Исправление ошибки
       -----------------------------------------------------------------
            Если причиной  невосстановимой ошибки является HandleDC,  то
       либо описатель (контекста устройства) установлен неверно, либо не

       TDeb 3.0 #3-3                = 71 =
       устанавливался вовсе.  На самом деле он не устанавливался.  Прог-
       рамма  должна инициализировать контекст дисплея с помощью следую-
       щего вызова Windows:
            HandleDC = GetDC(HWindow);
            В  приведенном   ниже   исходном    коде    показан    метод


       WMLButtonDown с добавленным оператором инициализации контекста.
            void ScribbleWindow::WMLButtonDown(RTMessage Msg)
            {
               if ( !ButtonDown )
               {
               ButtonDown = True;     // отметить кнопку "мыши",
                                      // так что при перемещении "мыши"
                                      // с нажатой кнопкой будет
                                      // рисоваться линия
               HandleDC = GetDC(HWindow); // создать контекст вывода
                                         для рисования при нажатой
                                         кнопке "мыши" }
              MoveTo(HandleDC, Msg.LP.Lo, Msg.LP.Hi);
                                      // переместить точку рисования
                                      // в точку нажатия кнопки "мыши"
              SelectObject(HandleDC, ThePen);
                                      // выбрать перо для контекста
                                      // устройства
             }
            }

       TDeb 3.0 #3-3                = 72 =
                            Проверка исправлений
       -----------------------------------------------------------------
            В Borland C++ добавьте в ScribbleWindow::WMLButtonUp  опера-
       тор инициализации контекста. Далее скомпилируйте проект с включе-
       нием отладочной информации (выбрав  команду  (Compile¦Build  All)
       (Компилятор¦Полное построение)).
            Поскольку в нашем случае имеются другие ошибки, снова загру-
       зите в TDW программу, затем при выводе окна Module нажмите клави-
       шу F9.
             Теперь, если  вы  рисуете с помощью пера,  то линия рисуется
       назначенным по умолчанию цветом - черным.Попробуйте рисовать раз-
       личными цветами,  выбирая из меню цвет пера.  Красный,  зеленый и
       голубой будут работать прекрасно,  но когда вы попытаетесь  изме-
       нить цвет обратно на черный,  то цвет пера не изменится.  Похоже,


       вы нашли другую ошибку.
                     Поиск ошибки назначения цвета пера
       -----------------------------------------------------------------
            Наиболее вероятным  местом   этой  ошибки  является  функция
       SCribbleWindow, который создает цвет пера SelectBlackPen. Выйдите
       из ColorScribble,  затем  для  сброса  программы  нажмите клавиши
       CtrlF2.  Установите точку останова на открывающей фигурной скобке
       функции CScribbleWindow::SelecrBlackPen. Затем запустите програм-
       му и выберите команду Pen¦Black.  (Чтобы  получить  сообщение  от
       Windows, возможно  придется  нажать клавишу.) Отладчик TDW должен
       остановить выполнение на точке останова.  Поскольку этого не про-
       исходит, здесь что-то неверно.
            Вероятно, функция SelectBlackPen никогда не вызывается. Пос-
       кольку данная подпрограмма работает на основе динамически диспет-
       черизуемой виртуальной таблице, возможно что-то не так с ее иден-
       тификатором.
                 Установка точки останова по сообщению окна
       -----------------------------------------------------------------
            Когда пользователь  выбирает элемент меню,  Windows посылает
       сообщение WM_COMAND тому окну,  которому данное меню принадлежит.
       Параметр сообщения wParam содержит идентификатор выбираемого эле-
       мента  меню.  Когда   окно   ObjectWindows   получает   сообщение
       WM_COMMAND, оно просматривает индексы диспетчеризации объекта ок-
       на в поиске значения CM_FIRST + wParam.  SelectBlackPen имеет ин-
       декс CM_FIRST + CM_BLACK, где CM_BLACK имеет значение 104.
            Чтобы определить,  каким является параметр wParam командного
       сообщения Pen¦Black,  вам нужно сообщить TDW, что он должен оста-
       навливать выполнение при получении сообщения WM_COMMAND. Тогда вы
       можете запустить программу,  сделать выбор в меню и проверить па-
       раметр wParam,  чтобы посмотреть, не совпадает ли он с константой



       TDeb 3.0 #3-3                = 73 =
       CM_BLACK.
            Перед тем, как установить точку останова, вам нужно вернуть-
       ся  обратно   в   TDW.   Закройте   окно   прикладной   программы
       ColorScribble, затем, когда вы вернетесь в окно Module, для пере-
       загрузки программы  TDODEMOB  используйте клавиши Ctrl-F2.  Когда
       выведется окно Module, следующим шагом будет установка точки ост-
       анова по сообщению окна с помощью одного из двух методов, в зави-
       симости  от   того,    разрешена    или    запрещена    поддержка
       ObjectWondows.
            По умолчанию    специальная    поддержка    сообщений   окон
       ObjectWondows отсутствует.  Вы не можете использовать описанный в
       вашей программе объект окна для установки точки останова по сооб-
       щению.  Вместо этого нужно использовать описатель окна.  Если  вы
       хотите использовать оконный объект (что легче, но может замедлить
       отладку при наличии точки останова по сообщению), то нужно запус-
       тить утилиту TDINST с параметром командной строки -w, выбрать ко-
       манду Options¦Source Debugging (Параметры¦Отладка исходного кода)
       и проверить параметр OWL Message Window.
                 Примечание: Информация о TDINST содержится в Приложении
            D.

       TDeb 3.0 #3-3                = 74 =
            Задание точки останова по сообщению окна по описателю
       -----------------------------------------------------------------
            Если поддержка  ObjectWindows у вас не разрешена,  вы должны
       установить точку прерывания по сообщению окна с помощью  описате-
       ля. Поскольку    большинство   установок   окон   выполняются   в
       ObjectWindow, для получения указателя придется пойти окольным пу-
       тем.
            Начальные установки      окна      выполняются      функцией
       InitMainWindow, но описатель устанавливается позднее.  Чтобы  уп-
       равление снова вернулось в TWD,  вы можете установить точку оста-


       нова на  одной   из   функций   работы   с   "мышью"   (например,
       WMLButtonDown), запустить  программу,  затем использовать "мышь",
       чтобы программу остановилась на точке останова. (Если точка оста-
       нова находится  на  WMLButtonDown,  вы можете нажать левую кнопку
       "мыши".)
            Другой метод   заключается   в    переопределении    функции
       ObjectWindows SetupWindow, которая инициализирует описатель, бла-
       годаря чему вы можете получить управление после каждой  инициали-
       зации указателя.  Данная функция переопределяется в TDODEMOB, как
       виртуальная функция. Она определяется следующим образом:
            void ScribbleWindow::SetupWindow():
            {
                   TWindow::SetupWindow();
            }
            Чтобы воспользоваться  этим, позиционируйте курсор на закры-
       вающей скобке функции SetupWindow,  затем нажмите клавишу F4  для
       выполнения программы до этой точки.
            Независимо от используемого метода, когда TDW вновь получает
       управление, для установки точек останова по  сообщению WM_COMMAND
       сделайте следующее:
            1. Выберите команду Data¦Inspect (Данные¦Проверка) и  прове-
               рьте объект окна MainWindow. Поскольку он в данный момент
               находится вне  области  действия,  вам нужно использовать
               следующий синтаксис переопределения:
                  WinMain#MyAppMainWindow
               Так как MyApp имеет тип  SCribbleWindow  (порожденный  от
               класса  TApplication,  элементом данных которого является
               MainWindow), MainWindow является элементом MyApp.
            2. Увеличьте окно Inspector, благодаря чему в верхней облас-
               ти  вы можете видеть элементы данных.  HWindow - это эле-
               менты данных, который содержит описатель окна.
            3. Позиционируйте курсор на HWindow,  затем нажмите  клавиши



       TDeb 3.0 #3-3                = 75 =
               Shift-F3 и скопируйте его в окно Clipboard.
            4. Выберите  команду  View¦Windows Message  (Обзор¦Сообщения
               Windows) для вывода диалогового окна Windows Massage (Со-
               общения Windows).
            5. Для  вывода  диалогового  окна Add (Добавление) в верхней
               левой области нажмите клавиши Ctrl-A.  Выберите  "кнопку"
               Handle (Описатель),  затем позиционируйте курсор на текс-
               товом поле ввода.
            6. Нажмите для вывода окна Clipboard клавиши Shift-F4. Пози-
               ционируйте курсор на HWindow,  выберите "кнопку" Contents
               (для копирования HWindow - значения описателя), затем вы-
               берите "кнопку"  OK для копирования описателя в текстовое
               поле ввода.
            7. В текстовом поле ввода добавьте перед значением описателя
               Ox, чтобы указать, что это шестнадцатиричное число, затем
               нажмите Enter.
            8. Перейдите в правую верхнюю область и наберите WM_COMMAND.
               Вы увидите, что как только вы начнете набор символов, вы-
               выдается диалоговое окно  Set Message  Filter  (Установка
               фильтра сообщения).
           9. Установить  параметр Action (Действие) для данного сообще-
              ния в значение Break  (Прерывание),  затем  для  установки
              точки  прерывания  по  данному  сообщению  нажмите клавишу
              Enter.
            Программа будет возвращать управление в TDW всякий раз, ког-
       да вы делаете выбор меню, поскольку при этом генерируется команда
       WM_COMMAND.

       TDeb 3.0 #3-3                = 76 =
           Установка точки прерывания по сообщению на объекте окна
       -----------------------------------------------------------------
            Если вы  используете для разрешения поддержки точки прерыва-


       ния по сообщению окна в ObjectWindows программу TDINST, то можете
       использовать для  установки  точки  останова по сообщению оконный
       объект MainWindow.
            1. Переместите курсор на закрывающую фигурную скобку функции
               InitMainWindow  и нажмите клавишу F4 для выполнения прог-
               раммы до этой точки.
            2. Когда вы снова увидите окно Module, для вывода диалогово-
               го окна   OWL   Windows   Messages   используйте  команду
               View¦Windows Messagges (Обзор¦Сообщения Windows).
            3. В левой верхней области  наберите  MainWindow  и  нажмите
               клавишу F4.
            4. В  верхней  правой области наберите WM_COMMAND,  выберите
               "кнопку" Break,  затем нажмите клавишу Enter, чтобы уста-
               новить точку останова по данному сообщению.
            Теперь программа  будет  возвращать  управление в TDW каждый
       раз когда вы делаете выбор меню,  поскольку при этом генерируется
       сообщение WM_COMMAND.
                               Проверка wParam
       -----------------------------------------------------------------
            Вы можете возобновить выполнение  программы,  нажав  клавишу
       F9.
            Выберите в  меню команду Pen¦Black (Черный цвет пера). После
       того, как вы выберите черное перо, TDW останавливает выполнение и
       выводит  на  экран окно CPU,  показывая,  что в момент прерывания
       программа выполняла код ядра Windows.  Закройте окно  CPU,  нажав
       клавиши Alt-F3.
            Если это  необходимо,  снова  выведите окно Windows Messages
       (Сообщения Windows). Увеличьте окно до полного размера, благодаря
       чему вы сможете видеть в нижней области все сообщение.  Вы можете
       видеть, что окно получает сообщение  WM_COMMAND  со  значением  в
       wParam   204  (шестнадцатиричное  значение  00CC).  Но  константа
       CM_BLACK имеет значение 104,  а не 204.


Это является причиной то-
       го, что  не вызывалась виртуальная функция - прикладная программа
       искала идентификатор CM_FIRST + 204,  а его действительным значе-
       нием было CM_FIRST + 104.
            Значение 204  было  задано  в  определении файла TDODEMO.RC.
       Данной ошибки можно было бы избежать,  используя для меню тот  же
       идентификатор, что  и  в  файле  заголовка,  и  поместив оператор
       #INCLUDE для этого файла заголовка в  начало  файла  .RC.  Вместо

       TDeb 3.0 #3-3                = 77 =
       этого значения были использованы в определении меню. При этом от-
       ветственность за перекрестную проверку  значений  возлагается  на
       программиста.
            Если вы  отредактируете TDODEMOB.H измените CM_BLACK на 204,
       то выбор черного пера будет работать корректно. Когда вы сделаете
       это  изменение,  описание констант в начале программы должно быть
       следующим:
               #define        PenWidth        1
               #define        MenuID          100
               #define        IconID          100
               #define        CM_RED          101
               #define        CM_GREEN        102
               #define        CM_BLUE         103
               #define        CM_CLACK        204

       TDeb 3.0 #3-3                = 78 =
                            Проверка исправления
       -----------------------------------------------------------------
            Запустите ColorScribble  и  выйдите оттуда,  затем выйдите в
       TDW.  Когда вы вернетесь в Borland C++,  загрузите файл заголовка
       TDODEMOB.H,  измените определение константы CM_BLACK, затем пере-
       компилируйте программу (проект) и запустите ее по TDW.
            Теперь когда вы рисуете в окне,  то можете  заметить  другую
       проблему.  Если при рисовании вы смещаете "мышь" за пределы окна,
       то при возврате в окно в другом месте вы увидите,  что  программа


       рисует линию,  соединяющую то место,  где вы вышли из окна, с тем
       местом, где вы в него вернулись.
            Все, что здесь должна делать программа - это прекращение ри-
       сования при выходе из окна и возобновление рисование при возврате
       в него. Итак, вы обнаружили еще одну ошибку.
                  Поиск ошибки рисования за пределом экрана
       -----------------------------------------------------------------
            Поиск этой ошибки неплохо начать с сообщение Windows,  кото-
       рые получает данное окно.  Выйдите из программы  ColorScribble  и
       загрузите в TDW (в окне Module) программу TDODEMOB.CPP.

       TDeb 3.0 #3-3                = 79 =
                        Регистрация сообщений Windows
       -----------------------------------------------------------------
            В зависимости от того, запрещена или разрешена поддержка со-
       общений ObjectWindows, для инициализации окна используйте один из
       двух описанных выше методов. Затем укажите в верхней левой облас-
       ти окна  Windows  Messages  (Сообщений Windows),  для какого окна
       нужно отслеживать сообщения (используя  объект  окна  или  описа-
       тель).
            Далее переместите курсор в правую верхнюю область и добавьте
       в качестве точки останова по сообщению WM_LBUTTONUP. Это позволит
       TDW вновь получить управление, когда вы закончите рисовать.
            Желательно также просматривать все поступающие сообщения, но
       установка WM_LBUTTONUP стирает установку Log  All  Messages  (Ре-
       гистрация всех сообщений).  Чтобы восстановить установки, нажмите
       для вывода диалогового окна Set Message Filter (Установка фильтра
       сообщения) клавиши Ctrl-A.
                             Обнаружение ошибки
       -----------------------------------------------------------------
            Возобновите выполнение программы TDODEMOB, нажав клавишу F9.
       Начните рисовать,  затем выведите "мышь" за пределы области поль-


       зователя и вернитесь в нее в другом месте.  Чтобы уменьшить число
       сообщений,  просто  переместитесь  вовне и снова вернитесь назад,
       затем освободите левую кнопку "мыши",  чтобы управление вернулось
       в TDW.
            Перед тем, как взглянуть на окно Windows Messages (Сообщения
       Windows),  увеличьте его до полного размера (клавишей F5), благо-
       даря чему вы сможете видеть больше сообщений. Когда вы посмотрите
       на нижнюю область окна Windows Messages, то увидите множество со-
       общений WM_NCHITEST и WM_SETCURSOR, среди которых будет сообщение
       WM_LBUTTONDOWN, WM_MOUSEMOVE, после них будет несколько сообщений
       WM_NCMOUSEMOVE, далее еще сообщения WM_MOUSEMOVE и, наконец, зак-
       лючительное сообщение WM_LBUTTONUP.
            Похоже, что когда курсор не находится в области  пользовате-
       ля,  то  сообщения WM_MOUSEMOVE не поступают,  а поступают только
       сообщения WM_NCMOUSEMOVE.
            Теперь яcно, что представляет собой ошибка. Программа рисует
       от  точки последнего сообщения WM_MOUSEMOVE до точки текущего со-
       общения WM_MOUSEMOVE. Когда "мышь" выходит из области пользовате-
       ля,  программа не получает сообщений WM_MOUSEMOVE. Таким образом,
       когда "мышь" возвращается в область пользователя,  последней точ-
       кой будет та точка,  где она покинула экран, и программа ошибочно
       рисует линию от точки выхода за пределы экрана до  текущей точки.
                             Исправление ошибки
       -----------------------------------------------------------------

       TDeb 3.0 #3-3                = 80 =
            Одним из  возможных  решений  могло бы быть определение того
       места, где "мышь" выходит за область пользователя, благодаря чему
       программа  сможет  игнорировать  последнюю позицию "мыши" и снова
       начать рисование,  когда "мышь" возвращается в область  пользова-


       теля.  Но  это потребовало бы сложной логики определения позиции,
       где "мышь" покидает пределы экрана и где она возвращается  в  об-
       ласть пользователя. К счастью, есть более простой способ.
            Функция Windows SetCapture делает как раз то, что требуется.
       Данная функция указывает Windows,  что до  вызова  ReleaseCapture
       нужно посылать все сообщения Windows, связанные с "мышью", в ука-
       занное окно,  что приводит к  получению  окном  вместо  сообщений
       WM_NCMOUSEBUTTON    ("вне    области   пользователя")   сообщений
       WM_MOUSEMOVE.
            Если вы  поместите  в   ScribbleWindow::WMButtonDown   вызов
       SetCapture,  а в WMLButtonUp - ReleaseCapture,  WMMouseMove будет
       на самом деле рисовать вне окна,  но Windows будет отсекать  этот
       вывод программы, что будет давать нужный результат.
            Эти изменения отражены в следующем исходном коде:
            void ScribbleWindow::WMLButtonDown(RTMessage Msg);
            {
               if ( ButtonDown )
               {
                 ButtonDown = True;     // пометить кнопку "мыши"
                                        // как нажатую, благодаря чему
                                        // при перемещении "мыши" будет
                                        // рисоваться линия
                 SetCapture(HWindow);   // сообщить Windows, что в окно
                                        // нужно посылать все сообщения
                                        // от "мыши"; отменять этот
                                        // перехват будет вызов
                                        // WMLButtonUp

       TDeb 3.0 #3-3                = 81 =
                 HandleDC = GetDC(HWindow); // создать контекст
                                            // изображения для вывода
                 MoveTo(HandleDC, Msg.LP.LO,     // переместить точку


                        Msg.LP.Hi);              // рисования в ту
                                            // точку, где была нажата
                                            // кнопка "мыши"
              }
            }
            void Scribblewindow::WMLButtonUp(RTMessage)
            {
              if  ( Buttondown )
              {
                ReleaseCapture();
                ReleaseDC(HWindow,handleDC);
                ButtonDown = False;
              }
            }

       TDeb 3.0 #3-3                = 82 =
                            Проверка исправлений
       -----------------------------------------------------------------
            Запустите программу ColorScribble и выйдите  из  нее,  затем
       выйдите в TDW.  Когда вы вернетесь в Borland C++, внесите измене-
       ния в две подпрограммы, затем перекомпилируйте программу и запус-
       тите ее. Теперь,когда вы рисуете в окне, все будет работать прек-
       расно,  но когда вы попытаетесь стереть экран,  используя  правую
       кнопку "мыши", то ничего не произойдет. Вы нашли еще одну ошибку.
                        Поиск ошибки стирания экрана
       -----------------------------------------------------------------
            Поскольку нажатие  правой   кнопки   "мыши"   обрабатывается
       WMRButtonDown, то  возможно  ошибка как то связана с данной подп-
       рограммой. Либо WMRButtonDown не вызывается, либо в ней ошибка.
            Выйдите из  ColorScrible  и  загрузите   в   TDW   программу
       TDODEMOB. Чтобы выполнить ее до подпрограммы WMRButtonDown, в ко-
       торой возможно содержится ошибка,  нажмите клавиши Alt-F9 и набе-
       рите WMRButtonDown.  Порисуйте немного в окне, затем нажмите пра-
       вую  кнопку  "мыши".  TDW  останавливает   программу   в   начале
       функции WMRButtonDown, откуда видно, что она вызывается..
            Используя клавишу F7, войдите в WRMButtonDown и остановитесь


       на вызове UpdateWindow. Единственным параметром является HWindow.
       Вы можете предположить,  что параметр HWindow установлен правиль-
       но, поскольку другие методы успешно используются. Поскольку ниче-
       го  очевидно неверного здесь нет,  вы можете проверить следующее:
       принимается ли действительно окном  сообщение  WM_PAINT,  которое
       должно посылаться в окно при вызове UpdateWindow?
            Теперь вы наверное знаете,  как установить точку останова по
       сообщению WM_PAINT. Если нет, то прочтите выше описание установки
       точки останова по сообщению WM_COMMAND.
            Установив точку останова по сообщению, для выполнения выпол-
       нения вызова UpodateWindow нажмите  F7.  Поскольку  программа  не
       прерывается и не возвращает управления, сообщение WM_PAINT в окно
       не посылается.
            Вы можете проверить,  что сообщения WM_PAINT не принимались,
       путем нажатия   правой   кнопки   "мыши",   возврата   в  TDW  из
       WMRButtonUp,  и последующей проверки нижней  области  диалогового
       окна View ¦Windows Messages (Обзор¦Сообщения Windows).  Здесь нет
       сообщений WM_PAINT.  По каким-то причинам вызов  UpdateWindow  не
       работает так, как ожидается.

       TDeb 3.0 #3-3                = 83 =
                            Анализ причины ошибки
       -----------------------------------------------------------------
            Эта ошибка требует некоторого понимания  того,  как  Windows
       работает с функцией UpdateWindow. Когда программа вызывает данную
       функцию, Windows проверяет, является ли какая-либо часть окна не-
       допустимой, и требуется ли отображать ее заново. Если это так, то
       Windows посылает окну сообщение WM_PAINT. Если же нет, но незачем
       попусту  тратить системные ресурсы на ненужное сообщение, поэтому
       Windows ничего не делает.  Но откуда Windows знает, что окно тре-
       буется обновить?
            Прикладная программа уведомляет Windows, что по крайней мере


       часть окна  недопустима,  с  помощью  вызова  InvalidateRect  или
       InvalidateRgn.  Эти  две  функции помещают в окно обновленную об-
       ласть и уведомляют Windows,  что окно следует обновить с  помощью
       сообщения   WM_PAINT.   Однако,   Windows  присваивает  сообщению
       WM_PAINT,  которое оно посылает в ответ на  эти  вызовы  функций,
       низкий приоритет, поэтому, если вы хотите, чтобы окно обновлялось
       немедленно, следует воздерживаться от вызова UpdateWindow.
                             Исправление ошибки
       -----------------------------------------------------------------
            Добавление в  WMRButtonDown  вызова  InvalidateRect устранит
       проблему.  Функция  InvalidateRect  воспринимает  три  параметра:
       идентифицирующий окно описатель окна,  указатель на прямоугольную
       область,  отмечающий требующий обновления прямоугольник,  и пара-
       метр типа Boolean, который определяет, следует ли стирать прямоу-
       гольную область.  В качестве параметра,  задающего  указатель  на
       прямоугольную  область,  вы можете передать значение nil,  указав
       Windows,  что к обновляемому прямоугольнику следует добавить  все
       окно.   В   следующем   исходном   коде  показано,  как  выглядит
       WMRButtonDown с несколькими добавленными вызовами функций:
            void ScribbleWindow::WMRButtonDown(RTMessages);
            {
               InvalidateRect(HWindow, NULL, TRUE);
               UpdateWindow(HWindow);
            }
                            Проверка исправления
       -----------------------------------------------------------------
            Запустите программу  ColorScribble  и выйдите из нее,  затем
       выйдите в TDW.  Когда вы вернетесь в Borland C++, внесите измене-
       ния в WMRButtonDown, затем перекомпилируйте программу и запустите

       TDeb 3.0 #3-3                = 84 =
       Глава 20. Отладка резидентных программ и драйверов устройств


       -----------------------------------------------------------------
            С помощью Турбо отладчика вы  можете  отлаживать  не  только
       обычные выполняемые файлы, но также резидентные в памяти програм-
       мы (TSR) и драйверы устройств. Вы можете кроме того выполнять сам
       отладчик, как резидентную программу (в то время, как работаете на
       уровне DOS или запускаете другие программы).
            В Турбо отладчике в меню File (Файл) имеется три  новых  ко-
       манды,  которые  предназначены специально для отладки резидентных
       программ  и  драйверов  устройств.  Это   команды   File¦Resident
       (Файл¦Резидент),  File¦Symbol Load (Файл¦Загрузка таблицы иденти-
       фикаторов) и File¦Table Relocate (Файл¦Перемещение таблицы  иден-
       тификаторов).
            В данной  главе вы найдете краткое описание того,  что такое
       резидентная программа и драйверы  устройств, и  дается  пояснение
       того, как отлаживать их с помощью Турбо отладчика.
                      Что такое резидентная программа?
       -----------------------------------------------------------------
            Резидентными (TSR) называют такие программы,которые остаются
       в оперативной памяти после того,  как  они  завершат  управление.
       Например, SideKick  и  SuperKey - это резидентные программы,  они
       все время находятся в памяти и вызываются с  помощью  специальных
       оперативных клавиш.  Другие  резидентные  программы вызываются из
       программ, которые выполняют соответствующее программное  прерыва-
       ние. В Borland Си  и  С++,  например,  предусмотрена  специальная
       функция  geninterrupt,  которая выдает такое программное прерыва-
       ние.
            Резидентная программа состоит из двух частей - рабочей части
       и резидентной части. Рабочая часть выполняет загрузку резидентной
       части в память и устанавливает вектор прерываний, который опреде-
       ляет характер  вызова резидентной в памяти программы.  Если рези-


       дентная программа должна вызываться с помощью программного преры-
       вания, то рабочая часть программы помещает адрес резидентной час-
       ти кода в соответствующий  вектор  прерывания.  Если  резидентная
       программа должна вызываться с помощью оперативной клавиши, то ре-
       зидентная часть должна модифицировать обработчик  прерывания  DOS
       для обработки нажатия соответствующих клавиш (клавиши) на клавиа-
       туре.
            Когда рабочая часть завершает выполнение, она вызывает функ-
       цию DOS,  которая позволяет части файла .EXE оставаться резидент-
       ной в  оперативной  памяти  после завершения выполнения программы
       (то есть программа завершила выполнения и  осталась  резидентной,
       отсюда и  название  таких  программ  TSR  -  terminate  and  stay
       resident). Рабочая часть резидентной программы знает размер рези-
       дентной части, а также ее адрес в памяти, и передает эту информа-
       цию DOS.  Операционная системе DOS при этом резервирует специаль-

       TDeb 3.0 #3-3                = 85 =
       ный блок памяти,  но может свободно записывать информацию в неза-
       щищенную часть памяти.  Таким образом, резидентная часть остается
       в памяти, а рабочая часть может быть "затерта".
            Тонкость отладки резидентных программ состоит в том,  что вы
       должны иметь возможность  отлаживать  и  резидентную,  и  рабочую
       часть программы.  Когда выполняется  файл  .EXE,  то  выполняется
       только код рабочей части TSR. Поэтому, когда вы как обычно запус-
       каете Турбо отладчик, задав имя файла, вы видите выполнение толь-
       ко рабочей части кода программы:  то,  как он устанавливает рези-
       дентную  часть  и обработчики прерываний.  Чтобы отлаживать рези-
       дентную  часть,  вы  должны  задать  точку  останова  и   сделать
       резидентным  сам  Турбо отладчик.  Подробнее мы расскажем об этом
       дальше.
                   Отладка резидентной в памяти программы


       -----------------------------------------------------------------
            Отладка рабочей части резидентной программы эквивалентна от-
       ладке любого другого файла.  Новое появляется только тогда, когда
       вы начинаете отлаживать резидентную часть.
                 Примечание: С помощью TD вы можете  отлаживать  драйвер
            клавиатуры.
            Давайте рассмотрим процесс отладки резидентной программы:
            1. При компиляции или ассемблировании  резидентной программы
               обеспечьте  наличие в ней отладочной информации (информа-
               ции об идентификаторах).  Используйте для  этого  команды
               типа TASM /ZI или BCC -v, либо TPC /V.
            2. Если  вы выполняете компоновку резидентной программы, для
               обеспечения включения  информации для отладки используйте
               параметр компоновщика /v. Для того, чтобы поместить отла-
               дочную  информацию  в отдельный файл,  можно использовать
               утилиту TDSTRIP с параметром -s (однако,  этого не требу-
               ется  делать,  если  программа  представляет  собой  файл
               .EXE).
               Примечание: Программа TDSTRIP описывается  в поставляемом
               на  диске  файле  документации.  Имя и расположения этого
               файла указано в файле README.
            3. Теперь загрузите резидентную программу с Турбо отладчиком
               и установите точку останова в  начале  резидентной  части
               кода (с помощью клавиши F2). Вместо этого вы можете уста-
               новить точки останова (если хотите) в других местах рези-
               дентной части.
            4. После этого можно загрузить резидентную программу с Турбо
               отладчиком и выполнить ее рабочую часть с помощью команды
               Run¦Run (Выполнение¦Выполнение), как обычно. Дальше можно

       TDeb 3.0 #3-3                = 86 =
               обычным образом отлаживать рабочую часть.


Когда вы закон-
               чите выполнять рабочую часть, резидентная часть будет ус-
               тановлена в оперативной памяти.
            5. Выберите  команду  File¦Resident  (Файл¦Резидент),  чтобы
               сделать резидентным сам отладчик.  Это не  нарушит  рези-
               дентности вашей программы:  когда она будет выполняться в
               Турбо отладчике, она сама станет резидентной, как если бы
               вы запускали ее из командной строки. Единственная причина
               того,  что отладчик делается резидентным,  заключается  в
               том,  что  вы можете перейти обратно в DOS и вызвать вашу
               резидентную программу. При этом начнет выполняться ее ре-
               зидентная часть.
            6. Когда вы вернетесь снова к командной строке DOS, выполни-
               те резидентную часть вашей программы TSR, нажав соответс-
               твующую оперативную клавишу,  или  активизировав  ее  ка-
               ким-либо другим образом.  Выполняйте вашу программу,  как
               обычно.
            7. Когда в вашей программе встретится точка останова, иници-
               ализируется Турбо отладчик,  а код вашей программы  выве-
               дется  в  соответствующей точке.  Теперь вы можете начать
               отладку резидентной части программы.  (Кроме того, вы мо-
               жете повторно войти в отладчик из DOS,  дважды нажав кла-
               виши Ctrl-Break.)
            Второй метод отладки резидентной части программы  состоит  в
       выполнении резидентной части из командной строки DOS, и последую-
       щего использования Турбо отладчика для отладки области  оператив-
       ной памяти, содержащей TSR.
            При использовании  данного  метода  вам  понадобится утилита
       TDMEM,  которая выводит на экран схему использования  оперативной
       памяти, и TDDEV, которая дает адрес сегмента, где загружена рези-
       дентная часть вашей программы TSR.


            Чтобы использовать данный метод:
            1. Выполните шаг 1 и 2 первого метода для компиляции или ас-
               семблирования  кода  программы  и  для  выделения таблицы
               идентификаторов (если это необходимо) и  помещения  ее  в
               файл .TDS.  Если нужно, запустите также утилиту TDSTRIP с
               параметром -s для преобразования вашей резидентной  прог-
               раммы из формата .EXE в формат.COM.
            2. Запустите вашу резидентную программу в ответ на подсказку
               DOS, набрав ее имя. Например, если ваша резидентная прог-
               рамма называется TSR.EXE,  наберите TSR в ответ на  подс-
               казку DOS и нажмите клавишу Enter.
            3. Запустите утилиту TDMEM,  которая выводит схему использо-
               вания памяти. Запомните адрес сегмента, где загружена ре-

       TDeb 3.0 #3-3                = 87 =
               зидентная  часть  вашей программы (мы обозначим его,  как
               Seg).
            4. Далее нужно определить объем  таблицы  идентификаторов  в
               памяти,  которую  требуется  выделить Турбо отладчику при
               его вызове.  Для этого  запомните  размер  вашей  таблицы
               идентификаторов  (то есть размер файла .TDS),  воспользо-
               вавшись командой DOS DIR.
               Данный размер представляет собой минимальный объем опера-
               тивной  памяти,  которую нужно выделить при запуске Турбо
               отладчика,  поскольку,  кроме хранящейся там  информации,
               Турбо  отладчик  при загрузке таблицы идентификаторов сам
               создает несколько таблиц (рабочих и других).
               Обычно нужно выделять примерно в 1.5 раза  больше памяти,
               чем занимает на диске файл .TDS.  Турбо отладчик сообщает
               вам,  когда вы выделяете слишком мало памяти для  таблицы
               идентификаторов, выводя сообщение:  "Not enough memory to


               load symbol table" ("Для загрузки таблицы идентификаторов
               недостаточно памяти"). Обычно это происходит при выполне-
               нии команды File¦Symbol Load (Файл¦Загрузка таблицы иден-
               тификаторов).
            5. Загрузите Турбо отладчик,  не задавая имя файла и выделив
               память для таблицы идентификаторов  с  помощью  параметра
               командной  строки -sm.  В этом параметр указывается аргу-
               мент,  определяющий объем (в килобайтах) памяти,  которая
               будет  выделяться для таблицы идентификаторов.  Например,
               если вы хотите зарезервировать для таблицы  идентификато-
               ров 3К, введите в ответ на подсказку DOS команду:
                       TD -sm3
               Когда вы  загружаете  Турбо отладчик,  не задавайте имени
               файла, так как вы отлаживаете то, что уже находится в па-
               мяти.  В  используемом по умолчанию каталоге у вас должны
               присутствовать файл резидентной программы и файл  .TDS, к
               которым отладчик  может обращаться для получения информа-
               ции об идентификаторах.
            6. Теперь вы можете начать  отладку  резидентной  программы,
               задав точки останова, сделав Турбо отладчик резидентным и
               выполнив некоторые действия на уровне команд DOS, которые
               приведут  к  срабатыванию  точки останова.  Это переводит
               Турбо отладчик в соответствующее место  вашего  исходного
               кода.  Однако,  задача отладка может для вас упроститься,
               если вы сначала вызовите информацию  об  идентификаторах,
               которая  имеется  в  таблице идентификаторов,  и исходный
               файл.
            7. Когда появляется экран Турбо отладчика,  очистите индика-
               ционное сообщение,  нажав клавишу Esc,  и загрузите с по-

       TDeb 3.0 #3-3                = 88 =


               мощью команды  File¦Symbol  Load  (Файл¦Загрузка  таблицы
               идентификаторов) таблицу идентификаторов. Если вы получи-
               те сообщение,  в котором говорится, что для загрузки таб-
               лицы идентификаторов не хватает памяти,  выйдите из Турбо
               отладчика и запустите его снова из командной  строки  DOS
               задав  в  качестве аргумента параметра -sm большее значе-
               ние.
            8. Таблица идентификаторов содержит  набор  идентификаторов,
               связанный с ячейками памяти в вашем коде. В качестве пре-
               фикса идентификаторов в таблице  указывается #имя_файла#,
               где  "имя_файла"  -  это имя файла резидентной программы.
               Например, если ваша резидентная программа называется TSR.
               ASM  (исходный  файл) и содержит метку Intr,  то ячейку в
               памяти отмечает идентификатор #TSR#INTR.
               Идентификаторы в таблице идентификаторов представляют со-
               бой  смещения (один от другого) на корректное число байт,
               но абсолютный адрес первого идентификатора  не определен,
               так  как DOS может загрузить вашу резидентную программу в
               другое место памяти (а не по тому адресу, как она ассемб-
               лировалась).  По  этой причине вы должны использовать ко-
               манду,  чтобы явным образом найти первый идентификатор  в
               памяти.
            9. Используйте команду File¦Table Relocate (Файл¦Перемещение
               таблицы идентификаторов) для помещения первого  идентифи-
               катора из таблицы идентификаторов в соответствующую ячей-
               ку памяти. Таким образом, имеющаяся информация об иденти-
               фикаторах  будет соответствовать вашему коду (программе).
               Для этого в ответ на подсказку  Турбо  отладчика  задайте
               адрес  сегмента Seg вашей резидентной программы,  который


               определен с помощью утилиты TDMEM, плюс шестнадцатиричное
               значение 10 (для PSP размером 256 байт).
               Дизассемблированные из памяти  операторы синхронизированы
               с информацией из таблицы идентификаторов. В  случае нали-
               чия исходного файла исходные операторы выводятся  на  той
               же строке, что и информация из таблицы идентификаторов.
           10. Для перехода к сегменту оперативной памяти, где находится
               ваша  резидентная  программа,  используйте  команду  Goto
               (клавиши Ctrl-G). Это можно сделать, используя адрес сег-
               мента вашей программы TSR,  за которым  следует  смещение
               0000H,  или  с помощью перехода на конкретную метку вашей
               программы.
            После этого дальнейшие действия будут  эквивалентны  первому
       методу, начиная с пункта 4.
                        Что такое драйвер устройства?
       -----------------------------------------------------------------
            Драйвер устройства -  это  набор  подпрограмм,  используемых

       TDeb 3.0 #3-3                = 89 =
       операционной системой DOS для управления на нижнем уровне функци-
       ями ввода-вывода.  Устанавливаемые драйверы устройств (в  отличие
       от драйверов, встроенных в DOS) устанавливаются с помощью включе-
       ния соответствующих строк, например:
               device = clock.sys
       в файл CONFIG.SYS.  Когда DOS выполняет операцию ввода-вывода для
       отдельного символа, она просматривает связанный список заголовков
       устройств, выполняя поиск устройства с соответствующим логическим
       именем (например,COM1). В случае драйверов блочно-ориентированных
       устройств, таких, как драйвер диска, DOS отслеживает, сколько ус-
       тановлено драйверов блочно-ориентированных устройств, и обознача-
       ет каждый из них буквой:  A - первый установленный  драйвер  уст-
       ройства, B  -  второй и т.д.  Когда вы,  например,  ссылаетесь на


       дисковод C, DOS знает, что нужно вызвать драйвер третьего блочно-
       ориентированного устройства.
            Связанный список  двух заголовков драйвера содержит смещение
       двух компонентов самого драйвера устройства: подпрограмму функции
       и подпрограмму обработки прерывания.
            Когда DOS  определяет,  что требуется вызвать данный драйвер
       устройства, она вызывает драйвер дважды.  При первом вызове драй-
       вера DOS общается с подпрограммой функции и передает ей указатель
       на буфер в памяти,  который называется заголовком  запроса.  Этот
       заголовок запроса содержит информацию о том, какие функции требу-
       ет  выполнить DOS от драйвера  устройства.  Подпрограмма  функции
       просто просто сохраняет данный указатель для последующего исполь-
       зования. При втором вызове драйвера устройства DOS вызывает подп-
       рограмму обработки  прерывания,  которая выполняет реальные функ-
       ции, заданные  DOS  в  заголовке  запроса,  например,   пересылку
       символов с диска.
            В заголовке запроса с помощью байта,  который называется ко-
       дом команды,  определяется, что должен делать драйвер устройства.
       Код команды определяет одну из предопределенных операций из набо-
       ра операций, которые должны выполнять все драйверы устройств. На-
       бор кодов команд (операций) для драйверов символьно-ориентирован-
       ных и блочно-ориентированных устройств различен.
            Проблема при отладке драйверов устройств состоит в  том, что
       файл .EXE  отсутствует,  так  как  для выполнения соответствующих
       функций драйвер должен быть загружен во время загрузки  системы с
       помощью  команды  DEVICE  = DRIVER.EXT,  где EXT - это расширение
       .SYS,  .COM или .BIN. Это означает, что отлаживаемый драйвер уст-
       ройства уже резидентен в памяти до начала отладки. Следовательно,
       функции по выполнению загрузки и перемещения таблицы  идентифика-


       торов весьма полезны, поскольку они могут восстановить информацию
       об идентификаторах для дизассемблированного сегмента памяти (ког-
       да драйвер загружен).  Как мы увидим далее, команда File¦Resident
       (Файл¦Резидент) также очень полезна.

       TDeb 3.0 #3-3                = 90 =
                         Отладка драйвера устройства
       -----------------------------------------------------------------
            Опишем теперь,  как  можно отладить драйвер устройства с по-
       мощью утилиты TDREMOTE:
            1. При компиляции или  ассемблировании  драйвера  устройства
               убедитесь, что  вы включаете в него отладочную информацию
               (информацию об идентификаторах).  Используйте  для  этого
               команды типа TASM /ZI или BCC -v, либо TPC /V.
            2. Чтобы  включить в него отладочную информацию, скомпонуйте
               драйвер устройства с параметром /v.
            3. Для перемещения отладочной информации  из  файла  .EXE  в
               файл .TDS и для преобразования файла .EXE в файл .COM ис-
               пользуйте утилиту TDSTRIP:
                      TDSTRIP -s -c имя_файла
               где "имя_файла" - имя отлаживаемого вами драйвера.
            4. Скопируйте файл .COM на удаленную систему.
            5. Измените файл CONFIG.SYS на удаленной системе,  включив в
               него строку:
                  device = имя_файла.COM
            6. Убедитесь, что в имени файла указан корректный маршрут.
            7. Перезагрузите систему для загрузки драйвера устройства.
            8. Запустите утилиту TDDEV,  которая сообщит вам об адреса в
               памяти на  удаленной  системе,  по которому DOS загрузила
               драйвер устройства.  Запомните этот адрес.  Сегмент, ука-
               занный в данном адресе, мы будем обозначать, как Seg.
            9. Далее  нужно  определить  объем таблицы идентификаторов в
               памяти,  которую требуется выделить Турбо  отладчику  при


               его  вызове.  Для  этого  запомните  размер вашей таблицы
               идентификаторов (то есть размер файла  .TDS),  воспользо-
               вавшись командой DOS DIR.
               Данный размер представляет собой минимальный объем опера-
               тивной  памяти,  которую нужно выделить при запуске Турбо
               отладчика, поскольку,  кроме  хранящейся  там информации,
               Турбо отладчик при загрузке таблицы  идентификаторов  сам
               создает несколько таблиц (рабочих и других). Обычно нужно
               выделять примерно в 1.5 раза больше памяти,  чем занимает
               на диске файл .TDS. Турбо отладчик сообщает вам, когда вы
               выделяете слишком мало памяти для  таблицы  идентификато-

       TDeb 3.0 #3-3                = 91 =
               ров, выводя сообщение:  "Not enough memory to load symbol
               table" ("Для загрузки таблицы идентификаторов недостаточ-
               но памяти"). Обычно это происходит при выполнении команды
               File¦Symbol Load (Файл¦Загрузка таблицы идентификаторов).
           10. Загрузите на удаленной системе утилиту TDREMOTE.
           11. Загрузите Турбо отладчик (используя в случае необходимос-
               ти параметры -r, -rp или -rs), не задавая имя файла и вы-
               делив память для таблицы идентификаторов с помощью  пара-
               метра  командной строки -sm.  В этом параметр указывается
               аргумент, определяющий объем (в килобайтах) памяти, кото-
               рая будет выделяться для таблицы идентификаторов.  Напри-
               мер, если вы хотите зарезервировать для таблицы идентифи-
               каторов 3К, введите в ответ на подсказку DOS команду:
                           TD -sm3
               Когда вы  загружаете  Турбо отладчик,  не задавайте имени
               файла, так как вы отлаживаете то, что уже находится в па-
               мяти.  В  используемом по умолчанию каталоге у вас должны


               присутствовать файла резидентной программы и файл .TDS, к
               которым отладчик  может обращаться для получения информа-
               ции об идентификаторах.
           12. Теперь вы можете начать отладку вашего драйвера  устройс-
               тва,  задав  точки останова,  сделав Турбо отладчик рези-
               дентным и выполнив некоторые действия  на  уровне  команд
               DOS,  которые приведут к срабатыванию точки останова. Это
               переводит Турбо отладчик в соответствующее  место  вашего
               исходного кода.  Однако, задача отладки может для вас уп-
               роститься, если вы сначала вызовите информацию об иденти-
               фикаторах,  которая имеется в таблице идентификаторов,  и
               исходный файл.
           13. Когда появляется экран Турбо отладчика,  очистите индика-
               ционное сообщение,  нажав клавишу Esc,  и загрузите с по-
               мощью команды  File¦Symbol  Load  (Файл¦Загрузка  таблицы
               идентификаторов) таблицу идентификаторов. Если вы получи-
               те сообщение,  в котором говорится, что для загрузки таб-
               лицы идентификаторов не хватает памяти,  выйдите из Турбо
               отладчика и запустите его снова из командной  строки  DOS
               задав  в  качестве аргумента параметра -sm большее значе-
               ние.
           14. Таблица  идентификаторов  содержит набор идентификаторов,
               связанный с ячейками памяти в вашем коде. В качестве пре-
               фикса  идентификаторов в таблице указывается #имя_файла#,
               где "имя_файла" - это имя  файла  резидентной  программы.
               Например,   если   ваш   драйвер   устройства  называется
               DRIVER.ASM (исходный файл)  и  содержит  метку  Intr,  то
               ячейку в памяти отмечает идентификатор #DRIVER#INTR.

       TDeb 3.0 #3-3                = 92 =
               Идентификаторы в таблице идентификаторов представляют со-


               бой смещения ( один от другого) на корректное  число байт,
               но  абсолютный адрес первого идентификатора не определен,
               так как DOS может загрузить ваш драйвер устройства в дру-
               гое место памяти (а не по тому адресу, как он ассемблиро-
               вался).  По этой причине вы должны использовать  команду,
               чтобы  явным образом найти первый идентификатор в памяти.
           15. Используйте команду File¦Table Relocate (Файл¦Перемещение
               таблицы идентификаторов) для помещения первого  идентифи-
               катора из таблицы идентификаторов в соответствующую ячей-
               ку памяти. Таким образом, имеющаяся информация об иденти-
               фикаторах  будет соответствовать вашему коду (программе).
               Для этого в ответ на подсказку  Турбо  отладчика  задайте
               адрес  сегмента Seg вашей резидентной программы,  который
               определен на шаге 6.
           16. Диcассемблированные из памяти  операторы синхронизированы
               с информацией из таблицы идентификаторов. В  случае нали-
               чия исходного файла исходные операторы выводятся  на  той
               же строке, что и информация из таблицы идентификаторов.
           17. Задайте в вашем исходной файле точку останова.
           18. Выберите  команду  File¦Resident  (Файл¦Резидент),  чтобы
               сделать резидентным сам отладчик. Это не имеет ничего об-
               щего и не нарушит резидентности вашего драйвера: когда он
               будет выполняться в Турбо отладчике,  он сам станет рези-
               дентным  при  загрузке удаленной системы в результате вы-
               полнения файла CONFIG.SYS. Единственная причина того, что
               отладчик делается резидентным,  заключается в том, что вы
               можете перейти обратно в DOS и вызвать ваш  драйвер  уст-
               ройства.
           19. Когда вы вернетесь снова к командной строке DOS  на  уда-


               ленной системе,  сделайте что-либо для активизации вашего
               драйвера устройства. Например, выведите информацию на со-
               ответствующее устройство.
           20. Когда в вашей программе-драйвере встретится точка остано-
               ва, инициализируется Турбо отладчик, а код вашей програм-
               мы  выведется  в соответствующей точке.  Теперь вы можете
               начать отладку вашей программы.  (Кроме того,  вы  можете
               повторно  войти  в отладчик из DOS,  дважды нажав клавиши
               Ctrl-Break.)
                          Завершение сеанса отладки
       -----------------------------------------------------------------
            Для завершения сеанса отладки выйдите обычным путем из Турбо
       отладчика, выбрав команду File¦Quit (Файл¦Выход или нажав клавиши
       Alt-X. Если вы отлаживаете резидентную программу, ее можно завер-
       шить следующим образом:

       TDeb 3.0 #3-3                = 93 =
            - Если вы  отлаживаете  резидентную  программу,  загруженную
              Турбо отладчиком, она будет разгружена автоматически.
            - Если вы отлаживаете программу, загруженную непосредственно
              из DOS,  запустите ее, пока Турбо отладчик не станет снова
              резидентным.  После того,  как Турбо отладчик станет рези-
              дентным, дважды нажмите клавиши Ctrl-Break для вывода Тур-
              бо отладчика, затем используйте клавиши Alt-X, чтобы выйти
              из Турбо отладчика, но оставить программу резидентной.
            Причиной выполнения всех этих шагов является то,  что  выход
       из Турбо отладчика во время отладки резидентной программы,  кото-
       рая не загружалась Турбо отладчиком, оставляет вашу систему в не-
       устойчивом состоянии.

       TDeb 3.0 #3-3                = 94 =
                    Приложение A. Параметры командной строки
       -----------------------------------------------------------------


            Когда вы запускаете Турбо отладчик с помощью командной стро-
       ки DOS,  его можно одновременно настроить,  используя  для  этого
       различные параметры. Общий формат командной строки имеет вид:
               TD [параметры] [имя_программы [аргументы_программы] ]
            Элементы, заключенные в квадратные скобки, являются необяза-
       тельными. Если за параметром указывается минус (-), то данный па-
       раметр запрещается (если он разрешен в файле конфигурации).
       ----------------------------------------------------------------¬
       ¦   Параметр                 Функция                            ¦
       +------------T--------------------------------------------------+
       ¦-cимя_файла ¦ Файл конфигурации, активизирующийся при загрузке.¦
       ¦            ¦                                                  ¦
       ¦-do         ¦ Другой дисплей.                                  ¦
       ¦            ¦                                                  ¦
       ¦-dp         ¦ Переключение страниц.                            ¦
       ¦            ¦                                                  ¦
       ¦-ds         ¦ Переключение на содержимое экрана пользователя.  ¦
       ¦            ¦                                                  ¦
       ¦-h          ¦ Вывод справочного экрана.                        ¦
       ¦            ¦                                                  ¦
       ¦-?          ¦ Вывод справочного экрана.                        ¦
       ¦            ¦                                                  ¦
       ¦-i          ¦ Обработка переключения идентификатора процесса.  ¦
       ¦            ¦                                                  ¦
       ¦-k          ¦ Разрешает запись нажатий клавиш.                 ¦
       ¦            ¦                                                  ¦
       ¦-l          ¦ Запуск кода инициализации Ассемблера.            ¦
       ¦            ¦                                                  ¦


       ¦-mN         ¦ Размер динамически распределяемой области памяти.¦
       ¦            ¦                                                  ¦
       ¦-p          ¦ Разрешает работать с "мышью".                    ¦
       ¦            ¦                                                  ¦
       ¦-r          ¦ Отладка на удаленных системах, COM1 (быстр.).    ¦
       ¦            ¦                                                  ¦
       ¦-rnлок;удал ¦ Разрешает сетевую отладку.                       ¦
       ¦            ¦                                                  ¦
       ¦-rpN        ¦ Порт COM для удаленной связи.                    ¦
       ¦            ¦                                                  ¦
       ¦-rsN        ¦ Скорость связи: 1 - медленная, 2 - средняя, 3 -  ¦
       ¦            ¦ быстрая.                                         ¦
       ¦            ¦                                                  ¦
       ¦-sdкаталог  ¦ Каталог исходного файла.                         ¦
       ¦            ¦                                                  ¦
       ¦-sc         ¦ Отмена проверки на строчные/прописные буквы.     ¦
       ¦            ¦                                                  ¦
       ¦-smN        ¦ Задает объем памяти для таблицы идентификаторов  ¦
       ¦            ¦ (в килобайтах).                                  ¦

       TDeb 3.0 #3-3                = 95 =
       ¦            ¦                                                  ¦
       ¦-vn         ¦ Запрещение режима 43/50 строк.                   ¦
       ¦            ¦                                                  ¦
       ¦-vg         ¦ Полное сохранение графики.                       ¦
       ¦            ¦                                                  ¦
       ¦-vp         ¦ Сохранение палитры EGA.                          ¦
       ¦            ¦                                                  ¦
       ¦-yN         ¦ Задает размер оверлейного буфера.                ¦


       ¦            ¦                                                  ¦
       ¦-yeN        ¦ Устанавливает оверлейную область EMS  в значение ¦
       ¦            ¦ N (N страниц по 16 килобайт).                    ¦
       L------------+---------------------------------------------------

       TDeb 3.0 #3-3                = 96 =
                     Приложение B. Технические замечания
       -----------------------------------------------------------------
            Данное приложение  предназначено  для опытных пользователей,
       которые хотят понять некоторые технические детали,  лежащие в ос-
       нове операций Турбо отладчика.  Не отчаивайтесь,  если изложенный
       здесь материал сначала покажется вам совершенно непонятным. Чтобы
       успешно пользоваться отладчиком, разбираться во всем этом не обя-
       зательно.
            Часть тем,  которые освещаются в данном приложении, позволят
       вам понять, каким образом отладчик взаимодействует с операционной
       системой DOS,  аппаратным обеспечением,  и вашей программой.  Это
       поможет вам определить,  как может  различаться  поведение  вашей
       программы во время отладки и во время выполнения.
            Вы узнаете также, как легко можно вызвать сбой системы и как
       можно этого избежать.
                Измененный адрес загрузки и свободная память
       -----------------------------------------------------------------
            Когда Турбо отладчик загружает вашу программу,  она размеща-
       ется в памяти после отладчика.  Из  этого вытекает два важных ре-
       зультата:  ваша  программа  загружается в сегмент с более старшим
       адресом,  и у нее будет меньше свободной памяти. Учитывая измене-
       ния объема свободной памяти, может оказаться трудно воспроизвести
       ошибки из-за ее распределения.
            Если вы используете компьютер, основанный на процессоре 386,
       то для устранения этих проблем можно использовать программу  вир-


       туальной отладки TD386 (об этом рассказывается в Главе 15).
                                Сбой системы
       -----------------------------------------------------------------
            Так как Турбо отладчик может может выполнять в вашей системе
       чтение и запись в память по любому адресу,  непреднамеренно моди-
       фицировав определенные ячейки памяти (например, внутренние облас-
       ти DOS или таблицу прерываний,  которая начинается с ячейки с ну-
       левым адресом), вы можете вызвать сбой системы.
            Например, изменение аппаратного вектора прерывания от тайме-
       ра в ячейке 0000h:0020h почти всегда приводит к проблемам.

       TDeb 3.0 #3-3                = 97 =
          Трассировка в DOS и переключение идентификатора процесса
       -----------------------------------------------------------------
            Турбо отладчик отслеживает выполняющийся процесс  (это может
       быть сам отладчик или ваша программа), поэтому он может открывать
       и закрывать файлы,  не взаимодействуя с описателями файлов  вашей
       программы.  Такое  переключение осуществляется с помощью функцио-
       нального вызова DOS.  Переключение выполняется каждый раз,  когда
       ваша программа запускается из отладчика,  или когда управление из
       нее опять передается отладчику.  Поскольку  операционная  система
       DOS не реентерабельна,  то при задании точек останова или трасси-
       ровке внутри DOS вы можете столкнуться с проблемами.
            Если вы хотите углубиться в DOS,  то для запрещения переклю-
       чения  идентификатора  процесса  используйте  параметр  командной
       строки -i-.  Однако при этом ваша  программа  будет  использовать
       описатели файлов совместно с Турбо отладчиком, что может привести
       к тому, что программа или отладчик исчерпают их число.
              Использование сопроцессора 8087/80287 и эмулятора
       -----------------------------------------------------------------


            Отладчик не  использует  ни  арифметический сопроцессор,  ни
       программный эмулятор,  предоставляя возможность их свободного ис-
       пользования  вашей программе.  Вы должны учитывать различия между
       автономным  выполнением  программы,  использующей  арифметические
       операции с плавающей точкой, и выполнением ее под управлением от-
       ладчика.
                  Прерывания, используемые Турбо отладчиком
       -----------------------------------------------------------------
            Чтобы обеспечить  возможность отладки вашей программы, Турбо
       отладчик перехватывает некоторые  векторы  прерываний.  Следующие
       описания  позволят  определить,  возможны ли взаимодействия между
       вашей программой и Турбо отладчиком.
                           Прерывание 1/Прерывание3
       -----------------------------------------------------------------
            Отладчик использует эти прерывания (INT1/INT2) для обработки
       точек  останова  и пошагового выполнения инструкций.  Если данные
       прерывания модифицируются вашей программой,  то отладчик может не
       получить управления на следующей точке останова.  Обычно приклад-
       ные программы не используют эти прерывания,  так как они резерви-
       руются для других программ (таких, как отладчики), которые должны
       управлять их выполнением.
                                Прерывание 2
       -----------------------------------------------------------------
            Многие аппаратные  отладчики  используют  данное  прерывание
       (INT2) для сообщения о том,  что удовлетворено указанное условие.

       TDeb 3.0 #3-3                = 98 =
       Если ваша программа работает с этим прерыванием,  то такие  аппа-
       ратные платы и соответствующие аппаратные драйверы не смогут пра-
       вильно работать. Если вам необходимо использовать это прерывание,
       и вы не хотите его обслуживать, нужно организовать цепочку с пре-


       дыдущим его пользователем.
                                Прерывание 9
       -----------------------------------------------------------------
            Это аппаратное прерывание от клавиатуры (INT9),  которое ис-
       пользуется  для отслеживания кодов нажатий и освобождений клавиш.
       При выполнении программы пользователя отладчик ведет список  (це-
       почку) этих прерываний, поэтому от может получить управление, ес-
       ли программа входит в цикл.  При каждом запуске  вашей  программы
       отладчик вновь устанавливает этот вектор, что позволяет программе
       для продолжения правильной работы модифицировать данное  прерыва-
       ние.
               Отладка при использовании прерываний INT3 и INT1
       -----------------------------------------------------------------
            Если вы хотите отладить программу,  которая  использует  эти
       прерывания,  версия  отлаживаемой вами программы должна загружать
       эти векторы прерываний только в случае абсолютной необходимости и
       восстанавливать  их содержимое,  как только она закончит работу с
       ними.  Этот метод позволяет минимизировать  объем  кода,  который
       нельзя  отлаживать.  Когда ваша программа загрузит данные векторы
       прерываний, то для выполнения ее кода отладчик использовать нель-
       зя.
             Сохранение содержимого и переключение режима экрана
       -----------------------------------------------------------------
            Обычно отладчик пытается при выполнении участка вашей  прог-
       раммы сохранять  и  восстанавливать режим экрана программы.  Если
       для изменения режима экрана вы используете только стандартные об-
       ращения  к базовой системе ввода-вывода,  то все будет нормально.
       Если вы работаете с регистрами контроллера дисплея непосредствен-
       но, то отладчик может нарушить установленные вами значения.

       TDeb 3.0 #3-3                = 99 =
                            Потребности в памяти


       -----------------------------------------------------------------
            При первоначальном запуске отладчика  DOS  загружает  его  в
       первую  свободную область памяти,  расположенную выше DOS и всеми
       резидентными программами.  После этого отладчик  над  программным
       стоком выделяет рабочий стек и динамически распределяемую область
       памяти.  Далее в памяти  следует  таблица  идентификаторов  вашей
       программы, а за ней - сама отлаживаемая отлаживаемая программа.
            Когда вы  возвращаетесь в DOS,  отладчик освобождает память,
       используемую для таблицы идентификаторов и отлаживаемой  програм-
       мы.  Если  ваша  программа с помощью функции выделения памяти DOS
       (48) выделяла какие-либо блоки памяти,  то эта память также осво-
       бождается Турбо отладчиком.
                                Поддержка EMS
       -----------------------------------------------------------------
            Если в вашей системе имеется плата расширенной памяти (EMS),
       Турбо отладчик будет использовать ее для хранения таблицы иденти-
       фикаторов отлаживаемой программы. Это позволяет освободить больше
       памяти для самой программы.  Отладчик сохраняет и восстанавливает
       состояние  драйвера EMS,  что позволяет вам отлаживать программы,
       использующие память EMS.
            Если ваша  программа должна использовать всю память EMS, или
       вы сталкиваетесь с проблемами при взаимодействии  вашей программы
       с Турбо отладчиком, когда оба они используют EMS, нужно запретить
       отладчику использование EMS (для этого  можно  применить  утилиту
       TDINST или использовать параметр -ye0 для  запрещения буферизации
       оверлеев в расширенной памяти).

       TDeb 3.0 #3-3               = 100 =
               Сохранение и восстановление вектора прерываний
       -----------------------------------------------------------------
            Турбо отладчик поддерживает три различные  копии  первых  48


       векторов прерываний в младших адресах памяти (от 00 до 2F).
            При первоначальном  запуске  Турбо  отладчика  из  командной
       строки DOS делается копия векторов.  Эти векторы восстанавливают-
       ся,  когда  вы  возвращаетесь  обратно  в  DOS  с помощью команды
       File¦Quit (Файл¦Выход) или клавиш  Alt-X.  Данные  векторы  также
       восстанавливаются, если вы во время отладки программы используете
       команду F10¦File¦DOS Shell (Файл¦Командный процессор операционной
       системы) для того, чтобы дать команду DOS.
            Второй набор  векторов  -  это векторы Турбо отладчика.  Они
       действуют,  когда Турбо отладчик работает и выводит информацию на
       экран.  Каждый раз,  когда отладчик получает управление после вы-
       полнения вашей программы, они восстанавливаются.
            Третий набор векторов - это векторы  отлаживаемой программы.
       Они восстанавливаются каждый раз,  когда вы запускаете или выпол-
       няете шаг вашей программы и сохраняются, когда программа останав-
       ливается и Турбо отладчик вновь получает управление. Это позволя-
       ет вам отлаживать программы, которые изменяют векторы прерываний,
       в  то  время как отладчик использует свою собственную версию этих
       прерываний.

       TDeb 3.0 #3-3               = 101 =
            Приложение C. Ключевые слова встроенного Ассемблера
       -----------------------------------------------------------------
            В этом приложении приведен перечень мнемонических  обозначе-
       ний  команд и специальных обозначений,  которые можно вставлять в
       программу с помощью встроенного Ассемблера.  Приведенные ниже за-
       резервированные слова полностью совпадают с теми, которые исполь-
       зуются в Турбо Ассемблере.
          Мнемонические обозначения команд процессоров 8086/80186/80286
                                                             Таблица B.1
       ----------------------------------------------------------------¬


       ¦  FAA              INC               LIDT**             REPNZ  ¦
       ¦  FAD              INSB*             LLDT**             REPZ   ¦
       ¦  FAM              INSW*             LMSW**             RET    ¦
       ¦  FAS              INT               LOCK               REFT   ¦
       ¦  FDC              INTO              LODSB              RQL    ¦
       ¦  FDD              IRET              LODSW              ROR    ¦
       ¦  FND              JB                LOOP               SAHF   ¦
       ¦  FRPL**           JBE               LOOPNZ             SAR    ¦
       ¦  FOUND*           JCXZ              LOOPZ              SBB    ¦
       ¦  FALL             JE                LSL**              SCASB  ¦
       ¦  FLC              JL                LTR**              SCASW  ¦
       ¦  FLD              JLE               MOV                SGDT** ¦
       ¦  FLI              JMP               MOVSB              SHL    ¦
       ¦  FLTS**           JNB               MOVSW              SHR    ¦
       ¦  FMC              JNBE              MUL                SLDT** ¦
       ¦  FMP              JNE               NEG                SMSW** ¦
       ¦  FMPSB            JNLE              NOP                STC    ¦
       ¦   MPSW            JNO               NOT                STD    ¦
       ¦   WD              JNP               OR                 STI    ¦
       ¦   AA              JO                OUT                STOSB  ¦
       ¦   AS              JP                OUTSB*             STOSW  ¦
       ¦   EC              JS                OUTSW*             STR**  ¦
       ¦   IV              LAHF              POP                SUB    ¦
       ¦   NTER*           LAR**             POPA*              TEST   ¦
       ¦   SC              LDS               POPF               WAIT   ¦
       ¦   LT              LEA               PUSH               VERR** ¦
       ¦   DIV             LEAVE*            PUSHA*             VERW** ¦
       ¦   MUL             LES               PUSHF              XCHG   ¦


       ¦   N               LGDT**            RCL                XLAT   ¦
       ¦                                                        XOR    ¦
       ¦                                                               ¦
       ¦** - доступны только при работе с процессорами 186 и 286       ¦
       ¦                                                               ¦
       ¦ * - доступны только при работе с процессором 286              ¦
       L----------------------------------------------------------------
           Отладчик TDW поддерживает все мнемоники инструкций и регистры
       процессора 80386 и сопроцессора 80387:

       TDeb 3.0 #3-3               = 102 =
              Мнемонические обозначения команд процессора 80386
                                                             Таблица C.2
       ----------------------------------------------------------------¬
       ¦  BSF               LSS               SETG                SETS ¦
       ¦  BSR               MOVSX             SETL                SHLD ¦
       ¦  BT                MOVZX             SETLE               SHRD ¦
       ¦  BTC               POPAD             SETNB               CMPSD¦
       ¦  BTR               POPFD             SETNE               STOSD¦
       ¦  BTS               PUSHAD            SETNL               LODSD¦
       ¦  CDQ               PUSHFD            SETNO               MOVSD¦
       ¦  CWDE              SETA              SETNP               SCASD¦
       ¦  IRETD             SETB              SETNS               INSD ¦
       ¦  LFS               SETBE             SETO                OUTSD¦
       ¦  LGS               SETE              SETP                JECXZ¦
       L----------------------------------------------------------------
       Мнемонические обозначения команд процессора 80486   Таблица C.3
       ----------------------------------------------------------------¬
       ¦              BSWAP               INVLPG                       ¦


       ¦              CMPXCHG             WBPINVD                      ¦
       ¦              INVD                XADD                         ¦
       L----------------------------------------------------------------
                         Регистры процессора 80386         Таблица C.4
       ----------------------------------------------------------------¬
       ¦              EAX                 EDI                          ¦
       ¦              EBX                 EBP                          ¦
       ¦              ECX                 ESP                          ¦
       ¦              EDX                 FS                           ¦
       ¦              ESI                 GS                           ¦
       L----------------------------------------------------------------
                     Регистры центрального процессора      Таблица C.5
       ----------------------------------------------------------------¬
       ¦Байтовые регистры            AH, AL, BH, BL, CH, CL, DH, DL    ¦
       ¦Регистры размером в слово    AX, BX, CX, DX, SI, DI, SP, BP    ¦
       ¦Сегментные регистры          CS, DS, ES, SS                    ¦
       ¦Регистры с плавающей         ST, ST(0), ST(1), ST(2), ST(3),   ¦
       ¦точкой                       ST(4), ST(5), ST(6), ST(7)        ¦
       L----------------------------------------------------------------
                    Специальные зарезервированные слова    Таблица C.6
       ----------------------------------------------------------------¬
       ¦                   WORD PTR            TBYTE PTR               ¦
       ¦                   BYTE PTR            NEAR                    ¦
       ¦                   DWORD PTR           FAR                     ¦
       ¦                   QWORD PTR           SHORT                   ¦
       L----------------------------------------------------------------

       TDeb 3.0 #3-3               = 103 =
         Мнемонические обозначения команд сопроцессора 8087/80287


                                                             Таблица C.7
       ----------------------------------------------------------------¬
       ¦ FABS             FIADD              FLDL2E            FST     ¦
       ¦ FADD             FICOM              FLDL2T            FSTCW   ¦
       ¦ FADDP            FICOMP             FLDPI             FSTENV  ¦
       ¦ FBLD             FIDIV              FLDZ              FSTP    ¦
       ¦ FBSTP            FIDIVR             FLD1              FSTSW*  ¦
       ¦ FCHS             FILD               FMUL              FSUB    ¦
       ¦ FCLEX            FIMUL              FMULP             FSUBP   ¦
       ¦ FCOM             FINCSTP            FNOP              FSUBR   ¦
       ¦ FCOMP            FINIT              FNSTS**           FSUBRP  ¦
       ¦ FDECSTP          FISTP              FPREM             FWAIT   ¦
       ¦ FDISI            FISUB              FPTAN             FXAM    ¦
       ¦ FDIV             FISUBR             FRNDINT           FXCH    ¦
       ¦ FDIVP            FLD                FRSTOR            FXTRACT ¦
       ¦ FDIVR            FLDCW              FSAVE             FYL2X   ¦
       ¦ FDIVRP           FLDENV             FSCALE            FYL2XP1 ¦
       ¦ FENI             FLDLG2             FSETPM*           F2XM1   ¦
       ¦ FFREE            FLDLN2             FSQRT                     ¦
       ¦                                                               ¦
       ¦*  - доступны только при работе с числовым сопроцессором 287   ¦
       ¦                                                               ¦
       ¦** - при работе с сопроцессором 80287 в командах fstsw  и      ¦
       ¦     fnstsw кроме обычных операндов,  расположенных в памяти,  ¦
       ¦     в качестве операнда может использоваться регистр AX.      ¦
       L----------------------------------------------------------------
       Мнемонические обозначения команд сопроцессора 80387 Таблица C.8
       ----------------------------------------------------------------¬


       ¦                   FCOS                FUCOM                   ¦
       ¦                   FSIN                FUCOMP                  ¦
       ¦                   FPREM1              FUCOMPP                 ¦
       ¦                   FSINCOS                                     ¦
       L----------------------------------------------------------------

       TDeb 3.0 #3-3               = 104 =
                   Приложение D. Настройка Турбо отладчика
       -----------------------------------------------------------------
            Турбо отладчик будет готов к работе,  как только вы получите
       рабочую копию дистрибутивного диска.  Однако,  вы можете изменить
       многие  используемые  по умолчанию параметры,  запустив программу
       (утилиту) установки TDINST.EXE.  Некоторые параметры можно  изме-
       нять также при запуске Турбо отладчика из командной строки DOS (с
       помощью параметров командной строки).  При  частом  использовании
       для работы с Турбо отладчиком одних и тех же параметров вы можете
       зафиксировать их с помощью программы установки.
            Программа установки позволяет  вам  устанавливать  следующие
       элементы:
            - цвета окон, диалоговых окон и меню;
            - параметры вывода:  начальный экран, режим переключения эк-
              ранов,  формат вывода целых чисел,  длину списка регистра-
              ции,  размер табуляции,  максимальный размер окна  Watches
              (Просмотр),  контроль  за  возникновением  помех на экране
              ("снег"), режим 45/50 строк и сохранение графики, обновле-
              ние экрана пользователя и длину списка регистрации;
            - команду  запуска  редактора и каталоги для поиска исходных
              файлов, а также справочных файлов Турбо отладчика и файлов
              конфигурации;
            - параметры клавиатуры:  клавишу прерывания программы и сок-
              ращения для клавиши Ctrl;


            - параметры ввода пользователя  подсказки:  звуковой  сигнал
              при подсказке, необходимость нажатия клавиши Esc для сбро-
              са ошибки и длину протокола команд,  возможность использо-
              вания "мыши" и сокращений с клавишей Ctrl;
            - параметры отладки на уровне исходного кода: параметры язы-
              ка,  различимость  регистра  символов  и  (для  отладки  в
              Windopws)  поддержку  для  отладки  программ ObjectWindows
              Windows Message (Сообщения Windows);
            - прочие  параметры:  использование расширенной памяти (EMS)
              для таблицы идентификаторов, перехвата прерываний NMI, об-
              работку DOS переключения идентификатора,  удаленной отлад-
              ки, область свопинга командного процессора DOC, размер па-
              мяти для таблицы идентификаторов, порядок сортировки в со-
              ответствии с различными национальными алфавитами.
                           Запуск программы TDINST
       -----------------------------------------------------------------
            Для запуска  программы установки TDINST введите TDINST в от-
       вет на подсказку DOS. После этого программа установки выводит ос-

       TDeb 3.0 #3-3               = 105 =
       новное меню.  Вы можете нажать подсвеченную первую букву элемента
       меню  или использовать для перемещения к нужному элементу клавиши
       управления курсором (стрелки) и нажать клавишу  Enter.  Например,
       для  изменения параметров экрана нажмите D.  Элементы других меню
       программы установки выбираются точно также. Для возврата в преды-
       дущее  меню нажмите клавишу Esc.  Чтобы вернуться в основное меню
       вам может потребоваться нажать Esc несколько раз.
                                      --------------------------¬
                 Цвета                ¦ Colors                > ¦
                 Дисплей              ¦ Display...              ¦


                 Параметры            ¦ Options               > ¦
                 Режим дисплея        ¦ Mode for display      > ¦
                 Сохранение           ¦ Save                  > ¦
                 Выход                ¦ Quit                    ¦
                                      L--------------------------
                     Параметры командной строки TDWINST
       -----------------------------------------------------------------
            В TDINST для задания файла конфигурации,  настройки конфигу-
       рации TDW,  включения  или  выключения поддержки "мыши" вы можете
       использовать параметры командной строки.  Можно  также  задавать,
       настройку конфигурации какого выполняемого файла вы хотите выпол-
       нять.
            Команда вызова программы TDINST имеет следующий синтаксис:
            tdinst [параметры] [выполняемый_файл]
            Например для настройки конфигурации  TD286.EXE  из  каталога
       программы можно ввести:
            tdinst td286.exe
                                 Параметр -C
       -----------------------------------------------------------------
            Чтобы задать при запуске TDINST файл  конфигурации,  исполь-
       зуйте параметр -c. При этом используется следующий синтаксис:
            tdinst -cимя_файла
            С помощью данного параметра вы можете модифицировать текущий
       существующий файл конфигурации или создать новый.  Если  параметр
       -c не указывается, то вы можете задать имя файла конфигурации при
       его сохранении.  По умолчанию файл конфигурации  Турбо  отладчика
       называется   TDCONFIG.TD.   Файл   конфигурации   TDW  называется
       TDCONFIG.TDW.  (Для создания файла конфигурации,  совместимого  с
       отладчиком TDW, нужно запускать программу TDINST с параметрами -c
       и -w.)

       TDeb 3.0 #3-3               = 106 =
                                 Параметр -W
       -----------------------------------------------------------------


            Для настройки конфигурации TDW или  файла  конфигурации  TDW
       запустите TDINST  с  параметром -w.  В этой версии TDINST имеется
       меньше параметров,  так как TDW не поддерживает всех средство  TD
       (например, клавиатурные макрокоманды).  Если параметр недоступен,
       вы не сможете его выбирать.
                                 Параметр -P
       -----------------------------------------------------------------
            Этот параметр вы можете использовать для разрешения или зап-
       рещения поддержки "мыши".  Чтобы запретить поддержку "мыши",  ис-
       пользуйте после параметра дефис:
            TDINST -P-
                           Установка цветов экрана
       -----------------------------------------------------------------
            Для вывода меню выбора цвета выберите команду Colors (Цвета)
       основного меню.  После  этого вам будет предоставлена возможность
       выбора из 2 наборов цветов: настраиваемый и используемый по умол-
       чанию набор номер 2.
                           Настройка цветов экрана
       -----------------------------------------------------------------
            Если вы выбираете команду Customize (Настроить), то выводит-
       ся третье  меню,  параметры  которого позволяют настраивать окна,
       диалоговые окна, меню и экраны.

       TDeb 3.0 #3-3               = 107 =
                                    Окна
       -----------------------------------------------------------------
            Для настройки окон выберите команду меню Windows (Окна). При
       этом будет открыто четвертое меню, из которого вы сможете выбрать
       тип настраиваемого  окна:  Text (текстовое),  Data (окно данных),
       Low Level (нижний уровень,  например, окно CPU), и Other (прочие,
       например, окно Breakpoints). Выбор одного из этих параметров при-
       водит к выводу еще одного меню со списком элементов окон, а также
       с парой окон-примеров (активным и неактивным),  по которым вы мо-


       жете проверить сочетание цветов.  Экран выглядит следующим  обра-
       зом:
       ----------------------------------------------------------------¬
       ¦Turbo Debugger Installation V3.0   1991 Borland Int. Corp. MENU¦
       ¦---------------¬-----------------------------------------------+
       ¦¦-Colors------>¦-----------------------------------------------¦
       ¦¦--------------------¬---------------[*]-----Text Window-----¬-¦
       ¦¦¦-Customize-------->¦--------------¦Normal text             ^-¦
       ¦¦¦ -------------¬set ¦--------------¦Selected text           --¦
       ¦L¦ ¦-Windows--->¦set ¦--------------¦Breakpoint              --¦
       ¦-L-¦ -----------------¬-------------¦                        v-¦
       ¦---L-¦-Text---------->¦-------------L<---------------------->--¦
       ¦-----¦ ---------------------------¬-----Another Window-------¬-¦
       ¦-----¦ ¦-Window-Background--------¦-¦                        ¦-¦
       ¦-----L-¦ Selected text background ¦-¦                        ¦-¦
       ¦------ ¦ Breakpoint               ¦-¦                        ¦-¦
       ¦------ +--------------------------+-¦                        ¦-¦
       ¦------ ¦ Standord foreground      ¦-¦                        ¦-¦
       ¦------ ¦ Selected text foreground ¦-L--------------------------¦
       ¦------ ¦ Current window border    ¦----------------------------¦
       ¦------ ¦ Non-current border       ¦----------------------------¦
       ¦------ ¦ Button                   ¦----------------------------¦
       ¦------ ¦ Scroll bar               ¦----------------------------¦
       ¦------ L-------------------------------------------------------¦
       ¦---------------------------------------------------------------¦
       ¦ Alt: X - exit-------------------------------------------------¦
       L----------------------------------------------------------------
            Рис. D.1. Настройка цветов окон


            Colors - цвета;  Customize - настройка; Windows - окна; Text
       - текст;  Window background - фоновый цвет  окна;  Selected  text
       background - цвет выбранного текста;   Breakpoint - точка остано-
       ва; Standard foreground - стандартный цвет переднего раздела (ос-
       новной цвет);  Selected  text foreground - цвет переднего раздела
       для выбранного текста;  Current window border - граница  текущего
       окна; Button  - "кнопка";  Scroll bar - полоса прокрутки;  Normal
       text - обычный текст;  Selected  text  -  выбранный  текст;  Text
       window - текстовое окно; Another window - другое окно.
            Выбор каждого  из  этих элементов приводит к выводу окна па-
       литры. Для перемещения по палитре можно использовать клавиши  уп-

       TDeb 3.0 #3-3               = 108 =
       равления курсором (клавиши стрелок). Справа от области меню и па-
       литры вы увидите все окна или рамки того вида,  который будет из-
       менен.  При перемещении подсветки меню по различным цветам, окно,
       цвет которого вы выбираете, будет изменяться, чтобы показать, как
       это будет выглядеть. Когда вы выберете нужные цвета, нажмите кла-
       вишу Enter (при этом цвета будет восприняты).
                   Примечание: Турбо отладчик обслуживает  три  цветовых
            таблицы: одну для цветного дисплея, другую - для черно-бело-
            го,  и третью - для монохромного.  Одновременно можно менять
            только  один  набор цветов (на основе текущего видеорежима и
            аппаратного обеспечения дисплея). Поэтому, если вы работаете
            на цветном дисплее и хотите использовать при настройке черно
            -белую таблицу,  наберите перед запуском TDINST в  ответ  на
            подсказку DOS BW80.

       TDeb 3.0 #3-3               = 109 =
                               Диалоговые окна
       -----------------------------------------------------------------
            При выборе   команды   Dialogs   (Диалоговые  окна)  в  меню


       Customize (Настройка) выводится меню со списком диалоговых окно и
       элементов меню,  примером  диалогового окна,  с которым вы можете
       экспериментировать. Экран выглядит следующим образом:
       ----------------------------------------------------------------¬
       ¦Turbo Debugger Installation V3.0   1991 Borland Int. Corp. MENU¦
       ¦---------------¬-----------------------------------------------¦
       ¦¦-Colors------>¦-----------------------------------------------¦
       ¦¦--------------------¬---------------[*]-----Dialog Box-------¬¦
       ¦¦¦-Customize-------->¦--------------¦Box title                ¦¦
       ¦¦¦ -------------¬set ¦--------------¦Text entry    List item 1¦¦
       ¦L¦ ¦-Windows--->¦set ¦--------------¦History item  Higlight   ¦¦
       ¦-L-¦ -----------------¬-------------¦Current item Current item¦¦
       ¦---L-¦-Text---------->¦-------------¦              List item 2¦¦
       ¦-----¦ ---------------------------¬-¦ [ ] Check box           ¦¦
       ¦-----¦ ¦-Window-Background--------¦-¦ [ ] Current item        ¦¦
       ¦-----L-¦ List and group background¦-¦ ( ) Radio button        ¦¦
       ¦------ ¦ Text and entry background¦-¦                         ¦¦
       ¦------ ¦ Highlight background     ¦-¦ Information text        ¦¦
       ¦------ ¦ Button background        ¦-¦                         ¦¦
       ¦------ +--------------------------+-¦ Button  Default  Active ¦¦
       ¦------ ¦ Window border            ¦-¦ ------  -------  ------ ¦¦
       ¦------ ¦ Standard text            ¦-L--------------------------¦
       ¦------ ¦ Information text         ¦----------------------------¦
       ¦------ ¦ Active item              ¦----------------------------¦
       ¦------ ¦ Default item             ¦----------------------------¦
       ¦------ ¦ Current list item        ¦----------------------------¦
       ¦------ ¦ List item                ¦----------------------------¦
       ¦------ ¦ Hot Letter               ¦----------------------------¦


       ¦------ ¦ Scroll bar               ¦----------------------------¦
       ¦------ ¦ Close button             ¦----------------------------¦
       ¦------ L-------------------------------------------------------¦
       ¦---------------------------------------------------------------¦
       ¦ Alt: X - exit-------------------------------------------------¦
       L----------------------------------------------------------------
            Рис. D.2. Настройка цветов диалоговых окон
            Colors - цвета;  Customize - настройка; Windows - окна; Text
       - текст;  Window background - фоновый цвет  окна;  Selected  text
       background - цвет выделенного текста;  Breakpoint - точка остано-
       ва; Standard foreground - стандартный цвет переднего раздела (ос-
       новной цвет);  Selected text foreground - цвет переднего  раздела
       для выбранного текста;  Scroll bar - полоса прокрутки; Dialog box
       - диалоговое окно; Box title - заголовок окна; Text entry - текс-
       товая запись; History item - запись протокола; Current item - те-
       кущая запись;  List item - элемент списка; Highlight - подсветка;
       Current item - текущий элемент;  Check box - блок проверки (пара-
       метр);  Radio button - селективный переключатель; Button - "кноп-

       TDeb 3.0 #3-3               = 110 =
       ка"; Default  - по умолчанию;  Active - активный;  List and group
       background -  фоновый  цвет  списков  и  групп;  Text  and  entry
       background - фоновый цвет текста и записей;  Highlight background
       - фоновый цвет подсвеченного элемента:  Button background - фоно-
       вый цвет "кнопки";  Window border - граница окна; Standard text -
       стандартный  текст;  Information  text  -  информационный  текст:
       Active item - активный элемент; Default item - элемент, использу-
       емый по умолчанию;  Current list item - текущий  элемент  списка;
       List  item  -  элемент  списка;  Hot Letter - оперативная клавиша


       (буква);  Scroll bar - полоса прокрутки;  Close button - "кнопка"
       закрытия.
            Как и в меню Windows, выбор элемента текущего меню открывает
       палитру, из которой вы можете выбирать цвет для данного элемента.

       TDeb 3.0 #3-3               = 111 =
                                    Меню
       -----------------------------------------------------------------
            Если вы выбираете в меню Customize (Настройка) команду Menus
       (Меню),  то  открывается меню настройки параметров меню,  а также
       выводится образец меню.  Выбор элемента меню  приводит  к  выводу
       обычной палитры цветов.
                                         ------------------------------¬
            Фоновый цвет меню            ¦ Menu background             ¦
            Фоновый цвет стандартного    ¦ Standatd item background    ¦
             /активного элемента         ¦ Active item foreground      ¦
            Оперативная клавиша          ¦ Hot letter                  ¦
                                         +-----------------------------+
            Основной цвет строки         ¦ Status foreground           ¦
             состояния                   ¦ Status backgropund          ¦
            Фоновый цвет строки          L------------------------------
             состояния
                                    Экран
       -----------------------------------------------------------------
            Выбор команды  Screen  (Экран)  в меню Customize (Настройка)
       открывает меню,  из которого вы можете получить доступ к  другому
       меню с образцами экрана и палитрами для элементов экрана, а также
       примером фонового цвета экрана,  на котором вы можете  их  прове-
       рить.
                                           ----------------------------¬
            Образец фонового цвета         ¦ Pattern for background  > ¦
                                           +---------------------------+


            Образец фона                   ¦ Pattern background        ¦
            Образец основного цвета        ¦ Pattern foreground        ¦
            Перемещение окна               ¦ Window move               ¦
                                           L----------------------------

       TDeb 3.0 #3-3               = 112 =
                      Цвета, используемые по умолчанию
       -----------------------------------------------------------------
            Если вы выберите  в  меню  Colors  (Цвета)  команду  Default
       Colors Set (Набор цветов, используемый по умолчанию), то на экран
       выводятся активное и неактивное текстовые окна,  и вы можете  ви-
       деть заданные по умолчанию цвета для их элементов.
                 Установка параметров экрана Турбо отладчика
       -----------------------------------------------------------------
            Для вывода  диалогового  окна  параметров  экрана   (Display
       options)  выберите в основном меню команду Display (Экран).
          г=[*]================Display options========================¬
          ¦ Display swapping      Integer format    Beginning display ¦
          ¦                                                           ¦
          ¦ ( ) None               ( ) Hex          (*) Source        ¦
          ¦ (*) Smart              ( ) Decimal      ( ) Assembler     ¦
          ¦ ( ) Always             (*) Both                           ¦
          ¦                                                           ¦
          ¦ Screen lines           Tab size         Max tiled watch   ¦
          ¦ (*) 25 ( ) 43/80        8                6                ¦
          ¦                                                           ¦
          ¦                   User screen updating  Log list length   ¦
          ¦ [ ] Fast screen update ( ) Other display 50               ¦
          ¦ [X] Permit 43/80 lines (.) Flip pages                     ¦
          ¦ [ ] Full graphics save ( ) Swap              OK   Cancel  ¦


          ¦                                             ----- ------  ¦
          L===========================================================-
            Рис. D.3 Диалоговое окно Display Options
            Display options - параметры экрана;  Display swapping -  пе-
       реключение  экрана;  Integer  format - формат вывода целых чисел;
       Beginning display - начальный экран; None - никакого; Smart - эф-
       фективное;  Always - постоянное; Hex - шестнадцатиричный; Decimal
       - десятичный;  Both - оба; Source - исходный; Assembler - Ассемб-
       лер;  Screen lines - строки экрана;  Tab size - размер табуляции;
       Max tiled  watch  -  максимальный  размер окна просмотра;  Screen
       updating - обновление экрана;  Log list length - длина списка ре-
       гистрации;  Fast screen update - быстрое обновление экрана; Other
       display - другой дисплей;  Permit 43/80 lines - разрешение режима
       43/80  строк;  Flip  pages - переключение страниц;  Full graphics
       save - полное сохранение графики;  Swap - переключение;  OK - вы-
       бор; Cancel - отмена.
            Эти устанавливаемые параметры вывода включают в себя те  па-
       раметры, которые вы можете указывать в ответ на подсказку DOS при
       запуске Турбо отладчика,  а также те,  которые  можно  установить
       только с  помощью  программы  TDINST.  Параметры командной строки
       Турбо отладчика и соответствующие  установки  TDINST  описываются
       ниже.

       TDeb 3.0 #3-3               = 113 =
                       Переключатели Display Swapping
       -----------------------------------------------------------------
            Селективные переключатели Display Swapping (Переключение эк-
       рана) можно выбрать в меню Display Options (Параметры экрана) для
       того, чтобы при отладке Турбо отладчик переключался соответствую-
       щим  образом между своим экраном и экраном программы. Допускается
       выбор одного из следующих значений:


       None (Отсутствует)      Отладчик не переключается между экранами.
                               Используйте данный параметр,  если вы от-
                               лаживаете программу,  которая не  выводит
                               информацию на экран.
       Smart (Эффективное)     Переключение на экран пользователя проис-
                               ходит  только в случае вывода информации.
                               Турбо отладчик будет  переключать  экраны
                               каждый раз, когда вы выполняете шаг прог-
                               раммы или инструкцию (либо исходную стро-
                               ку), которая осуществляет запись в видео-
                               память или  чтение  из видеопамяти.  Этот
                               параметр используется по умолчанию.
       Always (Постоянное)     Переключение в  экран пользователя проис-
                               ходит каждый раз, когда выполняется прог-
                               рамма.  Используйте данный параметр, если
                               параметр Smart  не  позволяет  "отловить"
                               все моменты вывода вашей программы данных
                               на экран.  При выборе этого параметра эк-
                               ран будет переключаться каждый раз, когда
                               вы выполняете  шаг  программы,  поскольку
                               экран  Турбо  отладчика на короткое время
                               будет заменяться экраном программы.
                        Переключатель Integer Format
       -----------------------------------------------------------------
            Селективный переключатель Integer Format (Формат  целых  чи-
       сел)  управляет  режимом вывода целый чисел.  С помощью TDINST вы
       можете выбрать один из следующих вариантов:
       Hex (Шестнадцатиричный) Целые числа  будут  выводиться на экран в


                               шестнадцатиричном формате.
       Decimal (Десятичный)    Целые числа будут выводиться в десятичном
                               виде.
       Both (Оба)              Целые числа  будут  выводится  на экран в
                               обоих форматах.

       TDeb 3.0 #3-3               = 114 =
                         Параметр Beginning Display
       -----------------------------------------------------------------
            Переключатель Beginning Display (Начальный экран)  определя-
       ет,  как будет выглядеть экран при запуске Турбо отладчика.  Этот
       переключатель позволяет выбрать один из следующих вариантов:
       Assembler (Ассемблер)     Запуск в режиме Ассемблера.  Ни одна из
                                 ваших программ не выполняется, а в окне
                                 CPU  выводится  первая инструкция прог-
                                 раммы.
       Source (Исходный модуль)  Запуск в  режиме исходного модуля.  Вы-
                                 полняется код  инициализации  соответс-
                                 твующего компилятора,  и вы  перемещае-
                                 тесь  в  окно Module (Модуль) на начало
                                 исходного модуля.
                         Переключатель Screen Lines
       -----------------------------------------------------------------
            Этот селективный  переключатель  позволяет задать,  будет ли
       Турбо отладчик запускаться с режимом 25 строк на экране или 43/50
       строк.
            Режим 43/50  строк доступен только при использовании адапте-
       ров EGA и VGA.
                                   Tab Size
       -----------------------------------------------------------------
            Поле ввода Tab Size (Размер позиции табуляции)  меню Display
       Options (Параметры экрана) программы TDINST позволяет задать чис-
       ло позиций между табуляциями при выводе исходного текста.


Вам бу-
       дет  выведена  подсказка для ввода соответствующего значения (до-
       пустимые  ответы  -  от  1  до  32  включительно).  По  умолчанию
       используется значение 8.
                             Maximum Tiled Watch
       -----------------------------------------------------------------
            Поле ввода Maximum Tiled  Watch  (Максимальный  размер  окна
       просмотра) меню Display (Экран) программы TDINST позволяет задать
       число строк,  до которого может расширяться окно  Watches  (Прос-
       мотр) при выводе без перекрытия окон. Вам будет выведена подсказ-
       ка для ввода соответствующего значения (допустимые ответы -  от 1
       до 20 включительно).
                         Параметр Fast Screen Update
       -----------------------------------------------------------------
            Блок проверки Fast Screen Update (Быстрое обновление экрана)

       TDeb 3.0 #3-3               = 115 =
       меню  Display Options (Параметры экрана) программы TDINST опреде-
       ляет режим обновления экрана.  Включите данный параметр,  если вы
       хотите,  чтобы цветной дисплей обновлялся быстро.  Выключите этот
       параметр, если при разрешении быстрого обновления на экране видны
       помехи в виде "снега" (однако некоторые предпочитают все же быст-
       рое обновление экрана даже при наличии помех).
                       Параметр Permit 43/50-Line Mode
       -----------------------------------------------------------------
            Блок проверки  Permit  43/50-Line  Mode  (Разрешение  режима
       43/50 строк) служит для разрешения соответствующего  режима. Если
       вы  хотите использовать эту возможность,  включите его.  Запретив
       ее, вы сохраните примерно 8К памяти, так как для режима с большим
       экраном  в  отладчике требуется буфер окна большего объема.  Этот
       параметр может оказаться полезным при отладке  больших  программ,
       для  выполнения  которых  требуется много памяти.  При запрещении


       указанного режима вы не сможете перейти в режим 43/50 строк, даже
       если система может с ним работать.
                         Параметр Full Graphics Save
       -----------------------------------------------------------------
            Блок проверки Full Graphics Save (Полное сохранение графики)
       управляет  сохранением  графики.  Ecли вы включите его,  то буфер
       графического экрана будет сохраняться при переключении между  эк-
       раном программы и экраном Турбо отладчика.  При запрещении данной
       возможности вы сэкономите около 12К памяти. Это может быть полез-
       но при отладке больших программ,  для которых требуется много па-
       мяти.  В общем случае это приведет лишь к  небольшому  количеству
       запорченных элементов экрана вашей программы, что обычно не меша-
       ет при отладке.
                     Переключатель User Screen Updating
       -----------------------------------------------------------------
            Селективный переключатель  User  Screen Updating (Обновление
       экрана пользователя) можно выбрать из меню Display Options (Пара-
       метры экрана), чтобы задать, как будет переключаться дисплей меж-
       ду экраном вашей программы и экраном Турбо отладчика.  Этот пара-
       метр позволяет выбрать один из следующих вариантов:
       Other Display           Запускает Турбо  отладчик на другом дисп-
       (Другой дисплей)        лее вашей системы. Если у вас имеется как
                               цветной,  так  и  монохромный  дисплейный
                               адаптер,  эта возможность  позволяет  вам
                               наблюдать  экран программы на одном дисп-

       TDeb 3.0 #3-3               = 116 =
                               лее, а экран Турбо отладчика - на другом.
       Flip Pages              Вывод Турбо  отладчика  помещается на от-
       (Переключение           дельную страницу дисплея. Эта возможность
       страниц)                будет  реализована  только  в том случае,


                               если ваш дисплейный  адаптер  имеет  нес-
                               колько страниц (как адаптеры CGA, EGA или
                               VGA).  Для монохромного дисплея эту  воз-
                               можность использовать нельзя.  Данный па-
                               раметр работает в большинстве возникающих
                               при  отладке ситуаций.  Обмен выполняется
                               быстро, и возможно нарушение работы толь-
                               ко тех программ,  которые используют нес-
                               колько дисплейных страниц и часто  перек-
                               лючаются между ними.
       Swap (Обмен)            Используется один  дисплейный  адаптер  и
                               одна страница.  Переключение экрана поль-
                               зователя и Турбо отладчика осуществляется
                               программным путем.  Это  самый  медленный
                               метод переключения экрана, но он наиболее
                               надежен и не вносит  нарушений  в  работу
                               программы. Если вы отлаживаете программу,
                               которая использует  несколько  дисплейных
                               страниц, укажите этот параметр.

       TDeb 3.0 #3-3               = 117 =
                         Поле ввода Log List Length
       -----------------------------------------------------------------
            Поле ввода  Log  List Length (Длина списка регистрации) меню
       Display Options (Параметры экрана) программы TDINST позволяет за-
       дать,  сколько  предыдущих  ответов  будет сохраняться для каждой
       подсказки. Вам будет выведена подсказка для ввода соответствующе-
       го значения (допустимые ответы - от 4 до 200 включительно).
                        Поле ввода Floating Precision
       -----------------------------------------------------------------


            Используйте данное поле ввода для установки  точности (числа
       цифр после десятичной точки) при просмотре в TDW данных с плаваю-
       щей точкой.  Это число может иметь значения в диапазоне от  1  до
       32.
                          Поле ввода Range Inspect
       -----------------------------------------------------------------
            Используйте данное поле ввода для установки  числа элементов
       TDW,  выводимых обычно для указателя после того, как вы выбираете
       в окне Inspector (Проверка) команду локального меню Range (Диапа-
       зон).  По умолчанию это значение равно 5.  Это означает, что TDW,
       если вы не укажете диапазон с  помощью  команды  локального  меню
       Range,  выводит только первые 5 из указываемых элементов.  Макси-
       мальное значение, которое вы может задавать, равно 4096.
                    Установка параметров Турбо отладчика
       -----------------------------------------------------------------
            Для вывода меню Options (Параметры) программы TDINST выбери-
       те команду основного меню Options (Параметры).
             ----------------------------¬
             ¦ Directories...            ¦    Каталоги
             ¦ Input & prompting...      ¦    Ввод и подсказки
             ¦ Source debugging...       ¦    Отладка исходного кода
             ¦ Miscellaneous...          ¦    Разное
             L----------------------------
                           Параметр Directories...
       -----------------------------------------------------------------
            При выборе параметра Directories (Каталоги) выводится диало-
       говое окно, в поле ввода которого вы можете ввести:
       Editor program name   Данный параметр  программы TDINST позволяет
       (Имя программы-       задать команду DOS, которая будет запускать
       редактора)            ваш редактор.  Это позволит Турбо отладчику

       TDeb 3.0 #3-3               = 118 =
                             запускать редактор,  с которым вы  привыкли


                             работать,  когда во время отладки нужно из-
                             менить что-либо в файле. Турбо отладчик бу-
                             дет добавлять к концу этой команды имя фай-
                             ла  который  вы хотите редактировать (через
                             пробел).
       Source Directories    Выбор параметра Source Directories (Катало-
       (Каталоги исход-      ги  исходных файлов) меню Options (Парамет-
       ных файлов)           ры)  программы  TDINST  позволяет  изменять
                             список каталогов,  в которых Турбо отладчик
                             ищет исходные файлы.
       Turbo Directory       Выбор параметра  Turbo  Directory  (Каталог
       (Каталог Turbo)       Turbo)  меню  Options (Параметры) программы
                             TDINST позволяет задать каталог,  в котором
                             Турбо отладчик будет искать файл конфигура-
                             ции и справочный файл.

       TDeb 3.0 #3-3               = 119 =
                       Параметр Input and Prompting...
       -----------------------------------------------------------------
            Выбор параметра Input and prompting (Ввод и  подсказки) меню
       Options (Параметры) программы TDINST позволяет вам управлять вво-
       димой в Турбо отладчик информацией и  характером подсказок  Турбо
       отладчика.  Таким  образов программы TDINST позволяет определить,
       как вам будет выводиться подсказка для ввода информации и  как вы
       будете отвечать на нее.
          г=[*]================User Input and Prompting===============¬
          ¦ History list length                                       ¦
          ¦  10                           [X] Mouse enabled           ¦
          ¦                                                           ¦
          ¦ Interrupt Key                                             ¦
          ¦  (*) Break                    [ ] Beep on error           ¦


          ¦  ( ) Escape                                               ¦
          ¦  ( ) Num Lock                 [ ] Keystroke recording     ¦
          ¦  ( ) Other                                                ¦
          ¦                               [X] Control key shortcuts   ¦
          ¦                                                           ¦
          ¦ Set Key                       OK               Cancel     ¦
          ¦                             ------             ------     ¦
          ¦ [ ] Full graphics save ( ) Swap                           ¦
          ¦                                                           ¦
          L===========================================================-
            Рис. D. 4 Диалоговое окно User Input and Prompting
            User input  and  prompting  - ввод пользователя и подсказки;
       History list  length - длина списка регистрации;  Mouse enabled -
       разрешение использования "мыши"; Interrupt key - клавиши прерыва-
       ния;  Other - прочая; Beep on error - звуковой сигнал при ошибке;
       Keystroke  recording  -  запись  нажатий  клавиш;   Control   key
       shortcuts - сокращения с клавишей Ctrl;  OK - выбор; Cancel - от-
       мена.
            Можно выбрать следующие варианты:
       History List Length             Позволяет вам задать, сколько ра-
       (Длина списка регистрации)      нее введенных строк будет  сохра-
                                       няться для  каждой подсказки. Для
                                       ввода значения   выводится   окно
                                       ввода.
       Interrupt key (Клавиша          Позволяет задать,  какая  клавиша
       прерывания)                     должна  быть  нажата  с  клавишей
                                       Сtrl  для  прерывания  выполнения
                                       программы по умолчанию.
       Set Key (Задание клавиши)       При выборе значения Other (Прочая)


                                       выберите  переключатель  Set  Key
                                       для назначения  клавиши  прерыва-

       TDeb 3.0 #3-3               = 120 =
                                       ния.  Вам выведется подсказка для
                                       ввода клавиши.
       Mouse Enabled (Разрешение       Этот параметр  позволяет  опреде-
       работы с "мышью")               лить,  будет ли Турбо отладчик по
                                       умолчанию поддерживать "мышь".
       Beep on Error                   Запрещает или  разрешает звуковой
       (Звуковой сигнал при ошибке)    сигнал.  При  разрешении  сигнала
                                       при выводе  сообщений  об  ошибке
                                       или  нажатии  недопустимых клавиш
                                       будет раздаваться  звуковой  сиг-
                                       нал.
       Keystroke recording             Регистрация нажатий клавиш позво-
       (Регистрация нажатий клавиш)    ляет будет ли  в  окне  Execution
                                       History  (Протокол выполнения) по
                                       умолчанию  выполняться  автомати-
                                       ческая запись нажатий клавиш.
       Control-key Shortcuts (Сокра-   Переключает между  разрешением  и
       ращения для клавиши Ctrl)       запрещением использования  сокра-
                                       шений с клавишей Ctrl.  Когда ис-
                                       пользование   данных   сокращений
                                       разрешено, вы можете вызывать лю-
                                       бую команду локального меню,  на-
                                       жав  клавишу  Ctrl  в сочетании с
                                       первой буквой элемента меню.  Од-
                                       нако  при  этом вы не сможете ис-


                                       пользовать такие управляющие кла-
                                       виши как команды перемещения кур-
                                       сора в стиле  редактора WordStar.

       TDeb 3.0 #3-3               = 121 =
                     Диалоговое окно Source Debugging...
       -----------------------------------------------------------------
                   г=[*]=========Source Debugging============¬
                   ¦                                         ¦
                   ¦ Language                                ¦
                   ¦   (*) Source Module                     ¦
                   ¦   ( ) C                                 ¦
                   ¦   ( ) Pascal                            ¦
                   ¦   ( ) Assembler                         ¦
                   ¦                                         ¦
                   ¦ [ ] Ignore symbol case                  ¦
                   ¦ [ ] OWL window message                  ¦
                   ¦                                         ¦
                   ¦    OK                    Cancel         ¦
                   ¦  ------                  ------         ¦
                   ¦                                         ¦
                   L=========================================-
            Рис. D.5 Диалоговое окно Source Debugging
            Диалоговое окно Source Debugging (Отладка на уровне исходно-
       го кода) программы TDINST позволяет вам задать,  какой язык Турбо
       отладчик будет использовать для вычисления выражений.  Можно выб-
       рать одну из следующих возможностей:
       Source Module           Выбор языка будет осуществляться на осно-
       (Исходный модуль)       ве языка текущего исходного модуля.
       C (Язык Си)             Будут всегда   использоваться   выражения
                               языка  Си,  независимо от того,  на каком
                               языке написан текущий модуль.


       Pascal (Паскаль)        Будут всегда   использоваться   выражения
                               Паскаля,  независимо  от  того,  на каком
                               языке написан текущий модуль.
       Assembler (Ассемблер)   Будут всегда использоваться выражения Ас-
                               семблера,  независимо  от того,  на каком
                               языке написан текущий модуль.
                         Параметр Ignore Symbol Case
       -----------------------------------------------------------------
            Выбор параметра Ignore Symbol Case  (Игнорирование  регистра
       идентификаторов)  диалогового  окна  Source  Debugging  программы
       TDINST позволяет управлять различной интерпретацией букв верхнего
       и нижнего регистра.
                        Параметр OWL window messages
       -----------------------------------------------------------------

       TDeb 3.0 #3-3               = 122 =
            Если этот параметр не установлен (по умолчанию),  в програм-
       мах, использующих ObjectWindows отсутствует специальная поддержка
       для отладки с помощью сообщений Windows, a TDW не будет распозна-
       вать  оконные  объекты  вашей  программы,  как процедуры Windows.
       Вместо этого для установки точек останова по  сообщениям  Windows
       требуется  использовать  описатели окна (а чтобы найти указатель,
       нужно достаточно хорошо разбираться в ObjectWindows.
            Если этот блок проверки включен,  TDW обеспечивает для уста-
       новки точек  прерывания по сообщениям в программах,  использующих
       ObjectWindows, специальную поддержку. Эта поддержка позволяет вам
       для установки  точек останова по сообщениям использовать имя объ-
       екта окна вашей программы. Однако отладка с установленными точка-
       ми останова  по  сообщениям  Windows будет происходить медленнее,
       чем когда этот параметр выключен.

       TDeb 3.0 #3-3               = 123 =


                  Диалоговое окно Miscellaneous Options...
       -----------------------------------------------------------------
            Диалоговое окно Miscellaneous Options (Прочие параметры) со-
       держит параметры,  управляющие  прерываниями  NMI  (немаскируемые
       прерывания),  памятью EMS, переключением идентификатора процесса,
       размером области  командного  процессора  DOS,  размером  таблицы
       идентификаторов и удаленной отладкой.
          г=[*]================User Input and Prompting===============¬
          ¦                                                           ¦
          ¦ [ ] NMI intercept                   Remote debugging      ¦
          ¦ [X] Use expanded memory         (*) COM1    ( ) COM2      ¦
          ¦ [X] Change process ID                                     ¦
          ¦ [ ] Full trace history          Link speed                ¦
          ¦ [ ] International support       ( ) 9600 baud             ¦
          ¦                                 (*) 19200 baud            ¦
          ¦ DOS Shell swap size (Kb)        ( ) 38400 baud            ¦
          ¦  128                            ( ) 115000 baud           ¦
          ¦ Spare symbol memory (Kb)                                  ¦
          ¦  0                              Network local name        ¦
          ¦                                 <not avaliable>           ¦
          ¦ Remote type                                               ¦
          ¦  (*) None                       Network remote name       ¦
          ¦  ( ) Serial                     <not avaliable>           ¦
          ¦  ( ) Network                                              ¦
          ¦                                    OK        Cancel       ¦
          ¦                                  ------      ------       ¦
          L===========================================================-
             Рис. D.7 Диалоговое окно Miscellaneous options.


             Miscelleneous options - прочие параметры:  NMI interсept  -
       перехват немаскируемого прерывания; Use expanded memory - исполь-
       зование расширенной памяти; Change process ID - смена идентифика-
       тора процесса;  Remote debugging - удаленная отладка; Remote link
       port - порт удаленной связи;  DOS Shell swap size - размер перек-
       лючения в командный процессор DOS; Link speed - скорость коммуни-
       каций;  Spare symbol memory - память для таблиц  идентификаторов;
       Network local name - локальное имя в сети; not avaliable - недос-
       тупно;  Network remote name - удаленное имя в сети; Remote type -
       тип  удаленной  связи;  None  -  нет;  Serial - последовательная;
       Network - сетевая.

       TDeb 3.0 #3-3               = 124 =
             NMI intersept (Перехват немаскируемого прерывания)
       -----------------------------------------------------------------
            Немаскируемое прерывание  (NMI) - это аппаратное прерывание,
       которое процессор должен немедленно обрабатывать.  Обычно оно ис-
       пользуется для обработки останова,   когда возникает ошибка памя-
       ти: выводится сообщение типа "Memory Parity Error" ("Ошибка пари-
       тета памяти"), и система зависает.
            Другое применение  этого  прерывания  состоит  в  разрешении
       выполнения платой отладчика прерывания при нажатии кнопки  преры-
       вания. Поскольку  при  работе с Турбо отладчиком NMI по умолчанию
       устанавливается в значение  OFF  (выключено),  при  использовании
       платы отладчика вы возможно захотите включить это прерывание.
            Если вы  работаете не на компьютере Tandy 1000A, компьютере,
       совместимом с IBM PC, ACER 1100 или на компьютере NEC MultiSpeed,
       или Турбо отладчик зависает, запустите утилиту TDINDT и выключите
       данный переключатель.  В некоторых компьютерах немаскируемые пре-
       рывания используются таким образом,  что это приводит к конфликту


       с Турбо отладчиком, поэтому, чтобы получить возможность запускать
       программы, запретите это прерывание.
           Use Expanded Memory (Использование расширенной памяти)
       -----------------------------------------------------------------
            Переключатель Use Expanded Memory (Использование расширенной
       памяти) программы TDINST позволяет определить, будет ли Турбо от-
       ладчик использовать для таблицы идентификаторов  память  EMS.  Вы
       можете разрешить эту возможность,  даже если ваша программа также
       использует EMS.
              Change Process ID (Смена идентификатора процесса)
       -----------------------------------------------------------------
            Данный переключатель программы TDINST управляет переключени-
       ем идентификатора процесса.
                 Предупреждение: Не запрещайте использование  этой  воз-
            можности,  если  вы  выполняете  трассировку внутри DOS и не
            представляете себе четко технические детали, о которых расс-
            казывается в Приложении В.
              Full Trace History (Полный протокол трассировки)
       -----------------------------------------------------------------
            Полный протокол трассировки - это протокол вашего сеанса от-
       ладки, который позволяет выполнить обратную трассировку исходного
       кода.  Поскольку использование данного параметра замедляет отлад-
       ку, по умолчанию он выключен.

       TDeb 3.0 #3-3               = 125 =
                   Параметр International (Международный)
       -----------------------------------------------------------------
            Параметр International  (Международный)  позволяет  при  его
       включении сортировать  информацию в Турбо отладчике в поле списка
       в соответствии с установкой COUNTRY в файле CONFIG.SYS (при рабо-
       те в  DOS),  или в соответствии с языком,  указанным в диалоговом
       окне International в управляющей области  Windows (при  работе  с


       Windows). Подробнее об установке текущей страны или языка расска-
       зывается в "Руководстве пользователя по DOS" или в руководстве по
       Windows.
            Если данный параметр не установлен, Турбо отладчик сортирует
       записи в списке в соответствии со значениями  ASCII  выводимых  в
       окне элементов (при использовании DOS) или в соответствии со зна-
       чениями ANSI этих элементов (при использовании Windows).

       TDeb 3.0 #3-3               = 126 =
                             DOS Shell Swap Size
          (Размер области при переключении в командный процессор DOS)
       -----------------------------------------------------------------
            Переключатель DOS Shell Swap Size (Размер переключения в ко-
       мандный процессор DOS) меню Options (Параметры)  программы TDINST
       позволяет вам задать,  какой объем памяти должен обеспечить Турбо
       отладчик, когда вы хотите ввести из его среды команду DOS.
                             Spare Symbol Memory
              (Память, резервируемая для таблиц идентификаторов)
       -----------------------------------------------------------------
            Данное поле ввода позволяет вам задать объем памяти, которая
       резервируется для загрузки "вручную" таблиц идентификаторов.
                     Remote Type (Тип удаленной отладки)
       -----------------------------------------------------------------
            Этот набор селективных переключателей тип удаленной отладки,
       которую вы хотите выполнять:  отсутствует (по умолчанию), удален-
       ная связь черед последовательный порт или через сеть.
            Предупреждение:  Обычно  "кнопка"  None остается в состоянии
       "выключено", поскольку активизация одного из переключателей  уда-
       ленной отладки  приводит к тому,  что Турбо отладчик будет каждый
       раз запускать удаленную связь.
                   Remote Link Port (Порт удаленной связи)


       -----------------------------------------------------------------
            Позволяет выбрать для удаленной связи порт COM1 или COM2.
                     Link Speed (Cкорость коммуникаций)
       -----------------------------------------------------------------
            Позволяет выбрать одну из трех скоростей  передачи,  которая
       может использоваться для удаленной связи (9600,  19200, 38400 или
       115000 бод).
                  Network Local Name (Локальное имя в сети)
       -----------------------------------------------------------------
            Данный текстовый параметр позволяет вам задать имя локальной
       машины (машины,  на  которой  работает  TD).  По  умолчанию   это
       "LOCAL".
                 Network Remote Name (Удаленное имя в сети)

       TDeb 3.0 #3-3               = 127 =
       -----------------------------------------------------------------
            Данный текстовый параметр позволяет вам задать имя удаленной
       машины (машины,  на  которой  работает TDREMOTE или WREMOTE).  По
       умолчанию это "LOCAL".

       TDeb 3.0 #3-3               = 128 =
                           Задание режимов вывода
       -----------------------------------------------------------------
                                         -------------------------¬
              По умолчанию               ¦ Default                ¦
              Цветной                    ¦ Color                  ¦
              Черно-белый                ¦ Black and white        ¦
              Монохромный                ¦ Monochrome             ¦
              На жидких кристаллах       ¦ LCD                    ¦
                                         L-------------------------
            Выбор команды Mode for Display (Режим дисплея) основного ме-
       ню открывает меню, с помощью которого вы можете выбрать режим для
       вашей системы.
       Default                 Турбо отладчик выбирает тот тип графичес-


       (По умолчанию)          кого адаптера,  который имеется  в  вашей
                               системе,  и устанавливает соответствующим
                               образом режим дисплея.
       Color (Цветной)         Если у вас имеется адаптер EGA, VGA, CGA,
                               MCGA  или графический адаптер 8514,  и вы
                               выбираете его по умолчанию,  то экран бу-
                               дет работать в цветном режиме.
       Black and White         Если у вас имеется адаптер EGA, VGA, CGA,
       (Черно-белый)           MCGA  или графический адаптер 8514,  и вы
                               выбираете его по умолчанию,  то экран бу-
                               дет работать в черно-белом режиме.
       Monochrome              Выберите данный параметр, если вы исполь-
       (Монохромный)           зуете   цветной   монитор   и   адаптером
                               Hercules или монохромным адаптером, кото-
                               рый работает только в текстовом режиме.
       LCD (Жидкокристал-      Выберите данный параметр, если вы работа-
       лический)               ете на жидкокристаллическом дисплее.

       TDeb 3.0 #3-3               = 129 =
       Параметры командной строки и их эквиваленты в программе TDINST
       -----------------------------------------------------------------
            Некоторые из  описанных  выше  параметров можно отменить при
       запуске Турбо отладчика из командной строки DOS. В следующей Таб-
       лице показано соответствие между параметрами командной строки от-
       ладчика и командами программы установки TDINST, которые позволяют
       сделать значения этих параметров постоянными.
       -----------T----------------------T-----------------------------¬
       ¦Параметр  ¦  Команда меню TDINST ¦Диалоговые переключатели и   ¦
       ¦          ¦                      ¦        параметры            ¦
       +----------+----------------------+-----------------------------+


       ¦                Display               Display Options          ¦
       ¦                                                               ¦
       ¦       -do                       (.) Other Display             ¦
       ¦       -dp                       (.) Flip Pages                ¦
       ¦       -ds                       (.) Swap                      ¦
       +---------------------------------------------------------------+
       ¦                                                               ¦
       ¦            Options¦Miscellaneous      Miscellaneous Options   ¦
       ¦                                                               ¦
       ¦       -i                        [X] Change Process ID         ¦
       ¦       -i-                       [ ] Change Process ID         ¦
       +---------------------------------------------------------------+
       ¦                                                               ¦
       ¦        Options¦ Input and Prompting  User Input and Prompting  ¦
       ¦                                                               ¦
       ¦       -k                        [X] Keystroke Recording       ¦
       ¦       -k-                       [ ] Keystroke Recording       ¦
       +---------------------------------------------------------------+
       ¦                                                               ¦
       ¦                Display               Display Options          ¦
       ¦                                                               ¦
       ¦       -l                         (.) Assembler                ¦
       ¦       -l-                        ( ) Source                   ¦
       +---------------------------------------------------------------+
       ¦                                                               ¦
       ¦        Options¦Input and Prompting   User input and Prompting ¦
       ¦                                                               ¦
       ¦       -p                         [X] Mouse Enabled            ¦


       ¦       -p-                        [ ] Mouse Enabled            ¦
       +---------------------------------------------------------------+
       ¦                                                               ¦
       ¦            Options¦Miscellaneous      Miscellaneous Options   ¦
       ¦                                                               ¦
       ¦       -r                         (.) Serial                   ¦
       ¦       -r-                        (.) None                     ¦

       TDeb 3.0 #3-3               = 130 =
       +---------------------------------------------------------------+
       ¦                                                               ¦
       ¦            Options¦Miscellaneous      Miscellaneous Options   ¦
       ¦                                                               ¦
       ¦       -rn/;r                     (.) Network                  ¦
       ¦                                  Network Local Name           ¦
       ¦                                  Network Remote Name          ¦
       ¦                                                               ¦
       +---------------------------------------------------------------+
       ¦                                                               ¦
       ¦            Options¦Miscellaneous      Miscellaneous Options   ¦
       ¦                                                               ¦
       ¦       -rp1                        (.) COM1                    ¦
       ¦       -rp2                        (.) COM2                    ¦
       ¦                                                               ¦
       +---------------------------------------------------------------+
       ¦                                                               ¦
       ¦            Options¦Miscellaneous      Miscellaneous Options   ¦
       ¦                                                               ¦
       ¦       -rs1                        (.) 9600 baud               ¦


       ¦       -rs2                        (.) 19200                   ¦
       ¦       -rs3                        (.) 38400                   ¦
       ¦       -rs3                        (.) 115000                  ¦
       ¦                                                               ¦
       +---------------------------------------------------------------+
       ¦                                                               ¦
       ¦            Options¦Source Debugging    Directories            ¦
       ¦                                                               ¦
       ¦        -sc                        [X] Ignore Symbol Case      ¦
       ¦        -sc-                       [ ] Ignore Symbol Case      ¦
       ¦                                                               ¦
       +---------------------------------------------------------------+
       ¦                                                               ¦
       ¦            Options¦Directories          Directories           ¦
       ¦                                                               ¦
       ¦        -sd                            Source Directories      ¦
       +---------------------------------------------------------------+
       ¦                                                               ¦
       ¦            Options¦Miscellaneous      Miscellaneous Options   ¦
       ¦                                                               ¦
       ¦        -sm                         Spare Symbol Memory        ¦
       +---------------------------------------------------------------+
       ¦                                                               ¦
       ¦                  Display               Display Options        ¦
       ¦                                                               ¦
       ¦        -vn                        [ ] Permit 43/50 Lines      ¦
       ¦        -vn-                       [X] Permit 43/50 Lines      ¦
       ¦        -vg                        [X] Full Graphics Save      ¦


       ¦        -vg-                       [X] Full Graphics Save      ¦
       L----------------------------------------------------------------

       TDeb 3.0 #3-3               = 131 =
            Полный список  всех  параметров  командной  строки   утилиты
       TDINST можно получить, если вызвать ее с параметром -h.
                              В процессе работы
       -----------------------------------------------------------------
                                           ----------------------------¬
             Сохранить файл конфигурации   ¦ Save configuration file...¦
             Модифицировать TD.EXE         ¦ Modify TD.EXE             ¦
                                           L----------------------------
            После того,  как вы установите все параметры Турбо отладчика
       так,  как хотите, выберите из основного меню команду Save (Сохра-
       нение), чтобы определить, как вы будете их сохранять.
                        Сохранение файла конфигурации
       -----------------------------------------------------------------
            При выборе команду Save configuration file (Сохранение файла
       конфигурации) выводится диалоговое окно,  инициализированное име-
       нем файла конфигурации,  используемым по умолчанию (TDCONFIG.TD).
       Вы можете использовать данное имя,  нажав клавишу Enter,  или за-
       дать другое имя файла конфигурации.  Если вы зададите другое имя,
       то можете загружать этот файл конфигурации  с  помощью  параметра
       командной  строки Турбо отладчика -с (при его запуске). Например:
             td -cmycfg myprog
            Вы можете также использовать для загрузки файла конфигурации
       после  того,  как  загрузите  отладчик,  команду  Options¦Restore
       Configuration (Параметры¦Восстановление конфигурации).
                          Модификация файла TD.EXE
       -----------------------------------------------------------------
            Если вы  выберите  команду  Modify  TD.EXE   (Модифицировать


       TD.EXE),  то  внесенные  вами в конфигурацию изменения сохранятся
       непосредственно в  выполняемом  файле Турбо отладчика TD.EXE (или
       TDW.EXE если вы запускали TDINST с параметром -w).  При следующем
       запуске Турбо отладчика эти изменения будут использованы по умол-
       чанию.
            В любое время, скопировав файл TD.EXE с дистрибутивного дис-
       ка, вы можете вернуться к стандартной конфигурации.

       TDeb 3.0 #3-3               = 132 =
                          Выход из программы TDINST
       -----------------------------------------------------------------
            Когда вы закончите вносить изменения в конфигурацию, возвра-
       титесь в основное меню, нажав нужное число раз клавишу Esc. Затем
       выберите команду Quit (Выход).

       TDeb 3.0 #3-3               = 133 =
                      Приложение E. Удаленная отладка
       -----------------------------------------------------------------
            Удаленная отладка означает с соответствии со своим названием
       следующее: вы  запускаете  Турбо отладчик на одном компьютере,  а
       отлаживаемую программу - на другом. Две системы могут соединяться
       через последовательный порт или через локальную сеть LAN, совмес-
       тимую с NETBIOS.
            Удаленную отладку полезно использовать в следующих  ситуаци-
       ях:
            - Когда вашей программе требуется много памяти,  и вы не мо-
              жете запускать программу и Турбо отладчик на одном  компь-
              ютере. В  этом  случае  вы получаете сообщение "Not enough
              memory" ("Не хватает памяти").
            - Ваша программа загружается с Турбо отладчиком,  но для  ее
              правильного  функционирования памяти недостаточно.  В этом
              случае в процессе отладки вы будете получать  сообщения об
              ошибках распределения памяти.
            - Когда  вам нужно отладить специальные программы (резидент-


              ные программы или драйверы устройств).
            - Когда вы отлаживаете программу Windows.
             В случае отладки прикладной программы Window у вас есть  вы-
       бор:  вы  можете либо запустить на одной машине программу и Турбо
       отладчик для  Windows  (TDW),  либо  запустить  Windows,  утилиту
       WREMOTE и прикладную программу на одной машине,  а Турбо отладчик
       - на другой.
            Хотя существует много причин,  по которым желательно отлажи-
       вать программу с помощью двух систем,  при разработке  прикладной
       программы Windows преимущества этого становятся еще более очевид-
       ны:
            - При наличии одного монитора запуск Турбо отладчика и прик-
              ладной программы на одной и той же машине означает, что вы
              должны переключаться между символьным режимом Турбо отлад-
              чика и графическими экранами прикладной программы.
              При использовании удаленной отладки вы можете одновременно
              видеть экран прикладной программы и экран Турбо отладчика.
              (То же результат можно получить,  если к одной  системе  у
              вас присоединено два монитора.)
            - Программа  WREMOTE  использует  значительно меньше памяти,
              чем Турбо отладчик, поэтому поведение программы будет зна-
              чительно ближе к нормальному режиму ее работы (без фоновой
              загрузки отладчика).

       TDeb 3.0 #3-3               = 134 =
            Перед тем как прибегать к удаленной отладке  убедитесь,  что
       Турбо отладчик  использует  преимущества работы с установленной в
       вашей системе расширенной памятью EMS. Управлять использованием в
       Турбо отладчике  EMS  для  загрузки в нее таблицы идентификаторов
       программы можно с помощью утилиты TDINST.
             Требования к программному и аппаратному обеспечению
       -----------------------------------------------------------------


            Для сеанса  удаленной  отладки  вы можете выбрать соединение
       через последовательный порт или через  LAN  (локальную  сеть).  В
       этих случаях  используются  разные  аппаратные  средства,  однако
       должны соблюдаться следующие общие требования:
            - рабочая система с памятью,  достаточной для загрузки Турбо
              отладчика (локальная система);
            - другой компьютер РС (удаленная система), имеющий достаточ-
              ный для отлаживаемых программ DOS и TDREMOTE  объем памяти
              (или для отлаживаемой программы Windows и WREMOTE).
              Если вы   собираетесь   отлаживать   прикладную  программу
              Windows, то на удаленной машине  должна  быть  возможность
              работы  в  защищенном  режиме  (это означает использование
              процессора 80286 и старше). Требуемый объем памяти зависит
              от  режима,  в  котором выполняется Windows,  но не должен
              быть менее 1Мб.
            При соединении  через  последовательный порт вам потребуется
       соединяющий две системы кабель. Убедитесь, что кабель, который вы
       используете для соединения двух систем,  подключен правильно.  Он
       должен по крайней мере содержать линии для приема и передачи (ли-
       нии 2 и 3 на 25-пиновом кабеле).
            Для соединения  через  LAN  вам потребуется работающее с LAN
       программное обеспечение, совместимое с Novell Netware (версии IPX
       и NETBIOS 3.0 или старше).
            Перед загрузкой  Турбо отладчика и WREMOTE на обеих системах
       следует загрузить NETBIOS.  Это относится как к  обычной  отладки
       программы DOS, как и к отладке программы Windows.
                  Отладка удаленных прикладных программ DOS
       -----------------------------------------------------------------
            Для отладки прикладной программы  DOS  вы  должны  выполнять
       TDREMOTE и прикладную программу на одной машине, а Турбо отладчик


       на другой.  Здесь и далее машина,  на которой работают TDREMOTE и
       отлаживаемая прикладная программа, будет называться удаленной ма-
       шиной,  а машина, на которой работает Турбо отладчик, будет назы-
       ваться локальной машиной.

       TDeb 3.0 #3-3               = 135 =
                         Установка удаленной системы
       -----------------------------------------------------------------
            Скопируйте на удаленную систему  драйвер  удаленной  отладки
       TDREMOTE.EXE. На удаленную систему также необходимо поместить все
       файлы,  которые требуются для отлаживаемой программы. К ним отно-
       сятся  входные файлы данных,  файлы конфигурации, файлы подсказки
       и т.д.
            Запись файлов на удаленную систему можно осуществить  либо с
       помощью  дискет,  либо  с  помощью утилиты пересылки файлов TDRF,
       описанной в документации на дисках.
            Если хотите,  вы можете поместить на удаленную систему копию
       программы, которую вы собираетесь  отлаживать.  Это  не  является
       обязательным, поскольку Турбо отладчик будет сам при необходимос-
       ти пересылать ее по линии связи.
                 Примечание: TDRF  описывается в поставляемых файлах до-
            кументации.

       TDeb 3.0 #3-3               = 136 =
                       Настройка конфигурации TDREMOTE
       -----------------------------------------------------------------
            При запуске TDREMOTE вы должны настроить ее конфигурацию та-
       ким образом,  чтобы она могла работать через удаленную связь. Для
       этого нужно  запустить этот драйвер с определенным параметром ко-
       мандной строки.  Ниже приведен полный перечень параметров команд-
       ной строки,  поддерживаемых программой TDREMOTE. Перед параметром
       должен стоять либо знак переноса (-), либо косая черта (/).
        ---------------T-----------------------------------------------¬
        ¦  Параметр    ¦  Что он делает                                ¦


        +--------------+-----------------------------------------------+
        ¦  -? или -h   ¦  Отображает текст подсказки                   ¦
        ¦              ¦                                               ¦
        ¦  -rp1        ¦  Порт 1 (COM1); это умолчание                 ¦
        ¦  -rp2        ¦  Порт 2 (COM2)                                ¦
        ¦              ¦                                               ¦
        ¦  -rs1        ¦  Самая низкая скорость, 9600 бод              ¦
        ¦  -rs2        ¦  Низкая скорость, 19200 бод                   ¦
        ¦  -rs3        ¦  Средняя скорость, 38400 бод                  ¦
        ¦  -rs4        ¦  Высокая скорость, 115000 бод (по умолчанию)  ¦
        ¦              ¦                                               ¦
        ¦  -w          ¦  Записать значения параметров в исполняемый   ¦
        ¦              ¦  программный файл                             ¦
        L--------------+------------------------------------------------
            Чтобы получить  список  всех  имеющихся параметров TDREMOTE,
       наберите в ответ на подсказку DOS следующее:
            TDREMOTE -h
                             Настройка TDREMOTE
       -----------------------------------------------------------------
            Если запустить программу TDREMOTE без параметров,  она будет
       использовать номер порта и скорость передачи, заданные по умолча-
       нию,  то  есть записанные в исполняемом программном файле (COM1 и
       115000 бод), если вы их не изменяли с помощью параметра -w.
            Вы можете  сделать  параметры  командной  строки   программы
       TDREMOTE постоянными, записав их обратно в выполняемый файл прог-
       раммы TDREMOTE,  хранящийся на диске.  Чтобы это сделать надо за-
       дать параметр -w вместе с другими параметрами,  которые требуется
       сделать постоянными.  Затем программа запросит  имя  исполняемого
       файла. В ответ на запрос можно ввести новое имя выполняемого фай-


       ла,  которого еще не существует.  В этом случае TDREMOTE  создаст
       новый выполняемый файл.  Если вы просто нажмете клавишу Enter, то
       будет  изменена  работающая  в  данным  момент  программа (обычно
       TDREMOTE.EXE).
            Если вы работаете в операционной системе DOS версии  3.0 или

       TDeb 3.0 #3-3               = 137 =
       более поздней,  запрос будет включать маршрут и имя файла, из ко-
       торого вы запускали программу TDREMOTE. Вы можете подтвердить это
       имя, нажав клавишу Enter, либо ввести новое имя выполняемого фай-
       ла. Файл с новым именем должен уже существовать и являться копией
       программы TDREMOTE, которую вы сделали ранее. Если вы работаете в
       DOS версии 2.х,  вы требуется указать полный маршрут и имя  файла
       выполняемой программы.
            Например, на удаленной системе введите в ответ  на подсказку
       DOS команду:
            TDREMOTE -w -rs3 -rp2
            Когда выведется подсказка, введите имя программы для модифи-
       кации, например tdremot2.exe.  При этом  TDREMOTE  создает  новый
       драйвер удаленной связи с именем TDREMOTE2.EXE.  По умолчанию ис-
       пользуется скорость 38400 бод (-rs3) и последовательный порт COM2
       (-rp2).
                            Удаленный драйвер DOS
       -----------------------------------------------------------------
            Чтобы начать сеанс удаленной отладки,  нужно сначала  запус-
       тить драйвер на удаленной системе, а затем загрузить Турбо отлад-
       чик на локальной системе.  Перед запуском TDREMOTE убедитесь, что
       каталог на  удаленной  системе установлен правильно (в нем должны
       содержаться файлы программы).  Это существенно,  так как TDREMOTE
       помещает программу, которую требуется отладить, в каталог, являю-
       щийся текущим при запуске Турбо отладчика.
            При  загрузке TDREMOTE выводит сообщение об  авторских  пра-
       вах, указывающее,  что она ожидает от вас запуска Турбо отладчика


       на другом конце коммуникации. Для остановки и возврата в DOS наж-
       мите клавиши Ctrl-Break.
                Запуск удаленного последовательного драйвера
       -----------------------------------------------------------------
            Если для соединения систем вы используете кабель без модема,
       то для  задания  скорости и порта коммуникаций нужно использовать
       параметры -rs и -rp.
            Перед запуском утилиты TDREMOTE определите, какой последова-
       тельный порт используется на удаленной системе (COM1  или  COM2).
       Если это COM1, запустите TDREMOTE командой:
               TDREMOTE -rp1 -rs4
            Заметим, что эти установки используются TDREMOTE по  умолча-
       нию, поэтому, если используемые по умолчанию параметры не изменя-
       лись, эквивалентен ее запуск командой:

       TDeb 3.0 #3-3               = 138 =
              TDREMOTE
             Если на  удаленной  системе  используется  последовательный
       порт COM2, запустите TDREMOTE командой:
               TDREMOTE -rp2 -rs3
                 Примечание: Если вы используете компьютер PS/2, задайте
            в командной строке параметр -rs1.
            Все три этих команды запускают  связь  с  максимальной  ско-
       ростью  (115 Кбод).  Для большинства компьютеров PC и кабелей это
       будет работать. Далее (Таблица E1) мы расскажем, как можно запус-
       тить  связь с более низкой скоростью передачи (если у вас возник-
       нут трудности).
            Возможно, что для безмодемного соединения через  кабель  ло-
       кальная и  удаленная  система  используют  разные  порты.  В этом
       случае установки для последовательных портов систем будут не сов-
       падать. Однако,  чтобы соединение работало, скорость связи должна
       быть одинаковой.
                       Запуск удаленного драйвера LAN
       -----------------------------------------------------------------
            Если для  соединения  двух  систем  вы используете локальную


       сеть LAN, то TDREMOTE нужно запускать с параметром -rn. Например,
       использование в ответ на подсказку DOS следующей команды:
            TDREMOTE -rnremotelink
       приведет к запуску TDREMOTE через соединение LAN с именем удален-
       ной системы remotelink. Если имя удаленной системы в команде опу-
       щено, то по умолчанию используется имя REMOTE.
                 Примечание: Более  подробно  об именах удаленных систем
            рассказывается ниже в разделе "Соединение через LAN".
                    Как установить удаленную связь в DOS
       -----------------------------------------------------------------
            После того   как   на  удаленной  системе  загружен  драйвер
       TDREMOTE, запустите на локальной системе Турбо отладчик,  исполь-
       зуя параметры  командной  строки,  соответствующие  установленной
       связи (последовательной или через LAN).
                         Последовательное соединение
       -----------------------------------------------------------------

       TDeb 3.0 #3-3               = 139 =
            Турбо отладчик и TDREMOTE для задания скорости и порта  пос-
       ледовательной связи  используют  один  и тот же синтаксис.  Чтобы
       система правильно работала,  скорость связи нужно задавать одина-
       ково (с помощью параметра -rs).
            После того   как   на  удаленной  системе  загружен  драйвер
       TDREMOTE, чтобы установить связь,  запустите на локальной системе
       Турбо отладчик.  Вот типичная команда Турбо отладчика для запуска
       удаленной связи:
               td -rs2 myprog
            По ней будет запущена связь через удаленный порт COM2 с  ис-
       пользованием назначенной по умолчанию скорости обмена 115000 бод,
       а в удаленную систему загрузится программа myprog  (если  ее  там
       еще нет).
                 Примечание: Более  подробно  о  загрузке программ с ис-
            пользованием удаленной связи рассказывается ниже  в  разделе


            "Загрузка программ на удаленной системе".
            Когда связь будет успешно запущена, на удаленной системе по-
       явится сообщение "Link established" ("Связь  установлена"),  а  в
       индикаторе активности  на  локальной системе выводится READY (Го-
       тов), затем на локальной системе выводится экран Турбо отладчика.
            Вместо использования параметров -rs и -rp вы  можете указать
       параметр командной строки -r,  который запускает удаленную после-
       довательную связь через используемый по умолчанию порт  с  назна-
       ченной  по умолчанию скоростью.  Если вы не изменили используемые
       по умолчанию значения с помощью программы TDINST,  то параметр -r
       будет  определять  порт  COM1 и скорость 115000 бод (максимальную
       скорость обмена).
                            Соединение через LAN
       -----------------------------------------------------------------
            Для инициализации удаленной связи через LAN в Турбо отладчи-
       ке используется параметр командной строки -rn.  Однако используе-
       мый в Турбо отладчике синтаксис слегка отличается от того синтак-
       сиса, который используется в TDREMOTE.
            Когда в   командной   строке  Турбо  отладчика  используется
       параметр -rn,  он воспринимает два необязательных параметра:  имя
       локальной системы и имя удаленной системы,  разделенные точкой  с
       запятой.  Поскольку оба параметра не являются обязательными,  за-
       пустить Турбо отладчик с параметром командной  строки  -rn  можно
       четырьмя способами:
            TD -rn имя_файла
            TD -rnLOCAL1 имя_файла

       TDeb 3.0 #3-3               = 140 =
            TD -rn;REMOTE1 имя_файла
            TD -rnLOCAL1;REMOTE1 имя_файла
                 Примечание: По всем этим командам  DOS  Турбо  отладчик
            загружается  с  использованием  LAN  и загрузкой для отладки
            программы "имя_файла".


                 Примечания: Имена локальной и удаленной  системы  могут
            содержать до 16 символов.
            Первая команда  использует для локальной и удаленной системы
       имена, назначенные по умолчанию (LOCAL и  REMOTE соответственно).
       Вторая команда задает в качестве локальной системы LOCAL1,  а для
       удаленной системы  используется  имя,  назначенной  по  умолчанию
       (REMOTE). В третьей команде используемое по умолчанию имя задает-
       ся для локальной системы,  а для удаленной задается имя  REMOTE1.
       Наконец, в  четвертой команде задается как локальное,  так и уда-
       ленное имя.
            После задания команды Турбо отладчика установка связи займет
       не более 15 секунд.
            Если на локальной и на удаленной системе работает один чело-
       век, то нет необходимости задавать локальные и  удаленные  имена.
       Однако, удаленную  отладку  используют несколько человек,  то для
       всех систем нужно задать локальные имена.
              Удаленная отладка прикладных программ для Windows
       -----------------------------------------------------------------
            Для отладки прикладной программы для Windows вы  должны  вы-
       полнять Windows,  WREMOTE и прикладную программу на одной машине,
       а Турбо отладчик на другой.  Здесь и далее машина, на которой ра-
       ботают Windows,  WREMOTE и отлаживаемая прикладная программа, бу-
       дет называться удаленной машиной,  а машина,  на которой работает
       Турбо отладчик, будет называться локальной машиной.
                        Подготовка удаленной системы
       -----------------------------------------------------------------
            Скопируйте на удаленную систему  драйвер  удаленной  отладки
       WREMOTE.EXE  и  программу конфигурации WRSETUP.EXE.  На удаленную
       систему также необходимо поместить все файлы,  которые  требуются
       для отлаживаемой программы. К ним относятся входные файлы данных,


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

       TDeb 3.0 #3-3               = 141 =
            Запись файлов на удаленную систему можно осуществить  либо с
       помощью  дискет,  либо  с  помощью утилиты пересылки файлов TDRF,
       описанной в документации на дисках.
                            Конфигурация WREMOTE
       -----------------------------------------------------------------
            До того,  как вы запустите WREMOTE в первый раз, чтобы уста-
       новить  скорость передачи данных и номер порта связи для WREMOTE,
       выполнить программу WRSETUP.  Если вы запускаете  WRSETUP  первый
       раз,  нужно  использовать команду File¦New (Файл¦Новый) менеджера
       программ Windows  для  конфигурации  WRSETUP.EXE  как  прикладной
       программы группы прикладных программ Windows. Кроме того, сделай-
       те то же самое для WDREMOTE.EXE.

       TDeb 3.0 #3-3               = 142 =
                    Установка WREMOTE и WRSETUP в Windows
       -----------------------------------------------------------------
            При выполнении WRSETUP вы увидите  окно  с  командами  File,
       Settings и Help.  Выбрав Settings (Установки),  вы получите соот-
       ветствующий экран.
           -----------------------------------¬
           ¦-¦ WRSetup Turbo Debugger Setup ¦-¦
           +----------------------------------+
           ¦ File    Settings    Help         ¦
           ¦                                  ¦
           ¦                                  ¦
           ¦                                  ¦
           ¦                                  ¦
           ¦     -----------------------------+------------------------¬
           ¦     ¦--------------Remote Driver Settings-----------------¦
           L-----+                                                     ¦


                 ¦ -¬                   ------OK------ ----Cancel----  ¦
                 ¦ L-  Disable clock interrupts                        ¦
                 ¦ --  Quit when TD quits             -Baud rate-¬     ¦
                 ¦                                    ¦ o 9600   ¦     ¦
                 ¦ Starting directory:                ¦ * 19200  ¦     ¦
                 ¦ -------------------------¬         ¦ o 38400  ¦     ¦
                 ¦ L-------------------------         ¦ o 115000 ¦     ¦
                 ¦                                    L-----------     ¦
                 ¦  -Remote type---¬                                   ¦
                 ¦  ¦ * Serial     ¦                                   ¦
                 ¦  ¦ o Network    ¦                                   ¦
                 ¦  L---------------                                   ¦
                 ¦                                    -Comm port-¬     ¦
                 ¦ Network remote name:               ¦ * COM1   ¦     ¦
                 ¦ -------------------------¬         ¦ o COM2   ¦     ¦
                 ¦ L-------------------------         L-----------     ¦
                 L------------------------------------------------------
            Рис. E. 1 Основное окно WRSETUP и  диалоговое  окно  Settings
       (Установки)
            Turbo Debugger  Setup  -  установки Турбо отладчика;  File -
       файл; Settings  -  установки;  Help  -  справка;  Remote   Driver
       Settings -  установки  удаленного драйвера;  Baud rate - скорость
       передачи; Comm port - порт связи; Disable clock interrupts - зап-
       рет прерываний от таймера;  Quit when TD quits - выход при выходе
       TD; Starting  directory  -  начальный  каталог;  Cancel - отмена;
       Remote type - тип удаленной  связи;  Serial  -  последовательная;
       Network - через сеть; Network remote name - имя удаленной системы
       в сети.
                      Связь через последовательный порт


       -----------------------------------------------------------------

       TDeb 3.0 #3-3               = 143 =
            Если вы используете последовательную связь,  выберите селек-
       тивный переключатель Serial Remote Type (Тип связи через последо-
       вательный порт) и установите скорость передачи и последовательный
       порт,  которые подходят для  вашей  аппаратной  конфигурации.  По
       умолчанию устанавливаются значения 115000 бод и COM1.

       TDeb 3.0 #3-3               = 144 =
                               Связь через LAN
       -----------------------------------------------------------------
            Если вы используете связь через локальную сеть, выберите се-
       лективный переключатель Network  Remote  Type  (Тип  связи  через
       сеть)  и  задайте  нужное  имя удаленной системы в текстовом поле
       ввода Network Remote Name.  По умолчанию  используется  системное
       имя REMOTE.
                 Примечание: Подробнее  об  именах  в  удаленной системе
            рассказывается выше в разделе "Соединение через LAN".
            В окне текстового ввода Starting Directory (Начальный  ката-
       лог) вы можете ввести маршрут доступа к каталогу, в котором Турбо
       отладчик будет искать отлаживаемые  программы.  Если  вы  хотите,
       чтобы при  завершении на локальной машине Турбо отладчика на уда-
       ленной машине выполнялся выход из WREMOTE и отлаживаемой програм-
       мы (т.е.  чтобы управление передавалось Windows), установите этот
       параметр в окне Quit When HosS Quits (Выход при завершении работы
       на  основной  машине).  При использовании высокой скорости обмена
       (38400 или  115000 бод) выбор параметра Disable  Clock Interrupts
       (Отменить прерывания от системных часов) может помочь вам, если у
       вас возникли проблемы при установке связи между  Турбо отладчиком
       и WREMOTE. Это поможет WREMOTE и Турбо отладчику установить связь
       в операционной среде Windows.


            Установив все параметры,  закройте окно WRSETUP. WRSETUP за-
       пишет  все  сделанные  вами установки в файл TDW.INI в каталоге с
       Windows. Как и любой другой файл .INI, этот файл может быть отре-
       дактирован непосредственно любым текстовым редактором, работающим
       в формате ASCII.  Следующий раздел в файле TDW.INI  устанавливает
       для WREMOTE скорость передачи данных 19200 бод через COM2, запре-
       щает прерывания от системных часов и задает  выход  из  программы
       (возврат в Windows) при выходе из Турбо отладчика:
            [WRemote]
            BaudRate=2
            Port=2
            Quit=1
            Clock=1

       TDeb 3.0 #3-3               = 145 =
                Параметры командной строки программы WREMOTE
       ----------------------------------------------------------------
            Ниже приведен  полный  перечень параметров командной строки,
       поддерживаемых программой WREMOTE, при помощи которых можно пере-
       определить установки, сделанные в файле TDW.INI. Перед параметром
       должен стоять либо знак дефиса (-), либо косая черта (/).
       ----------------T-----------------------------------------------¬
       ¦ Параметр      ¦  Что он делает                                ¦
       +---------------+-----------------------------------------------+
       ¦               ¦                                               ¦
       ¦ -c<имя_файла> ¦ Использовать <имя_файла> как файл конфигурации¦
       ¦               ¦ (файл .INI)                                   ¦
       ¦               ¦                                               ¦
       ¦ -d<каталог>   ¦ Использовать  <каталог>  в качестве начального¦
       ¦               ¦                                               ¦
       ¦ -rc0          ¦ Разрешает прерывания от системных часов       ¦
       ¦ -rc1          ¦ Запрещает прерывания от системных часов       ¦
       ¦               ¦                                               ¦


       ¦ -rp1          ¦ Порт 1 (COM1); это умолчание                  ¦
       ¦ -rp2          ¦ Порт 2 (COM2)                                 ¦
       ¦               ¦                                               ¦
       ¦ -rq0          ¦ Не выполнять выход при выходе из TD           ¦
       ¦ -rq1          ¦ Выполнять выход при выходе из TD              ¦
       ¦               ¦                                               ¦
       ¦ -rs1          ¦ Самая низкая скорость, 9600 бод               ¦
       ¦ -rs2          ¦ Низкая скорость, 19200 бод                    ¦
       ¦ -rs3          ¦ Средняя скорость, 38400 бод                   ¦
       ¦ -rs4          ¦ Высокая скорость, 115000 бод (по умолчанию)   ¦
       L---------------+------------------------------------------------
                     Запуск удаленного драйвера Windows
       -----------------------------------------------------------------
            После запуска программы WREMOTE из Windows в позиции курсора
       появляется изображение курсора специальной формы  ("песочных  ча-
       сов"), что означает, что ожидается запуск Турбо отладчика на дру-
       гом конце коммуникации.
            Для завершения WREMOTE,  ожидающей установления связи с  TDW
       (если, например, появились проблемы соединения с TDW), нажмите на
       удаленной машине клавиши Ctrl-Break.
               Установка связи с удаленной системой с Windows
       -----------------------------------------------------------------
            Чтобы запустить Турбо отладчик на локальной машине,  исполь-
       зуя связь с удаленной системой c Windows нужно добавить к команд-
       ной строке  Турбо отладчика параметр -w.  Параметр -w определяет,
       что программа должна отлаживаться как программа Windows.

       TDeb 3.0 #3-3               = 146 =
            Параметр командной строки -w,  используемый с Турбо отладчи-
       ком, в корне отличается от параметра -w командной строки TDREMOTE


       (TDREMOTE используется - w для записи параметров на диск).
                      Связь через последовательный порт
       -----------------------------------------------------------------
            Если вы используете последовательную связь через безмодемный
       кабель,  то чтобы установить скорость передачи и последовательный
       порт,  можно использовать параметры -rs и -rp.
                 Примечание: Подробнее  о  параметрах  командной  строки
            рассказывается  выше  в разделе "Соединение через последова-
            тельный порт".
            Для Турбо отладчика и WREMOTE скорость обмена  должна  уста-
       навливаться одинаково.  Для  задания  скорости передачи для Турбо
       отладчика можно использовать параметр -rs или параметр -r,  кото-
       рый запускает связь через последовательный порт,  назначая порт и
       скорость передачи по умолчанию.  Если вы не  изменили  с  помощью
       TDINST параметры, используемые по умолчанию, то параметр -r зада-
       ет COM1 и скорость 19200 бод.
                               Связь через LAN
       -----------------------------------------------------------------
            Для инициализации связи через локальную сеть, выберите пара-
       метр Турбо  отладчика  -rn.  Приведем  пример  типичной командной
       строки Турбо отладчика для запуска удаленной связи с Windows:
            TD -rs2 -w myprog
            По ней  будет запущена связь через используемый по умолчанию
       удаленный порт (обычно COM1) с использованием  максимальной  ско-
       рости  обмена 115000 бод,  а в удаленную систему загрузится прог-
       рамма myprog (если ее там еще нет).
            При запуске  Турбо  отладчика на локальной машине он выводит
       сообщение об авторских правах и следующее сообщение:
            Waiting for handshake (press Ctrl-Break to quit)
            (Ожидается установление    связи,    для    выхода   нажмите
            Ctrl-Break)


            Во время ожидания соединения на удаленной  системе выводятся
       "песочные часы". Если связь успешно установлена,песочные часы ис-
       чезают, а на локальной машине появляется обычное окно  Турбо  от-
       ладчика.

       TDeb 3.0 #3-3               = 147 =
                   Загрузка программы в удаленную систему
       -----------------------------------------------------------------
            Если имя файла указано в качестве аргумента командной строки
       Турбо отладчика,  или  если  вы загружаете в Турбо отладчик новый
       файл, используя для этого команду File¦Open (Файл¦Открыть), Турбо
       отладчик будет автоматически  проверять,  требуется  ли  передать
       программу по удаленной системе.
                 Примечание: Файлы DLL Windows автоматически на  удален-
            ную систему не передаются.
            В отношении загрузки программы в удаленную систему Турбо от-
       ладчик отличается гибкостью.  Сначала он проверяет наличие  прог-
       раммы на удаленной системе.  Если программы там нет,  он передает
       ее. Если программа на удаленной системе имеется,  он  анализирует
       дату  и  время  копии  программы на локальной системе и удаленной
       системе. Если копия на локальной системе более  поздняя  (новая),
       чем на удаленной, он предполагает, что вы перекомпилировали и пе-
       рекомпоновали программу и передает ее по линии  связи.
            При этом на высокой  скорости  передачи  файлы  пересылаются
       примерно за 10 секунд.  Типичная программа средней величины (60К)
       при максимальной скорости связи будет передана за время порядка 6
       секунд. Для  индикации  выполняемых  действий на экране удаленной
       системы ведется отсчет байт передаваемого файла.
                          Сеансы удаленной отладки
       -----------------------------------------------------------------
            После того,  как вы запустите программу TDREMOTE или WREMOTE


       и отладчик в удаленном режиме, вашу программу можно будет отлажи-
       вать с помощью команд Турбо отладчика точно также, как при работе
       на  одной  системе.  Команды Турбо отладчика будут работать точно
       также.
            Нужно иметь  в виду,  что поскольку отлаживаемая программа в
       действительности работает на удаленной системе, весь вывод на эк-
       ран  или ввод с клавиатуры выполняются на удаленной системе.  При
       работе с  удаленной связью команда Window¦User Screen (Окно¦Экран
       пользователя) не действует.
            Если вы при работе с Турбо  отладчиком  хотите  передать  на
       удаленную  систему файлы,  можно использовать команду DOS (вызвав
       команду меню File¦DOS Shell  (Файл¦Командный  процессор  DOS))  и
       утилиту TDRF, которая поддерживает обслуживание файлов на удален-
       ной системе. Затем, набрав в ответ на подсказку DOS команду exit,
       вы  можете  вернуться в Турбо отладчик и продолжить отладку своей
       программы.

       TDeb 3.0 #3-3               = 148 =
                            Возможные затруднения
       -----------------------------------------------------------------
            Перечислим возможные способы  устранения  неисправностей,  с
       которыми вы можете столкнуться при установке удаленной связи:
            - При возникновении проблем проверьте сначала кабельные кон-
              цы.
            - Проверьте,  задали ли вы правильный порт или правильно  ли
              подключились через сеть.
            - Попробуйте установить связь с более низкой скоростью обме-
              на (с помощью параметра командной строки -rs),  пока связь
              не заработает.
            - Некоторые  аппаратные  средства или кабель могут на макси-
              мальной скорости не работать,  поэтому  можно  попробовать
              использовать другой кабель или компьютер.
            - Если вы отлаживаете прикладную программу Windows,  и связь


              в нужное время не заработала, используйте WRSETUP для зап-
              рета прерываний от таймера и попробуйте работать  со  ско-
              ростью 96000 бод.  Если все работает, попробуйте увеличить
              скорость.

       TDeb 3.0 #3-3               = 149 =
                         Сообщения утилиты TDREMOTE
       -----------------------------------------------------------------
            Приведем список  сообщений,  которые  вы можете получать при
       работе с программой-утилитой TDREMOTE:
            nn bytes downloaded
            (Передано nn байт)
            На удаленную систему передается файл. Это сообщение отражает
       процесс передачи файла. При максимальной скорости обмена выполня-
       ется передача около 10К в секунду.
            Can't create file
            (Невозможно создать файл)
            Программа TDREMOTE не может создать файл,  в  который  нужно
       пересылать информацию.  Это может произойти в случае переполнения
       диска или если файл с данным именем уже присутствует  в каталоге.
            Can't modify exe file
            (Невозможно модифицировать выполняемый файл)
            Файл, имя которого вы задали,  не является допустимой копией
       утилиты  TDREMOTE.  С  помощью  параметра -w можно модифицировать
       только копию выполняемого файла утилиты TDREMOTE.
            Can't open exe file to modify
            (Невозможно открыть выполняемый файл для модификации)
            Файл, имя которого вы указали для модификации, не может быть
       открыт. Возможно вы ввели недопустимое имя или имя несуществующе-
       го файла.
            Download complete
            (Передача закончена)
            Передача файла TDREMOTE успешно завершена.
            Download failed, write error on disk
            (Сбой при передаче: ошибка при записи на диск)
            TDREMOTE записала часть принятого файла на диск.  Обычно это
       происходит  при  переполнении диска.  Для успешной передачи файла


       вам придется удалить некоторые файлы.
            Enter program name to modify
            (Введите имя программы для модификации)
            Если вы работаете под управлении версии DOS  3.0  или  более
       поздней,  то в подсказке будет указан маршрут и имя файла, из ко-
       торого запущена программа TDREMOTE.  Вы можете назначить это имя,
       нажав  клавишу  Enter,  или  ввести новое имя (файл с этим именем

       TDeb 3.0 #3-3               = 150 =
       должен  существовать  и  представлять   собой   копию   программы
       TDREMOTE.)
            При работе  в  среде  DOS версии 2.х вам нужно будет указать
       для выполняемого файла программы полное имя маршрута.
            Interrupted
            (Прервано)
            Во время ожидания установления связи с  другой  системой  вы
       нажали Ctrl-Break.
            Invalid command line option
            (Недопустимый параметр командной строки)
            При запуске  TDRF из командной строки DOS вы задали неверный
       параметр.
            Link broken
            (Связь прервана)
            Программа, осуществляющая связь с TDREMOTE, прекратила рабо-
       ту и вернулась в DOS.
            Link established
            (Связь установлена)
            На другой системе запущена программа для связи с TDREMOTE.
            Loading program "имя" from disk
            (Загрузка программы "имя" c диска)
            Турбо отладчик указал TDREMOTE, что нужно загрузить програм-
       му с диска для подготовки ее к отладке.
            Program load failed, EXEC failure
            (Сбой при загрузке программы: ошибка EXEC)
            DOS не может загрузить программу в память.  Это может  прои-
       зойти,  если  программа  повреждена или усечена.  Нужно удалить с
       диска файл программы.  После этого Турбо отладчику придется пере-
       дать ее новую копию. Если после этого сообщение повториться, сле-
       дует установить связь с другой системой и повторить попытку.


            Program load failed; not enough memory
            (Сбой при загрузке программы: не хватает памяти)
            На удаленной системе на хватает памяти для загрузки програм-
       мы  для  отладки.  Это может происходить только при отладке очень
       больших программ, поскольку для TDREMOTE требуется только 15К па-
       мяти.
            Program load failed; program not found

       TDeb 3.0 #3-3               = 151 =
            (Сбой при загрузке программы: программа не найдена)
            TDREMOTE не может найти программу на своем диске. Эта ошибка
       происходить не должна, так как Турбо отладчик загружает программу
       на удаленную систему, если она там не найдена.
            Program load successful
            (Программа успешно загружена)
            TDREMOTE закончила загрузку программы для отладки.
            Reading file "имя" from Turbo Debugger
            (Считывание файла "имя" из Турбо отладчика)
            Турбо отладчиком передается файл.
            Unknown request: сообщение
            (Недопустимый запрос)
            TDREMOTE приняла недопустимый запрос из другой системы. Если
       связь работает нормально, это сообщение выводиться не должно. При
       получении данного сообщения проверьте,  в порядке ли кабель. Если
       сообщение все равно будет выводиться,  попробуйте уменьшить  ско-
       рость передачи (с помощью параметра -rs).
            Waiting for handshake (press Ctrl-Break to quit)
            (Ожидается установление связи,  для выхода  нажмите  клавиши
            Ctrl-Break)
            Программа TDREMOTE запущена и ждет взаимодействия с програм-
       мой другой системы.  Если до инициализации связи вы захотите вер-
       нуться в DOS, нажмите клавиши Ctrl-Break.

       TDeb 3.0 #3-3               = 152 =
                         Сообщения программы WREMOTE
       -----------------------------------------------------------------
            Ниже приведен перечень сообщений, которые вы можете получить


       при работе с программой WREMOTE.
            Can't find configuration file
            (Не найден файл конфигурации)
            Вы задали  в  параметре  командной  строки -c несуществующий
       файл.
            Can't load WINDEBUG.DLL
            (Невозможно загрузить файл WINDEBUG.DLL)
            Динамически компонуемая библиотека WINDEBUG.DLL не находится
       в текущем каталоге. Для работы WREMOTE эта библиотека необходима.
            Can't open COMx serial port
            (Не открывается последовательный порт COMx)
            WREMOTE пытается использовать порт COM,  который либо занят,
       либо не существует.
            Invalid switch
            (Неизвестный параметр)
            Вы задали нераспознаваемый программой WREMOTE  параметр  ко-
       мандной строки.
            No network present
            (Сеть отсутствует)

       TDeb 3.0 #3-3               = 153 =
               Приложение F. Подсказки и сообщения об ошибках
       -----------------------------------------------------------------
            Турбо отладчик выводит сообщения об ошибках и подсказки (ди-
       алоговые окна)  в  текущей  позиции курсора.  В данном приложении
       описываются генерируемые Турбо отладчиком подсказки, сообщения об
       ошибках и информационные сообщения.
            Мы расскажем  вам о том,  как нужно отвечать на сообщения об
       ошибках и подсказки.  Список сообщений (включая сообщения о сбоях
       при  инициализации) и подсказок приведен в алфавитном порядке и с
       соответствующим описаниями.
                                  Подсказки
       -----------------------------------------------------------------
            Турбо отладчик выводит подсказку (диалоговое окно), когда от
       вас требуется ввод дополнительной информации (для выполнения  ко-
       манды). В заголовке подсказки описывается, какая информация  тре-
       буется. В содержимом может выводиться протокол  (предыдущие отве-


       ты, которые вы ранее давали в ответ на подсказку).
            Отвечать на подсказку можно одним из следующих способов:
            - наберите ответ и нажмите клавишу Enter;
            - нажмите Esc для отмены подсказки и возврата в предшествую-
              щее меню.
            В некоторых  подсказках  возможен  только  выбор между двумя
       элементами (типа Да/Нет).  Для выбора нужного элемента можно  ис-
       пользовать клавиши управления курсором (стрелки),  а затем нажать
       Enter,  или непосредственно ввести ответ - Y (Да) или N (Нет) - и
       нажать  клавишу  Enter.  Отменить команду можно с помощью клавиши
       Esc.
            Более подробно действие клавиш при подсказке  описывается  в
       Главе 2.
            Перечислим подсказки в алфавитном порядке:
            Already recording, do you want to abort?
            (Уже записано, хотите выйти?)
            Вы уже записали клавиатурную макрокоманду. Нельзя начать за-
       пись другой макрокоманды,  пока вы не запишите текущую. Для прек-
       ращения  записи  макрокоманды нажмите Y (Да).  При ответе N (Нет)
       запись макрокоманды будет продолжена.
            Device error - Retry?
            (Ошибка устройства, повторить?)
            Произошла ошибка при записи на символьное устройство (напри-

       TDeb 3.0 #3-3               = 154 =
       мер,  на  принтер).  Это  может быть вызвано тем,  что принтер не
       подключен, выключен,  или на нем нет бумаги. Исправьте ситуацию и
       ответьте Y (при этом операция будет повторена) или N  (для отмены
       операции).
            Disk error on drive___ - Retry?
            (Ошибка диска, повторить?)
            При обращении к указанному диску произошла  ошибка. Возможно
       в дисковод не вставлен гибкий диск, или запорчена область винчес-
       тера.  Если поможет повтор операции,  ответьте Y (Да). Для отмены
       нажмите N.
            Edit watch expression
            (Редактирование выражения просмотра)


            Модифицируйте или  замените  выражение просмотра.  Подсказка
       инициализируется текущим (подсвеченным) выражением просмотра.
            Enter adress, count, byte value
            (Введите адрес, счетчик, байтовое значение)
            Введите адрес блока памяти,  которому  вы  хотите  присвоить
       конкретное байтовое значение,  затем число  байт,  которым  нужно
       присвоить это значение и само значение-заполнитель.
            Enter adress to position to
            ( Введите адрес, на который нужно позиционироваться)
            Введите адрес  блока  памяти который вы хотите просмотреть в
       своей программе. Вы можете ввести имя функции, номер строки, ука-
       затель  на память или абсолютный адрес (подробнее об этом расска-
       зывается в Главе 9).
            Enter animate delay (10ths of sec)
            (Введите задержку при автоматизированной работе (1/10 секун-
       ды))
            Задайте, с  какой  скоростью  требуется  выполнять   команду
       Animate (Автоматизировать). Чем больше значение, тем больше будет
       интервал между шагами выполнения.
            Enter code address to execute to
            (Введите адрес кода, до которого нужно выполнить программу)
            Введите адрес программы, по которому вы хотите остановить ее
       выполнение. Более подробно о вводе адресов рассказывается в Главе
       9.
            Enter comment to add to end of log
            (Введите комментарий для включение в конец протокола регист-
       рации)

       TDeb 3.0 #3-3               = 155 =
            Введите произвольную строку текста,  которая будет добавлена
       к  сообщениям,  выведенным в окне Log (Регистрация).  Текст будет
       выведен в том виде, как вы его наберете.
            Enter expression for conditional breakpoint
            (Введите выражение для условной точки останова)
            Введите выражение,  которое должно принимать истинное (нену-
       левое)  значение для срабатывания точки останова.  При выполнении


       программы данное выражение будет вычисляться каждый раз при обна-
       ружении точки останова. При этом нужно учитывать возможные побоч-
       ные эффекты вычисления выражения.
            Enter expression to watch
            (Введите выражение для просмотра)
            Введите имя  переменной или выражение,  значение которого вы
       хотите наблюдать в окне Watch  (Просмотр).  Если  хотите,  можете
       ввести выражение, которое не ссылается на ячейку памяти, например
       x * y + 4. Если диалоговое окно инициализируется из текстовой об-
       ласти,  то вы можете воспринять запись, нажав клавишу Enter, либо
       изменить ее или ввести что-то совсем другое.
            Enter inspect start index, range
            (Введите первый индекс для проверки, диапазон)
            Введите индекс  первого элемента массива,  который вы хотите
       просмотреть.  За индексом укажите число просматриваемых элементов
       массива (разделив их пробелом или запятой).
            Enter instruction to assemble
            (Введите инструкцию для ассемблирования)
            Введите инструкцию Ассемблера для замены инструкции по теку-
       щему адресу в области кода. Список инструкций и ключевых слов Ас-
       семблера содержится в одном из приложений. Более подробно о языке
       Ассемблера рассказывается в Главе 12.
            Enter log file name
            (Введите имя файла регистрации)
            Введите имя файла,  в который вы хотите записывать регистри-
       руемую информацию. Все строки регистрации в том виде, как они вы-
       водятся в соответствующем окне,  будут записываться  в  указанный
       файл до выполнения команды Close (Закрыть). По умолчанию файл бу-
       дет иметь расширение .LOG и имя,  совпадающее с именем отлаживае-
       мой  программы.  Для  этого можно просто нажать клавишу Enter.  В
       противном случае наберите новое имя.
            Enter memory adress, count
            (Введите адрес в памяти, счетчик)


            Введите один адрес в памяти, за которым следует необязатель-

       TDeb 3.0 #3-3               = 156 =
       ные запятая и число элементов,  которые вы хотите очистить. Можно
       использовать имя идентификатора или полное выражение.
            Enter name оf configuration file
            (Введите имя файла конфигурации)
            Введите имя  файла  конфигурации для чтения или записи.  При
       чтении из файла можно вводить трафаретные символы (маску) и полу-
       чить список соответствующих им файлов для выбора.
            Enter name of file to view
            (Введите имя файла для просмотра)
            Для получения  списка  файлов  для выбора можно использовать
       трафаретные символы DOS (* и ?),  либо ввести  для  загрузки  имя
       конкретного файла.
            Enter new bytes
            (Введите новые байты)
            Введите список байт,  которые заменят байты в позиции файла,
       отмеченной  курсором.  Полное  описание  списка байт содержится в
       Главе 9.
            Enter a new coprocessor register value
            (Введите новое значение регистра сопроцессора)
            Введите новое значение для текущего (подсвеченного) регистра
       арифметического сопроцессора. Для генерации нового значения можно
       ввести  полное  выражение.  Оно  будет преобразовано в правильный
       формат с плавающей точкой и загружено в регистр.
            Enter new data bytes
            (Введите новые байты данных)
            Введите байтовый список в позиции сегмента, отмеченных кур-
       сором. Полное описание списка байт содержится в Главе 9.
            Enter new directory
            (Введите новый каталог)
            Введите новое  имя каталога или диска,  которые должны стать
       текущими.
            Enter new file offset
            (Введите новое смещение в файле)
            Вы просматриваете  файл  на  диске в шестнадцатиричном виде.
       Если вы вводите номер строки, превышающий число строк в файле, то


       увидите последнюю строку в файле.  Строки нумеруются с 1. Текущий
       номер строки,  где расположен курсор, соответствует первой строке
       в окне Module (Модуль).

       TDeb 3.0 #3-3               = 157 =
            Enter new line number
            (Введите номер новой строки)
            Введите номер строки,  которую вы хотите просмотреть в теку-
       щем модуле. Если этот номер превышает число строк в файле, то вы-
       ведется последняя строка файла. Номера строк начинаются с 1 (пер-
       вая строка  файла.  Текущая  строка,  на  которой  позиционирован
       курсор, выводится в качестве первой строки окна Module.
            Enter new relocation segment value
            (Введите новое значение перемещаемого сегмента)
            Введите выражение  на текущем языке.  Оно будет использовано
       для задания адреса базового сегмента таблицы идентификаторов, ко-
       торую  вы загрузили с помощью команды File¦Symbol Load (Файл¦Заг-
       рузка таблицы идентификаторов).  При вычислении вводимого выраже-
       ния должно получаться значение номера сегмента в начале кода, для
       которого вы загружаете таблицу идентификаторов.
            Enter new selector
            (Введите новый селектор)
            Введите значение селектора,  который вы хотите сделать теку-
       щим. Вы можете ввести фактическое шестнадцатиричное  значение или
       значение сегментного регистра (CS, DS или ES).
            Enter new value
            (Введите новое значение)
            Введите новое значение для текущего (подсвеченного) регистра
       ЦП. Для  форматирования нового значение можно ввести полное выра-
       жение.
            Enter port number
            (Введите номер порта)
            Введите номер порта ввода-вывода,  из которого нужно  выпол-
       нить чтение. Допустимые номера - от 0 до 65535.
            Enter port number, value to output
            (Введите номер порта и значение для вывода)


            Введите номер порта ввода-вывода,  в который нужно выполнить
       запись,  и значение для записи,  разделив эти два выражения запя-
       той. Допустимые номера - от 0 до 65535.
            Enter program name to load
            (Введите имя программы для загрузки)
            Введите имя отлаживаемой  программы.  Для  получения  списка
       файлов для выбора можно использовать трафаретные символы DOS, ли-
       бо ввести имя конкретного файла для загрузки. Если вы не указыва-
       ете расширения,   подразумевается  расширение  .EXE  (выполняемый

       TDeb 3.0 #3-3               = 158 =
       файл).
            Enter read file name
            (Введите имя файла для чтения)
            Введите имя  файла  или спецификацию с использованием трафа-
       ретных символов, который вы хотите считать в память. Если вы вве-
       дете  трафаретную  спецификацию или по умолчанию используете *.*,
       то выведется список файлов для выбора.
            Enter search bytes
            (Введите байты для поиска)
            Введите список байт для поиска,  начиная с текущей позиции в
       памяти, отмеченной курсором. Подробнее о списках байт рассказыва-
       ется в Главе 9.
            Enter search instruction or bytes
            (Введите инструкцию или байты для поиска)
            Введите инструкцию (для команды  локального  меню  Assemble)
       или байтовый список (для команды локального меню  Search  (Поиск)
       области данных).
            Enter search string
            (Введите строку для поиска)
            Введите символьную строку для поиска. Для выявления неточных
       соответствий  можно использовать простые трафаретные символы (* -
       один или более символов, ? - один символ).
            Enter set breakpoint at code address
            (Введите адрес в программе для задания точки останова)
            Введите адрес программы,  по которому вы  хотите  установить
       точку  останова.  Более подробно о вводе адресов рассказывается в


       Главе 9.
            Enter source address, destination, count
            (Введите исходный, целевой адрес и значение счетчика)
            Введите адрес блока,  который вы хотите  переместить,  число
       перемещаемых байт и адрес, куда их нужно переместить. Все три вы-
       ражения разделяются запятыми.
            Enter source directory path
            (Введите маршрут исходных файлов)
            Введите список каталогов, разделив их точками с запятой. По-
       иск  исходных файлов в этих каталогах будет выполняться в том по-
       рядке, как они указаны.
            Enter symbol table name

       TDeb 3.0 #3-3               = 159 =
            (Введите имя таблицы идентификаторов)
            Введите имя таблицы идентификаторов для загрузки ее с диска.
       Обычно  эти  файлы имеют расширение .TDS.  Расширение имени файла
       нужно указывать явно.
            Enter tab column spacing
            (Введите размер табуляции)
            Введите число от 1 до 32,  которое задает позицию  табуляции
       при  выводе Турбо отладчиком файлов в окне File (Файл) или Module
       (Модуль).
            Enter valiable to inspect
            (Введите переменную для проверки)
            Введите имя переменной или выражение, содержимое которого вы
       хотите проверить.  Если  подсказка  инициализируется  из  области
       текста,  то вы можете использовать выведенное имя,  нажав клавишу
       Enter, или полностью набрать новую запись.
            Enter variable to inspect
            (Введите переменную для проверки)
            Введите имя переменной или выражение, содержимое которого вы
       хотите проверить в качестве массива. Если подсказка инициализиру-
       ет  из области текста,  то вы можете использовать выведенное имя,
       нажав клавишу Enter, или полностью набрать новую запись.
            Enter write file name
            (Введите имя файла для записи)
            Введите имя файла, в которых вы хотите записать блок памяти.


            Overwrite__?
            (Затереть?)
            Вы задали имя файла, который уже существует. Вы можете зате-
       реть старое содержимое этого файла, заменив его новым, либо отме-
       нить данную команду и оставить старое содержимое без изменений.
            Overwrite existing macro or selected key?
            (Перезаписать существующую макрокоманду или выбранную клави-
            шу?)
            Вы нажали клавишу для записи макрокоманды, а ей уже присвое-
       на макрокоманда. Если вы хотите отменить существующую макрокоман-
       ду, нажмите Y (Да). Для отмены команды нажмите N (Нет).
            Pick a method name
            (Выбор имени метода)
            Вы задали имя подпрограммы,  которая ссылается более чем  на

       TDeb 3.0 #3-3               = 160 =
       один метод в объекте. Выберите корректный метод из списка имен.
            Pick a module
            (Выбрать модуль)
            Выберите имя  модуля,  который  вы хотите просмотреть в окне
       Module (Модуль). Вам будет выведен список всех модулей программы.
       Для просмотра файла,  который не является модулем программы,  ис-
       пользуйте команду меню View¦File (Обзор¦Файл).
            Pick a name
            (Выберите имя)
            Выверите имя  из списка выведенных на экран идентификаторов.
       Вы можете начать ввод имени и автоматически  позиционироваться на
       первый символ, соответствующий тому, что вы уже набрали.
            Pick a source file
            (Выберите исходный файл)
            Выберите исходный  файл  из  выведенного  списка  (выводятся
       только исходные файлы, входящие в текущий программный модуль).
            Pick a window
            (Выберите окно)
            Выберите окно из списка заголовков активных окон.
            Pick macro to delete
            (Выберите макрокоманду для удаления)
            Выберите клавишу  или сочетание клавиш макрокоманды, которую
       вы ходите удалить.  Клавиша получит первоначальное функциональное


       значение (которое было до макрокоманды).
            Press key to assign macro to
            (Нажмите клавишу, которой будет присвоена макрокоманда)
            Нажмите клавишу,  которой  вы хотите присвоить макрокоманду.
       Затем нажмите клавиши для формирования последовательности команд,
       которую  вы  хотите присвоить данной клавише.  Эта последователь-
       ность будет выполняться в том виде, как вы ее введете. Для завер-
       шения  последовательности  и записи макрокоманды нажмите клавишу,
       которой вы присваиваете макрокоманду.  Данная макрокоманда  будет
       записана  на диске наряду с другими клавиатурными макрокомандами.
            Program already terminated; reload?
            (Программа завершила работу. Перезагрузить?)
            Вы пытаетесь запустить или выполнить  шаг  программы,  когда
       она уже завершила работу.  Если вы ответите Y (Да), программа бу-
       дет перезагружена.  Если вы ответите N (Нет) она перезагружена не
       будет, и выполнять ее нельзя.

       TDeb 3.0 #3-3               = 161 =
            Program out of date on remote; send over link?
            (На удаленной системе находится старая версия программы. Пе-
            редать ее по линии связи?)
            Вы запустили Турбо отладчик с удаленной связью, а программа,
       которую вы хотите отладить,  либо отсутствует на удаленной систе-
       ме,  либо там находится более старая ее версия,  чем на  основной
       системе. Если вы ответите Y (Да), программа будет передана по ли-
       нии связи.  При ответе N (Нет) вы выйдите из команды.  При работе
       медленной скоростью обмена вы можете предпочесть перенос програм-
       мы через гибкий диск.  При максимальной скорости обмена время пе-
       редачи эквивалентно времени записи на гибкий диск.
            Reload program so arguments take effect?
            (Перезагрузить программу, чтобы начали действовать аргументы
            командной строки?)


            Вы изменили для отлаживаемой программы  аргументы  командной
       строки.  Если вы ответите положительно, ваша программа перезагру-
       зится и вернется в началу. Обычно это желательно делать после из-
       менения аргументов, так как программы, написанные с использовани-
       ем компиляторов фирмы Borland,  считывают аргументы  только  один
       раз при загрузке программы.  Все последующие изменения аргументов
       не окажут влияния на программу, пока вы ее не перезапустите.

       TDeb 3.0 #3-3               = 162 =
                                   Ошибки
       -----------------------------------------------------------------
            Турбо отладчик использует сообщения об ошибках,  чтобы сооб-
       щить вам о непредвиденных ситуациях. Иногда введенная вами коман-
       да не может быть обработана, в других случаях сообщения уведомля-
       ет вас, что что-то происходит не так, как вы ожидаете.
            Обычно вывод сообщений  об  ошибке  сопровождается  звуковым
       сигналом. Вы можете выключить его, используя командную строку DOS
       при запуске Турбо отладчика,  или сделать это с помощью программы
       установки TDINST.
                              Фатальные ошибки
       -----------------------------------------------------------------
            Все фатальные ошибки приводят к выходу из отладчика и  возв-
       рату  в DOS.  Некоторые такие ошибки являются результатом запуска
       отладчика из среды DOS.  В других случаях они могут возникать при
       появлении  неисправимых ситуаций в системе во время использования
       отладчика.  В любом случае ситуацию можно исправить только устра-
       нением причины сбоя и перезапуском отладчика.
            Bad configuration file
            (Плохой файл конфигурации)
            Файл конфигурации  либо  запорчен,  либо  не является файлом
       конфигурации Турбо отладчика, либо относится к его другой версии.
            Could not create dummy PSP segment


            ( Невозможно создать пустой префикс программного сегмента)
            При запуске виртуального отладчика TD386 и отсутствия загру-
       женной программы пустая программа выполняться не может. Попробуй-
       те запустить его с программой для загрузки.
             Fatal EMS error
             (Фатальная ошибка EMS)
            Драйвер памяти EMS (расширитель памяти) возвращает состояние
       невосстановимой ошибки. Аппаратура EMS неверно функционирует, ли-
       бо повреждено программное обеспечение драйвера.
            Перезагрузите систему и  повторите  попытку.  Если  ситуация
       сохраняется, проверьте аппаратуру EMS.
            Invalid switch:___
            (Недопустимый параметр)
            В командной  строке DOS вы указали недопустимый параметр-пе-
       реключатель. Список всех возможных параметров содержится в  соот-
       ветствующем приложении,  а  подробно о них рассказывается в одной
       из глав данного руководства.

       TDeb 3.0 #3-3               = 163 =
            Not enough memory
            (Недостаточно памяти)
            Турбо отладчик  при обработке вашей команды превысил границы
       рабочей памяти.
            Old configuration file
            (Старый файл конфигурации)
            Вы пытаетесь запустить Турбо отладчик с  файлом конфигурации
       из  предыдущей  версии.  Для  данной версии Турбо отладчика нужно
       создать новый файл конфигурации.
            Remote link timeout
            (Тайм-аут удаленной связи)
            Нарушена связь с удаленной системой.  Попытайтесь перезагру-
       зить обе системы и начните снова.  Если ситуация сохраняется, об-
       ратитесь к главе, где рассказывается об удаленной отладке.
            Unsupported video adapter
            (Неподдерживаемый тип видеоадаптера)
            Турбо отладчик не может определить,  какой тип видеоадаптера
       вы  используете.  Поддерживаются  следующие типы адаптеров:  MDA,
       CGA, EGA, VGA, MCGA, Hercules, Compaq composite, AT&T и совмести-


       мые с ними.
            Wrong version of remote driver
            (Неверная версия утилиты удаленного драйвера)
            На удаленной  системе  работает несовместимая версия утилиты
       TDREMOTE или WREMOTE. Нужно использовать одну версию Турбо отлад-
       чика и программ TDREMOTE или WREMOTE.

       TDeb 3.0 #3-3               = 164 =
                            Сообщения об ошибках
       -----------------------------------------------------------------
           ')' expected
            (Нужна закрывающая круглая скобка ')')
            При вычислении выражения обнаружено, что пропущена закрываю-
       щая скобка. Это происходит, если правильно сформированное выраже-
       ние начинается с левой квадратной скобки и не заканчивается  пра-
       вой (закрывающей) скобкой, например:
            3 * (7 + 4
       вместо
            3 * (7 + 4)
           ':' expected
            (Нужно двоеточие)
            При вычислении выражения языка Си был  обнаружен  символ  ?,
       разделяющий  первые  два выражения тернарной операции ?:,  однако
       соответствующего двоеточия не найдено.
            Например:
               x < 0 ? 4 6
            Следует записать:
               x < 0 ? 4 : 6
           ']' expected
            (Нужна закрывающая квадратная скобка ']')
            При вычисления выражения была обнаружена  открывающая  квад-
       ратная  скобка  индексного  выражения массива без соответствующей
       закрывающей скобки. Например:
            table[4
       вместо
            table[4]
            Эта ошибка может возникать также при вводе инструкций встро-
       енного  Ассемблера (когда в скобках при обращении к памяти указы-
       вается базовый или индексный регистр). Например:
            mov ax,4[si
       вместо

       TDeb 3.0 #3-3               = 165 =
            mov ax,4[si]
           Already logging to a file
            (Файл регистрации уже открыт)
            Вы дали команду Open log file при уже открытом файле регист-


       рации, который не был еще закрыт командой Close log file. Если вы
       хотите открыть другой файл регистрации, закройте сначала текущий.
           Ambiguous symbol name
            (Неоднозначное имя идентификатора)
            Вы ввели в выражении имя идентификатора,  которое не иденти-
       фицирует уникальным образом метод в языке С++ или объект в Паска-
       ле.  При этом вы не выбираете из списка корректное имя. Перед вы-
       числением выражения вам нужно выбрать корректное имя из выводимо-
       го списка.
           Bad or mission configuration file name
            (Неверное или пропущенное имя файла конфигурации)
            В параметре командной строки  -с при запуске Турбо отладчика
       вы задали неверное имя файла конфигурации.
           Cannot access an inactive scope
            (Доступ к неактивной области действия не разрешается)
            В окне Module вы ввели выражение или указатель  на  перемен-
       ную,  которая не находится в активной функции. Переменные в неак-
       тивных функциях имеют неопределенное значение,  поэтому вы не мо-
       жете  использовать их в выражениях или просматривать их значения.
           Cannot be changed
            (Этот идентификатор изменить нельзя)
            Вы пытаетесь изменить идентификатор,  который изменить нель-
       зя. Непосредственно изменять можно только скаляры (типы int, long
       и т.д.  в языке Си, integer, longint и строки в Паскале) и указа-
       тели. Если  вы хотите изменить структуру или массив,  нужно изме-
       нять каждый их элемент отдельно.
           Can't do this when Turbo Debugger is resident
            (Когда Турбо отладчик загружен резидентно,  сделать это  не-
            возможно)
            Вы пытаетесь   выполнить   операцию,   такую  как  File¦Load
       (Файл¦Загрузка или Run¦Program Reset  (Выполнение¦Сброс  програм-
       мы), что невозможно при резидентной загрузке Турбо отладчика.
           Can't do this when user program is resident


            ( Когда программа пользователя загружена  резидентно, сделать
            это невозможно)

       TDeb 3.0 #3-3               = 166 =
            Вы пытаетесь  выполнить  операцию,  такую  Run¦Program Reset
       (Выполнение¦Сброс программы),  что невозможно, когда отлаживаемая
       вами программа стала резидентной.
           Can't execute DOS command processor
            (Невозможно выполнить командный процессор DOS)
            Не хватает памяти для выполнения командного  процессора DOS,
       либо он не найден.  Убедитесь,  что переменная операционной среды
       COMSPEC правильно определяет, где можно найти командный процессор
       DOS.
           Can't go resident until user program terminates
            (Пока программа пользователя не завершит работу, резидентная
            загрузка невозможна)
            Вы пытаетесь сделать Турбо отладчик резидентным до того, как
       отлаживаемая вами программа сама стала резидентной.  Турбо отлад-
       чик может стать резидентным только тогда, когда программа не заг-
       ружена или когда загруженная программа выполнена и завершила  ра-
       боту.
           Can't set a breakpoint at this address
            (По этому адресу нельзя задать точку останова)
            Вы пытаетесь установить точку останова в области ПЗУ,  в не-
       существующей памяти или в сегменте 0.  Просмотреть программу, вы-
       полняющуюся в ПЗУ,  можно только с помощью команды Run¦Trace (Вы-
       полнение¦Трассировка) и отработке инструкций по шагам.
           Can't set any more hardware breakpoints
            (Нельзя больше установить аппаратные точки останова)
            Вы не можете установить еще одну аппаратную  точку останова,
       не  удалив  предварительно уже имеющуюся.  В различных аппаратных
       отладчиках поддерживается разное число и типы точек останова.
           Can't set hardware condition on this breakpoint
            (Для данной точки останова нельзя установить аппаратное  ус-


            ловие)
            Вы пытаетесь установить аппаратное условие срабатывания точки
       останова, которая не является глобальной. Такие условия можно за-
       давать только для глобальных точек останова.
           Can't have more then one segment override
            (Более одного переопределения сегмента не допускается)
            Вы пытаетесь ассемблировать инструкцию,  в которой оба  опе-
       ранда имеют переопределение сегмента.  Иметь переопределение сег-
       мента может только один операнд, например:
            mov es:[bx],ds:1

       TDeb 3.0 #3-3               = 167 =
       а следует записать:
            mov es:[bx],1
       или
            mov ax,[1]
            mov es:[bx],ax
           Can't set a breakpoint at this location
            (Точку останова по этому адресу установить нельзя)
            Вы пытаетесь установить точку останова в ПЗУ, несуществующей
       памяти или в сегменте 0. Единственный способ просмотреть програм-
       му, выполняющуюся  в  ПЗУ  -  это использование команды Run¦Trace
       Into (Выполнение¦Трассировка вглубь) для наблюдения по одной инс-
       трукции.
           Can't set that sort of hardware breakpoint
            (Аппаратную точку останова данного типа установить нельзя)
            Драйвер устройства, установленный в файле CONFIG.SYS, не мо-
       жет работать с точкой останова с  таким  сочетанием  типа  цикла,
       сравнения с адресом или данными, которые вы задали.
           Can't set hardware condition on this breakpoint
            (Для  данной точки останова нельзя установить аппаратное ус-
            ловие)
            Вы пытаетесь задать аппаратное условие для  точки  останова,
       которая не является глобальной. Аппаратные условия можно устанав-
       ливать только для глобальных точек останова.
           Can't swap user program to disk
            (Невозможно сбросить программу пользователя на диск)
            Вы дали команду,  в которой  требуется,  чтобы  отлаживаемая


       программы была записана на диск, но не текущем диске для этого не
       хватает места. Нужно освободить достаточно места на  диске. Сброс
       программы  на  диск требуется при выполнении команды меню File¦OS
       Shell (Файл¦Командный процессор операционной системы) или команды
       Edit (Редактирование) области текста.
           Constructors and destructors cannot be called
            (Вызов конструкторов и деструкторов не допускается)
            Если вы пытаетесь отлаживать программу,  которая  использует
       эти объекты, то выводится сообщение об ошибке. Возможно вы пытае-
       тесь вычислить метод объекта,  являющийся конструктором или дест-
       руктором. Это не допускается.
           Count value too large

       TDeb 3.0 #3-3               = 168 =
            (Значение счетчика слишком велико)
            В области данных в окне CPU в одной из локальных команд  ра-
       боты с блоками вы ввели слишком большую длину блока. Размер блока
       не может превышать FFFFFh.
           Ctlr-Alt-SysRq interrupt. System crash possible. Continue?
            (Прерывание по Ctrl-Alt-Sysrq.  Возможен сбой системы.  Про-
            должить?)
            Вы пытаетесь выйти из TDW или перезагрузить  свою прикладную
       программу во время приостановки программы по нажатию клавиш Ctrl-
       Alt-SysRq.  Поскольку в момент приостановки программы  выполнялся
       код ядра Windows,  выход из TDW или перезагрузка прикладной прог-
       раммы будет иметь непредсказуемые результаты  (наиболее  вероятно
       "зависание" системы,  после чего потребуется последующая перезаг-
       рузка).
            Если это возможно,  установите в программе  точку  останова,
       которая  приведет  к  выходу в TDW,  а затем снова запустите вашу
       программу.  Когда программа обнаруживает точку останова и выходит
       в TDW,  вы можете завершить работу TDW или перезагрузить програм-
       му.
           Destination too far away


            (Целевой адрес слишком далеко)
            Вы пытаетесь  ассемблировать  инструкцию условного перехода,
       целевой адрес которой отстоит слишком далеко от  текущего адреса.
       Целевой  адрес  инструкции условного перехода должен находиться в
       пределах -128 и +127 байт от самой инструкции.
           Divide by zero
            (Деление на 0)
            В выражениях  с  операциями деления (/,  div) или операциями
       mod и %  правая часть выражения при вычислении становится  равной
       0.  Поскольку  в  этом случае операции будут иметь неопределенное
       значение, выводится сообщение об ошибке.
           DLL already in list
            (DLL уже есть в списке)
            В диалоговом  окне  View¦Modules (Обзор¦Модули) вы пытаетесь
       добавить DLL к списку DLL & Programs (Программы и DLL), но библи-
       отека DLL уже находится в списке.
           Edit program not specified
            (Редактирование программы не задано)
            Вы пытаетесь использовать команду локального меню Edit  (Ре-
       дактирование) окна Module  (Модуль) или Disk File (Файл на диске),
       но при использовании программы установки команда инициализации ре-

       TDeb 3.0 #3-3               = 169 =
       дактора не была задана.
           Error loading program
            (Ошибка при загрузке программы)
            DOS не  может загрузить заданную программу.  Это может озна-
       чать,  что заданный вами файл не является допустимым файлом .EXE,
       или что он запорчен.
           Error opening file___
            (Ошибка при открытии файла)
            Турбо отладчик  не  может  открыть  файл,  который вы хотите
       просмотреть в окне File (Файл).
           Error opening log file___
            (Ошибка открытия файла регистрации)
            Имя файла,  указанное в команде локального меню Log To  File
       (Файл  регистрации)  открыть нельзя.  Это может означать,  что не
       хватает места для создания файла,  либо диск, маршрут доступа или


       имя  файла являются недопустимыми.  Освободите место на диске или
       задайте правильную спецификацию.
           Error reading block into memory
            (Ошибка при считывании блока в память)
            Заданный блок нельзя считать из файла в память. Возможно  вы
       указали счетчик  байт,  значение  которого превышает число байт в
       файле.
           Error saving configuration
            (Ошибка при сохранении конфигурации)
            Турбо отладчик  не может записать на диск файл конфигурации.
       Убедитесь, что на диске есть свободное место.
           Error swaping in user program, press key to load
            (Ошибка при свопинге программы  пользователя,  для  загрузки
            нажмите клавишу)
            После свопинга  (сброса) вашей программы на диск,  чтобы вы-
       полнить другую программу,  Турбо отладчик не может  перезагрузить
       ваша  программу.  Вероятнее  всего это означает,  что вы случайно
       удалили на диске файл свопинга (SWAP.$$$).  Единственное, что мо-
       жет  сделать  отладчик - это перезагрузить программу (как при ис-
       пользовании команды File¦Open (Файл¦Открыть)).
           Error writing block on disk
            (Ошибка записи блока на диск)
            Заданный вами блок нельзя записать в заданный файл. Возможно
       вы  определили счетчик,  значение которого превышает имеющийся на

       TDeb 3.0 #3-3               = 170 =
       диске объем свободного пространства.
           Error writing log file
            (Ошибка при записи файла регистрации)
            Произошла ошибка при накоплении информации из окна регистра-
       ции. Вероятно, ваш диск переполнен.
           Error writing to file
            (Ошибка записи в файл)
            Турбо отладчик не может записать изменения обратно  в  файл.
       Возможно  файл помечен,  как доступный только по чтению,  или при
       записи на диск произошла ошибка.
           Expression too complex
            (Слишком сложное выражение)


            Указанное вами выражение слишком сложно.  Нужно задать выра-
       жение с меньшим числом операндов и операций.  Оно может содержать
       до  64  операций и операторов.  Операндами могут быть,  например,
       константы или имена переменных.
           Expressions with side effects not permitted
            (Выражения с побочными эффектами не допускаются)
            Вы ввели выражение,  которое модифицирует ячейку памяти  при
       его  вычислении.  Когда Турбо отладчику требуется повторно вычис-
       лять выражение (например,  когда он находится в  окне  Instructor
       (Проверка) или Watches (Просмотр)), такой тип выражений использо-
       вать нельзя.
           Extra input after expression
            (Лишние данные после выражения)
            Вы ввели допустимое выражение, но после него содержится лиш-
       ний текст.  Иногда это показывает, что в выражении пропущена опе-
       рация.
            Например, введено:
               3 * 4 + 5 2
       а нужно ввести:
               3 * 4 + 5 / 2
       или
               add     ax,4 5
       а нужно записать:

       TDeb 3.0 #3-3               = 171 =
               add     ax,45
           Help file ___ not found
            (Не найден справочный файл)
            Вы запросили вывод справочной информации, но отладчик не мо-
       жет найти на диске файл,  ее содержащий. Убедитесь, что этот файл
       находится в том же каталоге, что и программа отладчика.
           Illegal procedure or function call
            (Недопустимая процедура или вызов функции)
            Вы пытаетесь вычислить функцию в то время,  когда не  можете
       этого сделать. Это может произойти в следующих случаях:
            - вы пытаетесь вызвать функцию,  которая находится в оверлее
              Паскаля;
            - вы пытаетесь вызвать функцию, в то время как текущий адрес
              программы находится в оверлее Паскаля;
            - вы  пытаетесь вызвать метод объектно-ориентированного Пас-


              каля, который удален эффективным компоновщиком Паскаля;
           Immediate operand out of range
            ( Выход за границы диапазона непосредственного операнда)
            Вы ввели инструкцию в байтовым операндом в сочетании  с  не-
       посредственным операндом, превышающим байт.
            Например:
               add BYTE PTR[bx],300
            Следует записать:
               add     WORD PTR[bx],300
           Initialization not complete
            (Инициализация не завершена)
            В программе  вы  пытаетесь  обратиться к переменной до того,
       как сегмент данных будет соответствующим образом  настроен  кодом
       инициализации компилятора. Вы должны обеспечить выполнение до на-
       чала исходного кода программы кода инициализации  компилятора,  и
       только после этого можно обращаться к большинству переменных.
           Invalid argument list
            (Недопустимый список аргументов)
            Введенное вами  выражение содержит вызов процедуры или функ-
       ции,  в котором не сформирован должным образом список аргументов.
       Список аргументов начинается с левой скобки, содержит 0 или более

       TDeb 3.0 #3-3               = 172 =
       разделенных запятыми выражений,  и заканчивается правой  скобкой.
       Заметим,  что  при вызове процедуры или функции Турбо Паскаля без
       параметров нужно указывать пустые скобки. Например:
            myfunc(1,2 3)
       а нужно
            myfunc(1,2,3)
       или
            myfunc()
           Invalid character constant
            (Недопустимая символьная константа)
            Введенное вами выражение содержит неправильно сформированную
       символьную константу. Символьная константа содержит одинарную ка-
       вычку  (')  за которой следует один символ,  и завершается другой
       одинарной кавычкой. Например:
            'A = 'a'
       а нужно
            'A' = 'a'
           Invalid format string
            (Неверная строка формата)


             После выражения вы ввели строку формата,  но задали неверную
       строку. Более подробно об этом рассказывается в Главе 9.
           Invalid function parameter(s)
            (Недопустимый параметр функции)
            Вы пытаетесь вызвать в выражении функцию,  но не указали при
       вызове функции нужных параметров.
           Invalid instruction
            (Недопустимая инструкция)
            Вы ввели  для ассемблирования инструкцию с допустимой мнемо-
       никой, но недопустимым операндом. Инструкция состоит из мнемоники
       инструкции, за которой следуют необязательные аргументы,  но ука-
       занные аргументы недопустимы. Обычно подобное сообщение выводится
       при попытке ассемблировать инструкцию POP CS.
           Invalid instruction mnemonic
            (Недопустимая мнемоника инструкции)
            Вы ввели  для ассемблирования инструкцию с недопустимой мне-
       моникой.  Инструкция состоит из мнемоники инструкции,  за которой

       TDeb 3.0 #3-3               = 173 =
       следуют необязательные аргументы, например:
               AX,123
       следует записать:
               mov AX,123
           Invalid number entered
            (Введен недопустимый номер)
            В окне File или Module вы ввели недопустимый номер для пере-
       хода (с помощью команды Goto).  Число должно иметь допустимый де-
       сятичный формат и быть больше нуля.
           Invalid operand(s)
            (Недопустимые операнды)
            Инструкция, которую вы  пытаетесь  ассемблировать,  содержит
       один или более недопустимых операндов. Например, в инструкции MOV
       не допускается указывать два операнда со ссылкой на память, в не-
       которые инструкции работают только с операндами размером в слово.
           Invalid operator/data combination
            (Недопустимое сочетание операция/данные)
            Вы ввели выражение, в котором в операции указан операнд, над
       которым нельзя выполнить данную операцию.  Например, делается по-


       пытка умножить константу на адрес функции в вашей программе.
           Invalid pass count entered
            (Введен недопустимый счетчик проходов)
            Вы ввели для точки останова счетчик проходов, который не на-
       ходится в диапазоне от 1 до 65535.  Значение  счетчика  не  может
       быть  равно  0.  Если  при выполнении программы значение счетчика
       равно 1, то данная точка останова сработает при ее первом обнару-
       жении.
           Invalid register
            (Недопустимый регистр)
            В ассемблируемой  инструкции вы указали недопустимый регистр
       с плавающей точкой.  Регистр с плавающей точкой состоит из  букв,
       за  которыми  следует  необязательное  число  от 0 до 7 в круглых
       скобках, например ST, ST(4).
           Invalid register combination in address expression
            (Недопустимое сочетание регистров в адресном выражении)
            При вводе инструкции для ассемблирования вы указали операнд,
       который не содержит одно из допустимых сочетаний базового  и  ин-
       дексного регистра. Адресное выражение может содержать базовый ре-

       TDeb 3.0 #3-3               = 174 =
       гистр,  индексный регистр,  или и тот,  и другой.  Базовыми могут
       быть регистры BX и BP, а индексными - SI и DI. Допускаются следу-
       ющие их сочетания:
                    BX      BX+SI
                    BP      BP+SI
                    DI      BX+DI
                    SI      BP+DI
           Invalid register in address expression
            (Недопустимый регистр в адресном выражении)
            Вы ввели для ассемблирования инструкцию,  в которой в адрес-
       ном  выражении в квадратных скобках используется недопустимый ре-
       гистр.  В адресных выражениях можно использовать только  регистры
       BX, BP, SI и DI.
           Invalid symbol in operand
            (Недопустимый символ в операнде)
            При вводе инструкции для ассемблирования вы начали операнд с


       символа, с которого он не может начинаться (например, :).
           Invalid type cast
            (Недопустимое приведение типа)
            Вы ввели выражение, которое содержит некорректно формируемое
       приведение типа. Корректное назначение типа в языке Си начинается
       с левой (открывающей) скобки,  содержит возможно сложные данные с
       описанием  типа  (включая  имя переменной) и заканчивается правой
       (закрывающей) скобкой. Например:
               (x *)p
       а следует записать:
               (struct x *)p
            Корректное назначение типа в Паскале начинается с известного
       типа данных, затем левой скобки, выражения, и правой скобки. Нап-
       ример:
                Longint(p)
       или
                Word(p^)
           Invalid value entered
            (Введено недопустимое выражение)
            (Только для Си и Ассемблера.) Введенное  вами  выражение  на
       зыке  Си содержит ключевое слово там,  где ожидается имя перемен-
       ной.  Ключевые слова можно использовать только как часть операций
       приведения типа (за исключением специальной операции sizeof).

       TDeb 3.0 #3-3               = 175 =
            Например:
               floatval = char charval
       а следует записать:
               floatval = (char)charval
           Keyword not a symbol
            (Это ключевое слово, а не идентификатор)
            (Только для  Си  и Ассемблера.) Введенное выражение языка Си
       содержит ключевое слово там, где требуется указывать имя перемен-
       ной.  Ключевые слова допускается указывать только в операции при-
       ведения типа,  за исключением специальной операции sizeof. Напри-
       мер:
               floatval = char charval
       а следует записать:
               floatval = (char)charval
           Left side not a record, structure or union
            (Левая часть не является записью, структурой или объединени-
            ем)
            Вы ввели выражение,  содержащее один  из  селекторов  выбора


       элемента структуры на Си (.  или ->) или квалификатор поля записи
       Паскаля (.).  Однако перед этим идентификатором  не  указано  имя
       структуры  или  записи и не содержится указатель на структуру или
       запись.
           No coprocessor or emulator installed
            (Сопроцессор или эмулятор не установлены)
            Вы пытаетесь  с  помощью команды основного меню View¦Numeric
       Processor (Обзор¦Арифметический сопроцессор) открыть окно Numeric
       processor (Арифметический сопроцессор),  но плата арифметического
       сопроцессора в вашей системе не установлена, а отлаживаемая прог-
       рамма не использует программный эмулятор.
           No hardware debugging avaliable
            (Средства аппаратной отладки недоступны)
            Вы пытаетесь установить точку останова, для которой требует-
       ся аппаратная поддержка, но драйвер устройства для аппаратной от-
       ладки не установлен (либо драйвер не может найти необходимые  ап-
       паратные средства).
           No help for this context
            (Для этого контекста справочной информации нет)

       TDeb 3.0 #3-3               = 176 =
            Вы нажали клавишу F1 для получения справочной информации, но
       Турбо  отладчик  не может найти соответствующий справочный экран.
       Сообщите об этом, пожалуйста, фирме Borland.
           No modules with line number information
            (Нет модулей с информацией о номерах строк)
            Вы использовали команду View¦Module (Обзор¦Модуль), но Турбо
       отладчик  не может найти модули с достаточной информацией для от-
       ладки,  чтобы вы могли просматривать исходные модули.  Обычно это
       сообщение выводится при отладке программы,  не содержащей таблицы
       идентификаторов. См. сообщение "Рrogram has no symbol tables".
           No previous search expression
            (Нет предыдущего выражения для поиска)
            Вы пытаетесь выполнить из локального меню области текста ко-


       манду Next (Следующий), но перед этим вы не давали команду Search
       (Поиск) для задания того, что вы ищете. Команду Next можно давать
       только после команды Search.
           No program loaded
            (Программа не загружена)
            Вы пытаетесь ввести команду, для выполнения которой требует-
       ся, чтобы программа была загружена. Таких команд много. Например,
       ни  одна из команд меню Run (Выполнение) не может выполняться без
       загрузки программы.  Для загрузки программы  используйте  команду
       File¦Open (Файл¦Открыть).
           No source file for module___
            (Нет исходных файлов для модуля)
            Для модуля,  который вы хотите просмотреть, невозможно найти
       исходный файл. Если исходный файл не содержится в текущем катало-
       ге, используйте команду Options¦Code Directories (Параметры¦Ката-
       логи исходного кода),  чтобы задать,  в каком каталоге  находятся
       ваши исходные файлы.
           No type information for this symbol
            (Для этого идентификатора нет информации о типе)
            Вы ввели выражение, содержащее имя переменной программы, для
       которой нет соответствующей отладочной информации. Это может про-
       изойти, когда переменная находится в модуле, скомпилированном без
       корректной отладочной информации.  Чтобы указать тип  данных,  вы
       можете  задать  информацию  о типе перед именем переменной (с по-
       мощью выражения назначения типа).
           Not a function name
            (Не является именем функции)

       TDeb 3.0 #3-3               = 177 =
            Вы ввели выражение,  которое содержит вызов функции,  но имя
       перед  круглой  скобкой  не  является именем функции (каждый раз,
       когда за именем открывается круглая скобка,  подразумевается, что
       это имя функции).
           Not a record, structure, or union member
            (Не является элементом записи, структуры или объединения)


            Вы ввели  выражение,  содержащее  один  из селекторов выбора
       элемента структуры на языке Си (.  или ->) или квалификатор  поля
       записи Паскаля (.).  Однако перед этим идентификатором не указано
       имя структуры или записи и не содержится указатель  на  структуру
       или запись.
           Not enough memory for selected operation
            (Для выбранной операции не хватает памяти)
            Вы дали команду, для которой требуется создание окна, но для
       этого не хватает памяти. Нужно сначала удалить или уменьшить раз-
       мер некоторых окон.
           Not enogh memory to load program
            (Не хватает памяти для загрузки программы)
            Таблица идентификаторов программы загружена в память, но для
       загрузки самой программы памяти не хватает. Если в системе имеет-
       ся память EMS, убедитесь, что отладчик использует ее для загрузки
       таблицы идентификаторов. Для этого используйте параметр командной
       строки -se или программу TDINST.
            Если у вас нет памяти EMS, или ваша программа не загружается
       даже с EMS,  вы можете соединить две вычислительных системы и ис-
       пользовать средства удаленной отладки (см.  Главу 15,  Главу 16 и
       Приложение E).
           Not enough memory to load symbol table
            (Не хватает памяти для загрузки таблицы идентификаторов)
            Не хватает памяти для загрузки таблицы идентификаторов прог-
       раммы.  Эта  таблица содержит информацию,  которую Турбо отладчик
       использует для вывода исходного кода и переменных программы. Если
       у  вас в системе работают резидентные программы,  требующие много
       памяти,  вы можете удалить их из памяти и перезапустить отладчик.
       Можно  также попробовать уменьшить объем таблицы идентификаторов,
       указав компилятору,  что нужно генерировать отладочную информацию
       только для тех модулей, которые вы будете отлаживать. Если вы ис-


       пользуете TD386, попробуйте использовать параметр -f, чтобы выну-
       дить TD эмулировать дополнительную память. См. Главу 15.
            При получении вами данного сообщения программа не будет заг-
       ружена в память. Это означает, что вы должны освободить достаточ-
       но памяти для таблицы идентификаторов и вашей программы.  Если вы
       отлаживаете резидентную программу,  которая уже загружена,  нужно

       TDeb 3.0 #3-3               = 178 =
       запустить Турбо отладчик с параметром командной строки -sm, чтобы
       зарезервировать память для таблицы идентификаторов.
           Only one operand size allowed
            (Допускается только один указатель размера операнда)
            Вы ввели для ассемблирования инструкцию, в которой содержит-
       ся более одного указателя размера.  Задав размер операнда,  вы не
       можете его изменить, например:
              mov WORD PTR BYTE PTR [bx],1
       cледует записать:
              mov BYTE PRT [bx],1
           Operand must be memory location
            (Операнд должен быть ячейкой в памяти)
            Вы ввели выражение,  содержащее подвыражение, которое должно
       ссылаться на ячейку памяти,  но не делает этого. Ссылка на память
       должны  присутствовать в операциях присваивания (=,  += и т.д.) и
       операциях уменьшения и увеличения (++ и --).
           Operand size unknown
            (Размер операнда неизвестен)
            Вы ввели для ассемблирования инструкцию, но не задали размер
       операнда.  Некоторые  инструкции  могут работать только с байтами
       или словами и требуют от вас задания размера (когда размер нельзя
       определить по виду операндов). Например, вместо:
              add [bx],1
       следует записать:
              add BYTE PTR [bx],1
           Overlay not loaded
            (Оверлей не загружен)
            (Только для Паскаля.) Вы пытаетесь установить область в окне
       CPU (ЦП) на адрес  в  программе,  который  соответствует  участку


       программы, не загруженному в данным момент в память. Для проверки
       кода,  не загруженного в память,  можно использовать окно  Module
       (Модуль), но соответствующие инструкции просматривать нельзя.
           Path not found
            (Маршрут не найден)
            Вы ввели несуществующее  сочетание  дисковода  и  каталогов.
       Проверьте, задали  ли  вы правильную метку диска,  и корректно ли
       указаны имена каталогов.

       TDeb 3.0 #3-3               = 179 =
           Path or file not found
            (Маршрут или файл не найден)
            При ответе  на  подсказку для ввода имени файла для загрузки
       вы задали несуществующий файл или недопустимый маршрут.  Если  вы
       не знаете точного имени файла,  который требуется загрузить,  его
       можно выбрать из списка,  нажав  в  ответ  на  подсказку  клавишу
       Enter.  Имена в списке, которые заканчиваются обратной косой чер-
       той (\) - это каталоги,  позволяющие вам перемещаться  по  дереву
       каталогов.
           Program has no object or classes
            (Программа не содержит объектов или классов)
            Вы пытаетесь открыть  окно  View¦Hierarchy  (Обзор¦Иерархия)
       для необъектно-ориентированной программы.
           Program has no symbol table
            (Программа не содержит таблицу идентификаторов)
            Программа, которую  вы хотите отладить,  успешно загружена в
       память,  но не содержит никакой информации об идентификаторах для
       отладки.  Вы  сможете выполнять программу по шагам с помощью окна
       ЦП и просматривать непосредственные данные,  но не  сможете  ссы-
       латься на код или данные по имени.
            Для создания таблицы  идентификаторов  в  Паскале  (5.0  или
       старше) установите  параметр  Debug¦Standalone  Debugging (Отлад-
       ка¦Автономная отладка) или используйте параметр  командной строки
       /v при работе с TPC.EXE. При работе с Borland C или C++ нужно вы-


       полнять компиляцию с параметром /v   и компоновку (TLINK) с пара-
       метром /v,  чтобы  получить информацию для отладки.  При работе с
       Турбо Ассемблером нужно выполнять  ассемблирование  с  параметром
       /zi,  а для для компоновки программу нужно использовать компонов-
       щик TLINK и указывать для получения информации для отладки  пара-
       метр /v.
           Program linked with wrong linker version
            (Для компоновки программы использована неверная версия  ком-
            поновщика)
            Вы пытаетесь отладить программу с  отладочной  информации  в
       устаревшем  формате.  Перекомпонуйте  программу  с использованием
       последней версии компоновщика или скомпилируйте ее с помощью пос-
       ледней версии Турбо Паскаля.
           Program not found
            (Программа не найдена)
            Программа с заданным вами именем не существует. Укажите пра-
       вильное имя программы или выберите его из списка

       TDeb 3.0 #3-3               = 180 =
           Register cannot be used with this operator
            (Регистр не  может использоваться в данной операции)
            Вы ввели  инструкцию Ассемблера,  в которой делается попытка
       использовать базовый или  индексный  регистр,  как  отрицательное
       смещение. Базовый или индексный регистр можно использовать только
       как положительное смещение. Например:
               INC     WORD PTR[12-BX]
       недопустимо, правильным будет выражение:
               INC     WORD PTR[12+BX]
           Register or displacement expected
            (Требуется регистр или смещение)
            Вы ввели  для ассемблирования инструкцию,  в которой неверно
       сформировано выражение в квадратных скобках. В скобках для форми-
       рования  базово-индексного  операнда  можно помещать только имена
       регистров или значения смещений (константы).
           Run out of space for reystroke macros
            (Исчерпана область для клавиатурных макрокоманд)


            При записи  макрокоманды  исчерпано  имеющееся пространство.
       Для всех клавиатурных макрокоманд можно записать до  256  нажатий
       клавиш.
           Search expression not found
            (Выражение для поиска не найдено)
            Невозможно найти текст или байты,  которые вы задали.  Поиск
       начинается с текущего места в файле (которое определяется позици-
       ей курсора) и продолжается по направлению к концу файла.  Если вы
       хотите выполнить поиск по всему файлу,  перед выполнением следую-
       щей команды нажмите клавиши Ctrl-PgUp.
           Source file ___ not found
            (Исходный файл не найден)
            Турбо отладчик не может найти исходный файл для модуля,  ко-
       торый вы хотите проверить.  Перед тем,  как вывести такое сообще-
       ние, он ищет исходные файлы в следующих местах:
            - там, где их ищет компилятор;
            - в каталогах,  заданных с  помощью  параметра  командной
              строки -sd и команды Options¦Path for Source (Параметры
              ¦Маршрут поиска исходных файлов);
            - в текущем каталоге;

       TDeb 3.0 #3-3               = 181 =
            - в каталоге,  где Турбо отладчик находит отлаживаемую прог-
              рамму.
            Вы должны  с  помощью команды Options¦Path for Source (Пара-
       метры¦Маршрут поиска исходных файлов) добавить  к  списку  поиска
       каталоги, содержащие исходный файл.
           Symbol not found
            (Не найден идентификатор)
            Вы ввели выражение,  содержащее недопустимое имя переменной.
       Возможно допущена ошибка при вводе имени переменной, или вы нахо-
       дитесь вне активной процедуры (функции),  либо в другом модуле за
       пределами области действия.
           Symbol table not found
            (Не найдена таблица идентификаторов)
            Заданный вами файл таблицы идентификаторов не существует. Вы
       можете задавать файлы с расширениями .TDS или .EXE.


           Syntax error
            (Синтаксическая ошибка)
            Вы ввели выражение в неверном формате. Если не выводится бо-
       лее конкретное сообщение, то это общее сообщение об ошибке.
           Too many files match wildcard mask
            (С трафаретной маской совпадает слишком много файлов)
            Вы задали трафаретную маску, которой соответствуют более 100
       файлов. На экран можно вывести только первые 100 файлов.
           Type EXIT to return to Turbo Debugger
            (Для возвращения в Турбо отладчик наберите EXIT)
            Вы дали  команду  File¦DOS Shell  (Файл¦Командный  процессор
       DOS). Данное сообщение указывает вам, что после выполнения команд
       DOS для возвращения в отладчик и продолжения  сеанса  отладки  вы
       можете ввести команду EXIT.
           Unexpected end of line
            (Непредвиденный конец строке)
            При вычислении выражения до того, как было распознано допус-
       тимое выражение, обнаружен конец строки.
            Например:
            99 - 22 *
       а следует записать:

       TDeb 3.0 #3-3               = 182 =
            99 - 22 * 4
            Следующий пример:
            SUB AX,
       следует записать в виде:
            SUB AX,4
           Unknown character
            (Неизвестный символ)
            Вы ввели выражение,  содержащее символ, который не может ис-
       пользоваться в выражениях (например,  символ кавычки (') в  языке
       Си).
           Unknown record, union or structure name
            (Неизвестное имя записи, объединения или структуры)
            Вы ввели выражение, которое содержит приведение типа с неиз-
       вестной записью,  структурой, союзом или перечислимым типом. (За-
       метим,  что в Си и Ассемблере структуры имеют собственные  имена,
       отличные от переменных).
           Unknown symbol
            (Неизвестный идентификатор)
            Вы ввели выражение,  содержащее недопустимое  имя  локальной


       переменной.  Либо неверно имя модуля, либо имя локального иденти-
       фикатора, либо некорректен номер строки.
           Unterminated string
            (Незавершенная строка)
            Вы ввели строку, которая не завершается закрывающей кавычкой
       (двойной - в Си,  или одинарной в Паскале). Если в Паскале вы хо-
       тите ввести строку,  внутри которой содержится символ кавычки, то
       нужно указывать дополнительный символ кавычки (').  В языке Си  в
       этом случае перед ней нужно указывать обратную косую черту (\).
           Value must be between nn and nn
            (Значение должно быть от nn до nn)
            Вы ввели недопустимое числовое значение для параметра редак-
       тора (например,  размера табуляции) или принтера (например, число
       строк на странице).  В сообщении об ошибке указывается допустимый
       диапазон.
           Value out of range
            (Значение вне диапазона)
            Вы ввели значение переменной Паскаля,  которое находится вне

       TDeb 3.0 #3-3               = 183 =
       диапазона допустимых значений.
           Video mode not avaliable
            (Видеорежим не доступен)
            Вы пытаетесь переключиться в режим 43/50 строк, но ваш дисп-
       лейный  адаптер  не  поддерживает  такого режима (указанный режим
       можно использовать только на адаптерах EGA и VGA).
           Video mode swithed while flipping pages
            (Во время переключения страниц изменен видеорежим)
            Ваша программа изменила видеорежим,  в то время как отладчик
       находился в режиме переключения страниц. Это означает, что содер-
       жимое экрана вашей программы потеряно.  Этого можно избежать, за-
       дав в командной строке параметр -ds, определяющий режим  видеооб-
       мена.
           You are not debugging a Window program
            (Вы отлаживаете не программу Windows)
            Вы пытаетесь  выполнить  операцию,  которую  можно выполнить


       только для программы  Windows  (например,  View¦Windows  Messages
       (Просмотр¦Сообщения Wiondows)), но программа загружена, как прог-
       рамма DOS.

       TDeb 3.0 #3-3               = 184 =
                          Информационные сообщения
       -----------------------------------------------------------------
            Перед выводом на экран обычной системы окон  Турбо  отладчик
       генерирует некоторые информационные сообщения. Приведем их описа-
       ние.
           Waiting for handshake from TDREMOTE (Ctrl-Break to quit)
            (Ожидается установление связи с утилитой TDREMOTE, для выхо-
            да нажмите клавиши Ctrl-Break)
            Вы указали Турбо отладчику,  что хотите выполнить отладку на
       удаленной системе,  подсоединенной через  последовательный  порт.
       Теперь  Турбо  отладчик  ждет  уведомления о запуске от удаленной
       системы.
            Нажав клавиши Ctrl-Break,  вы можете прервать Турбо отладчик
       и вернуться в DOS.

       TDeb 3.0 #2-3                 = 1 =
     Глава 9. Выражения................................................6
       Выбор языка для вычисления выражения............................6
       Адреса кода, адреса данных и номера строк.......................7
       Доступ к идентификаторам вне текущей области действия...........7
       Синтаксис переопределения области действия......................9
       Переопределение области.........................................9
       Некоторые замечания по переопределению области действия........12
       Переопределение области действия в программах Паскаля..........12
       Некоторые замечания по переопределению области действия........14
       Область действия и DLL.........................................15
       Неявная область действия при вычислении выражений..............16
       Списки байт....................................................16
       Выражения языка Си.............................................17


       Идентификаторы языка Си........................................17
       Регистровые псевдопеременные языка Си..........................18
       Форматы констант и чисел языка Си..............................19
       Символьные строки и ESC-последовательности языка Си............20
       Операции языка Си и старшинство операций.......................20
       Выполнение в программе функций на Си...........................21
       Выражения языка Си с побочными эффектами.......................22
       Ключевые слова языка Си и преобразование типов.................22
       Выражения языка Паскаль........................................23
       Идентификаторы Паскаля.........................................23
       Константы Паскаля и формат чисел...............................23
       Строки Паскаля.................................................24
       Операции Паскаля...............................................25
       Соглашения Паскаля по вызовам процедур и функций...............25
       Выражения Ассемблера...........................................26
       Идентификаторы Ассемблера......................................26
       Константы Ассемблера...........................................26
       Операции Ассемблера............................................28
       Управление форматом............................................28
     Глава 10. Объектно-ориентированная отладка для Паскаля и
        C++...........................................................30
       Отладка объектно-ориентированных программ Турбо Паскаля........30
       Окно Hierarchy.................................................31
       Области списка типов объектов и классов........................31
       Локальное меню области области списка типов объектов и
        классов.......................................................32
       Команда Inspect................................................32
       Команда Tree...................................................32


       Область дерева иерархии........................................33
       Локальные меню области дерева иерархии.........................33
       Локальное меню области дерева порождающих классов..............34
       Окно Object Type/Class Inspector...............................35
       Локальное меню окна Object Type/Class Inspector................36
       Область полей данных объекта (верхняя).........................36
       Область методов объекта (нижняя)...............................37
       Окно Object/Class Instance Inspector...........................38
       Локальное меню окна Object/Class Instance Inspector............39
       Средняя и нижняя область.......................................41
     Глава 11. Отладка на уровне Ассемблера...........................42
       Когда недостаточно отладки на уровне исходного кода............42

       TDeb 3.0 #2-3                 = 2 =
       Окно CPU.......................................................43
       Область кода...................................................45
       Дисассемблер...................................................45
       Локальное меню области кода....................................47
       Команда Goto...................................................47
       Команда Origin.................................................47
       Команда Follow.................................................47
       Команда Caller.................................................48
       Команда Previous...............................................48
       Команда Search.................................................48
       Команда View Source............................................49
       Команда Mixed..................................................49
       Команда New CS:IP..............................................50
       Команда Assemble...............................................50
       Команда I/O....................................................50


       Команда In Byte................................................50
       Команда Out Byte...............................................51
       Команда Read Word..............................................51
       Команда Write Word.............................................51
       Область регистров и флагов.....................................52
       Локальное меню области регистров...............................52
       Область селектора..............................................55
       Область данных.................................................57
       Локальное меню области данных..................................58
       Область стека..................................................63
       Ассемблер......................................................65
       Переопределения размера адреса операнда........................65
       Память и непосредственные операнды.............................65
       Переопределение размера данных в операндах.....................66
       Строковые инструкции...........................................67
       Окно Dump......................................................67
       Окно Registers.................................................68
     Глава 12. Сопроцессор 80х87 и эмулятор...........................69
       Сопроцессор 80х87 или эмулятор?................................69
       Окно Numeric Processor.........................................69
       Область регистров..............................................71
       Локальное меню области регистров...............................71
       Область управления.............................................73
       Локальное меню области управления..............................73
       Область состояния..............................................74
       Локальное меню области состояния...............................74
     Глава 13. Команды Турбо отладчика................................75
       Оперативные клавиши............................................75


       Команды, доступные из основного меню...........................80
       Меню Ё (системное меню)........................................80
       Меню File (Файл)...............................................81
       Меню Edit (Редактирование).....................................82
       Меню View (Обзор)..............................................82
       Меню Run (Выполнение)..........................................84
       Меню Breakpoints (Точки останова)..............................86
       Меню Data (Данные).............................................86
       Меню Options (Параметры).......................................86
       Меню Window (Окно).............................................88

       TDeb 3.0 #2-3                 = 3 =
       Меню Help (Справка)............................................89
       Команды локальных меню.........................................90
       Локальное меню окна Breakpoints (Точки останова)...............90
       Меню окна CPU (ЦП).............................................92
       Область кода...................................................92
       Область селектора..............................................93
       Область данных.................................................94
       Область флагов.................................................95
       Область стека..................................................97
       Окно Dump (Дамп)...............................................98
       Меню окна Execution History....................................98
       Область инструкций.............................................98
       Область регистрации нажатий клавиш.............................99
       Окно File (Файл)...............................................99
       Локальное меню окна Log (Регистрация).........................100
       Окно Module (Модуль)..........................................102
       Окно Windows Messages.........................................103


       Область выбора окна...........................................104
       Область класса сообщений......................................105
       Область сообщений.............................................105
       Окно Clipboard................................................106
       Окно Numeric Proseccor (Сопроцессор)..........................106
       Область регистров.............................................107
       Область состояния.............................................107
       Область управления............................................107
       Окно Hierarchy (Иерархия).....................................107
       Область списка типов объектов/классов.........................108
       Область дерева иерархии.......................................109
       Область дерева порождающих объектов/классов...................109
       Меню окна Registers (Регистры)................................109
       Окно Stack (Стек).............................................110
       Окно Variables (Переменные)...................................110
       Область локальных идентификаторов.............................110
       Окно Watches (Просмотр).......................................112
       Окно Inspector (Проверка).....................................113
       Окно проверки типа объекта/класса.............................113
       Окно проверки экземпляра объекта..............................115
       Области текста................................................115
       Области списков...............................................117
       Команды в окнах подсказки.....................................118
       Клавиатурные команды диалогового окна      Таблица 13.4.......118
       Команды перемещения окна......................................119
       Трафаретные символы, используемые при поиске..................119
       Полное дерево меню............................................120
     Глава 14.


Отладка программы.....................................122
       Когда что-то не работает......................................122
       Стиль отладки.................................................123
       Полное выполнение.............................................123
       Последовательное тестирование.................................123
       Типы ошибок...................................................124
       Общие ошибки..................................................124
       Скрытые эффекты...............................................124
       Предположения об инициализации данных.........................124

       TDeb 3.0 #2-3                 = 4 =
       Не забывайте об очистке.......................................125
       "Забор и столбы"..............................................125
       Ошибки, специфические для языка Си............................125
       Использование неинициализированных локальных переменных.......126
       Не следует путать = и ==......................................126
       Не следует путать старшинство операций........................127
       Неверные арифметические действия с указателями................127
       Не забывайте о расширении по знаку............................127
       Помните об усечении...........................................129
       Использование точки с запятой.................................129
       Макрокоманды с побочными эффектами............................129
       Повторение имен локальных динамических переменных.............129
       Неправильное использование динамических локальных
        переменных...................................................130
       Функция возвращает неопределенное значение....................130
       Неправильное использование ключевого слова break..............131
       Код, не приводящий к результату...............................131
       Ошибки, специфические для Паскаля.............................132


       Инициализированные переменные.................................132
       Неправильная работа с указателями.............................132
       Неправильное использование области действия...................133
       Неправильное использование точки с запятой....................134
       Функция возвращает неопределенное значение....................135
       Уменьшение значения переменных размером в байт или слово......136
       Игнорирование границ и особые случаи..........................136
       Ошибки диапазона..............................................137
       Ошибки, специфические для Ассемблера..........................138
       Программист забывает о возврате в DOS.........................138
       Программист забывает об инструкции RET........................139
       Генерация неверного типа возврата.............................139
       Неправильный порядок операндов................................139
       Программист забывает о стеке или резервирует маленький стек...139
       Вызов подпрограммы, которая портит содержимое нужных
        регистров....................................................140
       Ошибки при использовании условных переходов...................140
       Неверное понимание работы префикса REP........................140
       Нулевое содержимое CX и работа с целым сегментом..............140
       Неправильная установка флага направления......................141
       Ошибки при повторении команд сравнения строк..................141
       Ошибки при назначении сегмента строк..........................141
       Неправильное преобразование из байта в слово..................141
       Использование нескольких префиксов............................142
       Необязательные операнды в командах обработки строк............142
       Уничтожение содержимого регистра при умножении................142
       Ошибки, связанные с изменением содержимого регистров..........143
       Изменение состояния флага переноса............................143


       Программист долго не использует флаги.........................143
       Смешение операндов в памяти и непосредственных операндов......143
       Ошибки, связанные с возвратом в начало сегмента...............143
       Сохранение содержимого регистров при обработке прерываний.....144
       Игнорирование групп в таблицах операндов и данных.............144
       Проверка......................................................145
       Проверка граничных условий и случаи ограничения...............145

       TDeb 3.0 #2-3                 = 5 =
       Ввод ошибочных данных.........................................145
       Отсутствие входных данных.....................................145
       Отладка, как часть процесса создание программы................145
       Пример сеанса отладки.........................................147
       Сеанс отладки программы на языке Си...........................147
       Поиск ошибок..................................................147
       Разработка плана действий.....................................148
       Запуск Турбо отладчика........................................148
       Проверка......................................................149
       Окно Watch....................................................151
       Диалоговое окно Evaluate/Modify...............................151
       Эврика!.......................................................151
       Сеанс отладки с использованием программы на Паскале...........153
       Поиск ошибок..................................................154
       Выбор стратегии поиска ошибок.................................155
       Запуск Турбо отладчика........................................155
       Перемещение по программе......................................157
       Диалоговое окно Evaluate/Modify...............................158
       Проверка......................................................158
       Выражения просмотра...........................................159


       Следующая ошибка..............................................160
     Глава 15. Виртуальная отладка с использованием процессора
        80386........................................................162
       Аппаратные средства, необходимые для виртуальной отладки......162
       Установка драйвера устройства для виртуального отладчика......162
       Запуск виртуального отладчика.................................163
       Отличия обычной и виртуальной отладки.........................166
       Замечания относительно возможных проблем......................166
       Сообщения об ошибках TD386....................................167
       Сообщения об ошибках TDH386.SYS...............................169
     Глава 16. Отладка в защищенном режиме с использованием
        TD386........................................................170
       Аппаратура, необходимая для использования отладчика TD286.....170
       Установка отладчика для защищенного режима....................170
       Запуск отладчика для защищенного режима.......................171
       Отличия Турбо отладчика и отладчика для защищенного режима....171
       Отладка программ, использующих дополнительную память..........171
       Выполнение TD286 на разных машинах............................171

       TDeb 3.0 #2-3                 = 6 =
                             Глава 9. Выражения
       -----------------------------------------------------------------
            Выражения могут  включать  в себя идентификаторы вашей прог-
       раммы (то есть имена переменных и подпрограмм), а также константы
       и  операции одного из поддерживаемых языков (Си,  Паскаля или Ас-
       семблера).
            Турбо отладчик может вычислять выражения и сообщать вам зна-
       чение  результата.  Выражения можно также использовать для ссылки
       на элементы данных в памяти,  значение которых вы хотите  узнать.
       Выражение  можно  вводить  в ответ на любую подсказку,  в которой


       запрашивается значение адреса памяти.  (Заметим,  что в различных
       языках выражения вычисляются по-разному.)
            Для вычисления значения введенного выражения можно использо-
       вать команду основного меню Data¦Evaluate/Modify (Данные¦Вычисле-
       ние/Модификация). Эту команду можно также использовать, как прос-
       тейший калькулятор, а также для проверки значений объектов данных
       в программе.
            В данной  главе мы расскажем вам о том,  каким образом Турбо
       отладчик определяет, какой язык нужно использовать для вычисления
       выражения,  и как задать использование конкретного языка. Мы опи-
       шем элементы выражений,  которые являются общими для всех языков,
       такие, как номера исходных строк и доступ к регистрам процессора.
       Затем мы опишем компоненты,  которые входят в выражение на  любом
       языке,  включая константы,  переменные программы, строки и опера-
       ции.  Для каждого языка мы перечислим также поддерживаемые  Турбо
       отладчиком операции и опишем синтаксис выражений.
            Полное описание выражений Си,  Паскаля или Ассемблера содер-
       жится в руководствах пользователя и  справочных  руководствах  по
       соответствующим языкам. (см. Borland C++ Getting started, Borland
       C++ Programmers  Guide,  Turbo  Pascal Users Guide,  Turbo Pascal
       Reference Guide, Turbo Assembler Reference Guide).
                    Выбор языка для вычисления выражения
       -----------------------------------------------------------------
            Турбо отладчик обычно определяет, какой язык нужно использо-
       вать для вычисления выражения,  на основе расширения имени исход-
       ного файла в текущем модуле.  Это тот модуль, в котором останови-
       лась ваша программа.  Этот выбор можно отменить с помощью команды
       Options¦Language  (Параметры¦Язык)  и  открытия  диалогового окна
       Expression Language (Язык для выражений),  в котором вы можете  с


       помощью многопозиционного переключателя выбрать один из поддержи-
       ваемых языков (Паскаль,  Си или Ассемблер). Если вы выберете зна-
       чение Source (Исходный),  то выражения вычисляются в соответствии
       с языком исходного файла (если Турбо отладчик не может определить
       этот язык, он использует правила языка Ассемблера).
            Обычно Турбо отладчик сам определяет используемый язык.  Од-

       TDeb 3.0 #2-3                 = 7 =
       нако, иногда полезно задать язык явным образом, например, если вы
       отлаживаете  вызываемый из других языков модуль Ассемблера.  Явно
       задав использование для вычисления выражений  конкретного  языка,
       вы  можете обращаться к данным так,  как это делается в соответс-
       твующем языке,  даже если в текущем  модуле  используется  другой
       язык.
            Иногда удобно интерпретировать выражение или переменную  та-
       ким образом,  как если бы оно было написано на другом языке. Нап-
       ример, при отладке программы Паскаля для изменения значения байта
       в строке удобнее использовать соглашения Си или Ассемблера.
            Если при запуске Турбо отладчика начальный выбор языка  кор-
       ректен, то  при использовании соглашений других языков трудностей
       не будет.  Турбо отладчик сохраняет информацию о исходном языке и
       выполняет соответствующее  преобразование  и запись данных.  Если
       язык не определен однозначно,  Турбо отладчик использует  Ассемб-
       лер.
            Даже если вы ошибочно зададите при входе  в  Турбо  отладчик
       неверный язык,  он все равно сможет получить некоторую информацию
       о языке на основе таблицы идентификаторов и исходного модуля. Од-
       нако при некоторых обстоятельствах это может привести к тому, что
       Турбо отладчик будет записывать данные некорректно.
                  Адреса кода, адреса данных и номера строк
       -----------------------------------------------------------------


            Обычно, когда нужно получить доступ к переменной  или  имени
       подпрограммы в вашей программе,  вы просто вводите ее имя. Однако
       можно также вводить указатель, при вычислении которого получается
       указатель на память,  или задавать адреса кода в виде номеров ис-
       ходных  строк,  указывая перед номером строки символ #, например,
       #123 (только  для Си и C++).  В следующем разделе рассказывается,
       как можно обращаться к идентификаторам,  находящимся вне  текущей
       области действия.
            Конечно, с помощью обычного синтаксиса вида  "сегмент:смеще-
       ние" вы можете задать шестнадцатиричный адрес:
           ------------------------T----------------T---------------¬
           ¦ Язык                  ¦  Формат        ¦     Пример    ¦
           +-----------------------+----------------+---------------+
           ¦ Си                    ¦  Oxnnnn        ¦ Ox1234:Ox0010 ¦
           ¦ Паскаль               ¦  $nnnn         ¦ $1234:0010    ¦
           ¦ Ассемблер             ¦  nnnnh         ¦ 1234h:0B234h  ¦
           L-----------------------+----------------+----------------
            Доступ к идентификаторам вне текущей области действия
       -----------------------------------------------------------------
            Область, в которой Турбо отладчик ищет идентификатор,  назы-
       вается областью действия этого идентификатора. Доступ к идентифи-

       TDeb 3.0 #2-3                 = 8 =
       каторам, лежащим за пределами текущей области действия, представ-
       ляет собой сложное понятие, глубоко разбираться в котором в боль-
       шинстве случаев использования отладчика нет необходимости.
            Обычно Турбо  отладчик ищет входящий в выражение идентифика-
       тор точно так же, как это делает соответствующий компилятор. Нап-
       ример,  компилятор языка Си ищет его сначала в  текущей  функции,
       затем в текущем модуле (статический идентификатор),  а затем ищет


       глобальный идентификатор. Компилятор Турбо Паскаля ищет идентифи-
       катор  сначала  в текущей процедуре или функции,  затем во "внеш-
       ней" подпрограмме (если данная (активная) область действия вложе-
       на   в  другую),  затем  в  разделе  реализации  (inplementation)
       текущего модуля,  и, наконец, выполняет поиск глобального иденти-
       фикатора.
            Если Турбо  отладчик не может найти идентификатор, используя
       данные методы,  то он ищет его во всех  других  модулях,  пытаясь
       найти соответствие среди статических идентификаторов.  Это позво-
       ляет вам ссылаться на идентификаторы в других модулях,  не указы-
       вая явно имени модуля.
            Если вы  хотите  указать Турбо отладчику,  что идентификатор
       нужно искать в каком-то конкретном месте,  то при указании  имени
       идентификатора можно задать имя модуля,  файл в модуле и подпрог-
       рамму. Вы можете получить доступ к любому идентификатору програм-
       му, значение которого определено, даже к тем идентификаторам, ко-
       торые являются локальными для процедуры или функции и имена кото-
       рых входят в конфликт с другими идентификаторами.

       TDeb 3.0 #2-3                 = 9 =
                 Синтаксис переопределения области действия
       -----------------------------------------------------------------
            В зависимости  от  используемого языка,  для переопределения
       области  действия  идентификатора с  данным  именем  используются
       разные символы.
            - В  Си,  С++ и Турбо Ассемблере для переопределения области
              действия используется обычно символ #.
            - В Паскале с этой целью можно использовать точку (.).
            Выражение с уточненным идентификатором можно  вводить везде,
       где допустимо выражение, включая:
            - диалоговое окно Evaluate/Modify;
            - окно Watches;
            - диалоговое окно Data¦Inspector;


            - диалоговое  окно,  выводимое командой локального меню Goto
              или окно Module ( когда вы хотите перейти на адрес исходно-
              го кода).
                           Переопределение области
                  действия в программах Си, С++ и Ассемблера
       -----------------------------------------------------------------
            Для разделения компонентов области действия используйте сим-
       вол #.
            Таким образом, для переопределения области действия использу-
       ется следующий синтаксис (в квадратные скобки заключены  необяза-
       тельные элементы):
            [#модуль[#имя_файла]]#номер_строки[#номер_переменной]
       или
            [#модуль[#имя_файла]][#имя_функции]#имя_переменной
                 Примечание: Переопределение области действия  не  дейс-
            твуют для регистровых переменных.
            Если вы не задаете модуль,  то подразумевается  текущий  мо-
       дуль.
            Например, в окне Watches вы можете для  переменной программы
       TDDEMO nlines ввести разные номера строк,  чтобы увидеть, как из-
       меняется ее значение в различных подпрограммах.  Чтобы  наблюдать
       за значением  переменной  на строке 42 и 57,  можно ввести в окне
       Watches следующую запись:

       TDeb 3.0 #2-3                = 10 =
            #41#nlines
            #57#nlines
            Приведем некоторые примеры допустимых выражений для  иденти-
       фикаторов  с переопределением области действия (каждой допустимой
       комбинации элементов,  которые можно использовать для переопреде-
       ления области действия соответствует один пример).
             В первых  6 примерах показаны различные способы использова-
       ния номеров строк для генерации адресов и переопределения области
       действия:
               #123
               (Строка 123 в текущем модуле.)
               #123myvar1
               (Идентификатор myvar1 доступен из строки 123 текущего мо-


               дуля.)
               #mymodule#123
               (Строка 123 в модуле #mymodule.)
               #mymodule#123#myvar1
               ( Идентификатор myvar1 доступен из  строки  123  в  модуле
               mymodule.)
               #mymodule#file#123
               (Строка 123  в  исходном  файле  file,  который  является
               частью модуля mymodule.)
               #mymodule#file#123#myvar1
               (Идентификатор myvar1  доступен  из строки 123 в исходном
               файле file1, который является частью модуля mymodule.)
            Следующие 6  примеров показывают различные способы переопре-
       деления области действия переменной с использованием имени  моду-
       ля, файла или функции:
               #myvar2
               (То же, что и myvar2 без #.)
               #myfunc#myvar2
               (Переменная myvar2 доступна из подпрограммы myfunc.)

       TDeb 3.0 #2-3                = 11 =
               #mymodule#myvar2
               (Переменная myvar2 доступна из модуля mymodule.)
               #mymodule#myfunc#myvar2
               (Переменная myfunc доступна из подпрограммы myfunc в  мо-
               дуле mymodule.)
               #mymodule#file2#myvar2
               (Переменная myvar2  доступна из файла file2,  являющегося
               частью модуля mymodule.)
               #mymodule#file2#myfunc#myvar2
               (Переменная myvar2 доступна из подпрограммы myfunc, опре-
               деленной   в   файле   file2,  который  входит  в  модуль
               mymodule.)
            Следующие 4 примера показывают переопределения области дейс-
       твия для классов, объектов и функций-элементов С++:
            AnObject#AMemberVar
            Элемент данных AMemberVar доступен в объекте AnObject,  дос-
       тупном в текущей области действия.
            AnObject#AMemberF
            Функция-элемент AMemberF  доступна в объекте AnObject,  дос-
       тупном в текущей области действия.


            #AModule#AnObject#AClass::AMemberVar
            Элемент данных AMemberVar в классе AClass доступен в объекте
       AnObject, доступном в модуле AModule.
            Если при  отладке программы на языке С++ вы хотите проверить
       функцию с переопределенным именем, то для этого в соответствующем
       поле  ввода просто введите имя функции.  Турбо отладчик открывает
       диалоговое окно Pick a Symbol Name (Выбор  имени  идентификатора)
       со  списком всех функций с данным именем вместе с их аргументами.
       Вы можете выбрать то, что вам нужно.

       TDeb 3.0 #2-3                = 12 =
           Некоторые замечания по переопределению области действия
       -----------------------------------------------------------------
            При переопределении  области действия в программах на языках
       Си, C++, Паскаль или Ассемблер вам могут помочь следующие замеча-
       ния:
            1. Если  вы используете имя файла с оператором переопределе-
               ния области действия,  то ему должно  предшествовать  имя
               модуля.
            2. Если имя файла имеет расширение (.ASM,  .C или .CPP),  то
               вы должны указать расширение. Турбо отладчик сам расшире-
               ние не распознает.
            3. Если первым элементом в операторе переопределения области
               действия является функция,  то перед ней не должен указы-
               ваться символ #. При наличии символа # Турбо отладчик ин-
               терпретирует имя функции как имя модуля.
            4. Любая переменная,  к которой вы обращаетесь с помощью пе-
               реопределения  области  действия, уже должна быть инициа-
               лизирована.
            5. Если вы пытаетесь получить доступ к динамической  локаль-
               ной  переменной,  лежащей вне области действия,  то в ка-
               честве части операторе переопределения  области  действия
               нужно использовать имя ее функции.


            6. Турбо  отладчик  поддерживает  шаблоны и вложенные классы
               C++.
               - Область действия шаблона зависит от  текущей  ячейки  в
                 программе. Окна Wathes и Inspector с выражениями шабло-
                 на зависят от текущего  объекта,  в  котором  находится
                 программа.
               - Вложенный класс находится в области действия того клас-
                 са,  в который он вложен.  Область действия  вложенного
                 класса не является для программы глобальной.
            Переопределение области действия в программах Паскаля
       -----------------------------------------------------------------
            Для разделения  компонентов  области  действия  используется
       точка (.).
            Для переопределения  области действия используется следующий
       синтаксис (в квадратные скобки заключены  необязательные  элемен-
       ты):
            [модуль.[имя_процедуры]имя_переменной

       TDeb 3.0 #2-3                = 13 =
       или
            [модуль.[объектный_тип.][реализация_объекта.][метод]имя_поля
            Если вы не задаете модуль,  то подразумевается  текущий  мо-
       дуль.
            Далее приведено несколько примеров, которые не включают объ-
       екты и методы.  Каждый пример соответствует одной допустимой ком-
       бинации элементов, которую вы можете использовать для переопреде-
       ления области действия.
            В следующих примерах показаны различные способы  переопреде-
       ления  области  действия  с помощью использования имени процедуры
       или модуля:
            AVar                          Переменная AVar доступна в те-
                                          кущей области действия.
            AProc.AVar                    Локальная переменная AVar про-
                                          цедуры AProc доступна в  теку-
                                          щей области действия.
            AUnit.AVar                    Локальная переменная AVar дос-


                                          тупна в модуле AUnit.
            AUnit.AProc.AVar              Переменная   AVar  доступна  в
                                          процедуре AProc,   которая,  в
                                          свою очередь, доступна в моду-
                                          ле AUnit.
            Ниже приводятся несколько примеров, включающих объекты и ме-
       тоды:
        Instance                                   Реализация   Instance
                                                   доступна  в   текущей
                                                   области действия.
        Instance.AField                            Поле AFild доступно в
                                                   реализации  Instance,
                                                   доступной  в  текущей
                                                   области действия.
        AnObjectType.AMethod                       Метод AMethod  досту-
                                                   пен  в  типе  объекта
                                                   AnObjectType, доступ-
                                                   ном в текущей области
                                                   действия.
        AnInstance.AMethod                         Метод AMetod доступен
                                                   в          экземпляре
                                                   AnInstance, доступном

       TDeb 3.0 #2-3                = 14 =
                                                   в   текущей   области
                                                   действия.
        AUnit.AInstance.AFild                      Поле AFild доступно в
                                                   экземпляре AInstance,
                                                   который  доступен   в
                                                   модуле AUnit.
        AUnit.AnObjectType.AMethod                 Метод AMethod  досту-


                                                   пен       в      типе
                                                   AnObjectType, который
                                                   доступен   в   модуле
                                                   AUnit.
        AUnit.AnObjectType.AMetod.ANestedProc.AVar Локальная  переменная
                                                   AVar  доступна в про-
                                                   цедуре   ANestedProc,
                                                   которая   доступна  в
                                                   методе AMethod, кото-
                                                   рый  доступен  в типе
                                                   AnObjectType,   кото-
                                                   рый,  в свою очередь,
                                                   доступен   в   модуле
                                                   AUnit.
            Вы можете  вводить такие уточненные идентификаторы выражений
       в любом месте,  где выражение допустимо (в том числе  и  в  окнах
       просмотра и вычисления (Watch и Evaluate)), например, если вы из-
       меняете выражение в окне проверки (Inspector) или используете ло-
       кальное меню в окне Module (Модуль) для перехода (Goto) по адресу
       метода или процедуры в исходном коде.
           Некоторые замечания по переопределению области действия
       -----------------------------------------------------------------
            При переопределении  области  действия в программах на языке
       Паскаль вам могут помочь следующие замечания:
            1. Любая переменная,  к которой вы обращаетесь с помощью пе-
               реопределения  области  действия, уже должна быть инициа-
               лизирована.
            2. Если вы пытаетесь обратиться к локальной переменной,  ко-
               торой нет в текущей области действия, вы должны в качест-


               ве части оператора переопределения области  действия  ис-
               пользовать имя процедуры или функции.
            3. В  Паскале в качестве части оператора переопределения об-
               ласти действия вы не можете использовать имя файла. Одна-
               ко, для изменения языка на Си, в котором это допускается,
               можно использовать команду  Options¦Language  (Параметры¦
               Язык).

       TDeb 3.0 #2-3                = 15 =
                           Область действия и DLL
       -----------------------------------------------------------------
            Поскольку TDW одновременно загружает таблицы идентификаторов
       файла .EXE текущего модуля и его библиотек DLL (к которым он  об-
       ращается и для которых имеется исходный код и таблица идентифика-
       торов), вы можете не иметь возможности  немедленно  обратиться  к
       переменным DLL (или к переменным файла .EXE,  когда вы находитесь
       в DLL).
            TDW сначала ищет переменную в таблице идентификаторов  теку-
       щего модуля или DLL, а затем во всех других таблицах в порядке их
       загрузки. Если переменная имеет одно и то же имя в нескольких DLL
       или в файле .EXE и в DLL,  то отладчик TDW видит только первый ее
       экземпляр. Для доступа к таким переменным вы не можете  использо-
       вать синтаксис переопределения области действия. Вместо этого для
       загрузки соответствующего модуля или DLL нужно использовать  кла-
       вишу F3 или диалоговое окно Load Modules and DLLs (Загрузка моду-
       лей и библиотек DLL).
            Отладчик TDW загружает таблицу идентификаторов для:
            1. Текущего модуля файла .EXE.
            2. Любой  явно  загружаемой  с  помощью  команды Symbol Load
               (Загрузка идентификаторов) диалогового окна  Load Modules
               and DLLs (Загрузка модулей и DLL) DLL.
            3. Любой DLL, в которую вы вошли из вашей программы.



       TDeb 3.0 #2-3                = 16 =
              Неявная область действия при вычислении выражений
       -----------------------------------------------------------------
            Всякий раз,  когда Турбо отладчик  вычисляет  выражение,  он
       должен определить без явного указания,  где в программе находится
       область действия каждого идентификатора.  Во  многих  языках  это
       имеет существенное значение,  так как в процедурах и функциях мо-
       гут использоваться идентификаторы с теми же именами,  что и  гло-
       бальные идентификаторы. Турбо отладчик должен знать, какой именно
       идентификатор вы имеете в виду.
            В качестве основы при принятии решения об  области  действия
       Турбо отладчик обычно использует текущую позицию курсора.  Напри-
       мер,  вы можете задать область действия,  которая будет использо-
       ваться при вычислении выражения, переместив курсор на ту или иную
       строку в окне Module (Модуль).
            Это означает, что при смещении курсора с текущей строки, где
       остановилась  ваша программа,  вы можете при вычислении выражения
       получить непредвиденные результаты. Если вы хотите убедиться, что
       выражения вычисляются в текущей области действия вашей программы,
       используйте команду локального меню окна Module  Origin (Начало),
       чтобы вернуться к текущему адресу исходного кода.  Задать область
       действия выражения можно также,  перемещаясь в области Code (Код)
       окна CPU (Центральный процессор), устанавливая курсор на подпрог-
       рамму в  окне  Stack  (Стек)  или  на  имя  подпрограммы  в  окне
       Variables (Переменные).
                                 Списки байт
       -----------------------------------------------------------------
            В некоторых командах от вас требуется  ввести  список  байт.
       Это команды локального меню области Data (Данные) окна CPU (Цент-
       ральный процессор) Search (Поиск) и Change (Изменение)  или такие


       же команды локального меню окна File (Файл), в котором файл выво-
       дится в шестнадцатиричном виде.
            Список байт может представлять собой произвольную смесь ска-
       лярных (без плавающей точки) чисел и строк, в которых использует-
       ся  синтаксис  текущего  языка   (его   можно   задать   командой
       Options¦Language (Опции¦Язык)). И в строках, и в скалярных значе-
       ниях используется тот же синтаксис, что и в выражениях. Скалярные
       значения преобразуются в соответствующую последовательность байт.
       Например,  длинное целое (longint) значение Паскаля 123456 преоб-
       разуется в 4-байтовый шестнадцатиричный эквивалент 56 34 12 00.
                ------------T---------------T-------------------------¬
                ¦ Язык      ¦ Список байт   ¦Шестнадцатиричные данные ¦
                +-----------+---------------+-------------------------+
                ¦ Си        ¦ "ab"0x04"c"   ¦            61 62 04 63  ¦
                ¦ Паскаль   ¦ 'ab'#4'c'     ¦            61 62 04 63  ¦
                ¦ Ассемблер ¦ 1234"AB"      ¦            34 12 41 42  ¦
                L-----------+---------------+--------------------------

       TDeb 3.0 #2-3                = 17 =
                             Выражения языка Си
       -----------------------------------------------------------------
            Турбо отладчик  полностью  поддерживает  синтаксис выражений
       языка Си.  Выражение состоит из смеси операций, строк, переменных
       и констант.  Каждый из этих компонентов описан в одном из следую-
       щих разделов.
                           Идентификаторы языка Си
       -----------------------------------------------------------------
            Идентификатор языка  Си представляет собой имя элемента дан-
       ных или подпрограммы в программе. Имя идентификатора должно начи-
       наться с буквы (a-z или A-Z) или символа подчеркивания (_).  Пос-


       ледующие символы в идентификаторе могут содержать цифры от 0 до 9
       или любые из указанных символов.  В именах идентификаторов первый
       символ подчеркивания можно опускать.  Если вы вводите имя иденти-
       фикатора без символа подчеркивания, и этот идентификатор найти не
       удается,  то выполняется его повторный поиск с символом подчерки-
       вания.  Так как обычно компилятор помещает перед именем идентифи-
       катора символ подчеркивания, вы можете его не добавлять.

       TDeb 3.0 #2-3                = 18 =
                    Регистровые псевдопеременные языка Си
       -----------------------------------------------------------------
            Турбо отладчик  позволяет  вам  получить доступ к сегментным
       регистрам с помощью того же метода,  что  и  метод,  используемый
       компилятором  языка  Си,  а  именно - с помощью псевдопеременных.
       Псевдопеременная представляет собой имя переменной, соответствую-
       щее данному регистру процессора:
          --------------------T----------------------T---------------¬
          ¦ Псевдопеременная  ¦       Тип            ¦    Регистр    ¦
          +-------------------+----------------------+---------------+
          ¦     _AX           ¦  unsigned int        ¦          AX   ¦
          ¦     _AL           ¦  unsigned char       ¦          AL   ¦
          ¦     _AH           ¦  unsigned char       ¦          AH   ¦
          ¦                   ¦                      ¦               ¦
          ¦     _BX           ¦  unsigned int        ¦          BX   ¦
          ¦     _BL           ¦  unsigned char       ¦          BL   ¦
          ¦     _BH           ¦  unsigned char       ¦          BH   ¦
          ¦                   ¦                      ¦               ¦
          ¦     _CX           ¦  unsigned int        ¦          CX   ¦
          ¦     _CL           ¦  unsigned char       ¦          CL   ¦
          ¦     _CH           ¦  unsigned char       ¦          CH   ¦


          ¦                   ¦                      ¦               ¦
          ¦     _DX           ¦  unsigned int        ¦          DX   ¦
          ¦     _DL           ¦  unsigned char       ¦          DL   ¦
          ¦     _DH           ¦  unsigned char       ¦          DH   ¦
          ¦                   ¦                      ¦               ¦
          ¦     _CS           ¦  unsigned int        ¦          CS   ¦
          ¦     _DS           ¦  unsigned char       ¦          DS   ¦
          ¦     _SS           ¦  unsigned char       ¦          SS   ¦
          ¦     _ES           ¦  unsigned char       ¦          ES   ¦
          ¦                   ¦                      ¦               ¦
          ¦     _SP           ¦  unsigned int        ¦          SP   ¦
          ¦     _BP           ¦  unsigned char       ¦          BP   ¦
          ¦     _DI           ¦  unsigned char       ¦          DI   ¦
          ¦     _SI           ¦  unsigned char       ¦          SI   ¦
          ¦                   ¦                      ¦     указатель ¦
          ¦     _IP           ¦  unsigned int        ¦     инструкций¦
          L-------------------+----------------------+----------------

       TDeb 3.0 #2-3                = 19 =
            Получить доступ  к регистрам процессора 80386 позволяют сле-
       дующие псевдопеременные:
           -------------------T-----------------------T---------------¬
           ¦ Псевдопеременная ¦      Тип              ¦       Регистр ¦
           +------------------+-----------------------+---------------+
           ¦    _EAX          ¦  unsigned long        ¦         EAX   ¦
           ¦    _EBX          ¦  unsigned long        ¦         EBX   ¦
           ¦    _ECX          ¦  unsigned long        ¦         ECX   ¦
           ¦    _EDX          ¦  unsigned long        ¦         EDX   ¦
           ¦                  ¦                       ¦               ¦
           ¦    _ESP          ¦  unsigned long        ¦         ESP   ¦


           ¦    _EBP          ¦  unsigned long        ¦         EBP   ¦
           ¦    _EDI          ¦  unsigned long        ¦         EDI   ¦
           ¦    _ESI          ¦  unsigned long        ¦         ESI   ¦
           ¦                  ¦                       ¦               ¦
           ¦    _FS           ¦  unsigned int         ¦         FS    ¦
           ¦    _GS           ¦  unsigned int         ¦         GS    ¦
           L------------------+-----------------------+----------------
                      Форматы констант и чисел языка Си
       -----------------------------------------------------------------
            Константы могут быть с плавающей точкой или представлять со-
       бой целые константы.
            Если не  используется одно из переопределений в соответствии
       с соглашениями языка Си, то целая константа задается в десятичном
       виде.
                     ----------------T-----------------------¬
                     ¦   Формат      ¦   Основание           ¦
                     +---------------+-----------------------+
                     ¦   цифры       ¦   Десятичное          ¦
                     ¦   Oцифры      ¦   Восьмеричное        ¦
                     ¦   OXцифры     ¦   Шестнадцатиричное   ¦
                     ¦   Oхцифры     ¦   Шестнадцатиричное   ¦
                     L---------------+------------------------
            Константы имеют обычно тип int (16 бит).  Если вы хотите оп-
       ределить длинную константу (32 бита),  то конце числа нужно доба-
       вить l или L. Например, 123456L.
            Константа с плавающей точкой содержит десятичную точку и мо-
       жет использоваться для научного представления, например:
               1.234  4.5e+11

       TDeb 3.0 #2-3                = 20 =
             Символьные строки и ESC-последовательности языка Си
       -----------------------------------------------------------------
            Строки представляют собой последовательность символов,  зак-


       люченную  в  кавычки ("").  В качестве управляющего символа можно
       также в соответствии  со стандартными соглашениями языка  Си  ис-
       пользовать также обратную косую черту (\).
        ---------------------T--------------T--------------------------¬
        ¦ Последовательность ¦ Значение     ¦           Символ         ¦
        +--------------------+--------------+--------------------------+
        ¦ \\                 ¦              ¦ Обратная косая черта     ¦
        ¦ \a                 ¦ OX07         ¦ "Звонок"                 ¦
        ¦ \b                 ¦ OX08         ¦ Обратный пробел          ¦
        ¦ \f                 ¦ OX0C         ¦ Перевод формата          ¦
        ¦ \n                 ¦ OX0A         ¦ Новая строка             ¦
        ¦ \r                 ¦ OX0D         ¦ Возврат каретки          ¦
        ¦ \t                 ¦ OX09         ¦ Горизонтальная табуляция ¦
        ¦ \v                 ¦ OX0B         ¦ Вертикальная табуляция   ¦
        ¦ \xnn               ¦ nn           ¦ Шестнадцатиричное        ¦
        ¦                    ¦              ¦ значение байта           ¦
        ¦ \nnn               ¦ nnn          ¦ Восьмеричное значение    ¦
        ¦                    ¦              ¦ байта                    ¦
        L--------------------+--------------+---------------------------
            Если за обратной косой чертой следует один  из перечисленных
       здесь символов, то этот символ включается в строку без изменения.
                  Операции языка Си и старшинство операций
       -----------------------------------------------------------------
            В Турбо отладчике используются те же операции, что и в языке
       Си, и выполняются они в том же порядке. Однако в отладчике имеет-
       ся  одна  новая  операция,  которая не входит в стандартный набор
       операция языка Си. Это операция ::. Она имеет более высокий прио-
       ритет,  чем любая из операций языка Си, и используется для форма-


       тирования постоянного дальнего адреса из  выражения,  которое  ей
       предшествует, и выражения, которое за ней следует.
            Основные операции выражений:
               () [] . -> sizeof
       имеют наивысший приоритет (слева-направо). Унарные операции:
               * & - ! ~ ++ --
       имеют приоритет более низкий, чем основные операции, но более вы-
       сокий,  чем  бинарные операции (при группировании справа-налево).
       Приоритет бинарных операций убывает в соответствии  со  следующим
       списком  (операции с равным приоритетом содержатся на одной стро-
       ке):

       TDeb 3.0 #2-3                = 21 =
             высший  * / %
                     + -
                     >> <<
                     < > <= >=
                     == !=
                     &
                     ^
                     ¦
                     &&
             низший  ¦¦
            Единственная тернарная операция ? имеет более низкий приори-
       тет, чем любая из двоичных операций.
            Операторы присваивания имеют  более  низкий,  чем  тернарная
       операция и одинаковый приоритет и группируются справа-налево:
               =   +=   -=   /=   %=   >>=   <<=   &=   ^=   ¦=
                    Выполнение в программе функций на Си
       -----------------------------------------------------------------
            Функции в выражениях Си можно вызывать точно также,  как это
       делается  в  исходном  коде.  Турбо  отладчик выполняет код вашей
       программы с теми аргументами функции, которые вы задаете. Это мо-
       жет оказаться очень полезным для быстрой проверки поведения напи-
       санной функции.  Ее можно повторно вызывать с различными аргумен-
       тами и проверять, возвращает ли она корректное значение.
            Если ваша программа содержит следующую функцию, которая воз-
       водит число в степень (x в степени y):


               long power(int x, int y) {
                       long temp = 1;
                       while (y--)
                           temp *= x;
                       return(temp);
               }

       TDeb 3.0 #2-3                = 22 =
       то в  следующей таблице показаны результаты вызова данной функции
       с различными аргументами:
               --------------------------T---------------------------¬
               ¦  Выражение Си           ¦           Результат       ¦
               +-------------------------+---------------------------+
               ¦  power(3,2)*2           ¦           18              ¦
               ¦  25 + power(5,8)        ¦           390650          ¦
               ¦  power(2)               ¦           Ошибка (пропу-  ¦
               ¦                         ¦           щен аргумент)   ¦
               L-------------------------+----------------------------
                  Выражения языка Си с побочными эффектами
       -----------------------------------------------------------------
            Побочные эффекты имеют место,  когда вы вычисляете выражение
       языка Си, которое в процессе вычисления изменяет значение элемен-
       та данных.  В некоторых случаях побочные эффекты  являются  жела-
       тельными  и  используются  преднамеренно для модификации значения
       переменной программы. В других случаях желательно соблюдать осто-
       рожность и избегать их,  поэтому важно понимать, когда может воз-
       никнуть побочный эффект.
            Операция присваивания (=,  += и т.д.) изменяет значение эле-
       мента данных, расположенного слева от операции. Операции увеличе-
       ния и уменьшения (++ и --) изменяют  значения  элементов  данных,
       которые им предшествуют или следуют за ними, в зависимости от то-
       го,  используются они как префиксные,  или как постфиксные опера-
       ции.
            Менее очевидный  тип  побочных  эффектов  может иметь место,


       когда вы выполняете функцию,  являющуюся частью программы. Напри-
       мер, если вы вычисляет выражение Си:
               myfunc(1, 2, 3) + 7
       то, если функция myfunc изменила  значение  одной  из  переменных
       программы,  ваша программа может в дальнейшем вести себя неверно.
               Ключевые слова языка Си и преобразование типов
       -----------------------------------------------------------------
            Турбо отладчик позволяет вам выполнять приведение указателей
       также,  как это делалось бы в программе на языке  Си.  Приведение
       типа  состоит  из объявления типа данных языка Си в круглых скоб-
       ках.  Оно должно следовать перед выражением, при вычислении кото-
       рого получается указатель на память.
            Преобразование типа полезно  использовать,  если  вы  хотите
       проверить содержимое ячейки памяти,  на которую ссылается дальний
       адрес, сгенерированный с использованием операции ::. Например:

       TDeb 3.0 #2-3                = 23 =
               (long far *)Ox3456::0
               (char far *)_ES::_BX
            Преобразование типа  можно  использовать для доступа к пере-
       менной программы,  для которой информация о типе отсутствует (что
       может  произойти  при  компиляции модуля без включения информации
       для отладки). Вместо того, чтобы выполнять перекомпиляцию и пере-
       компоновку, можно просто перед именем переменной указать приведе-
       ние типа (то есть присвоить тип явным образом).
            Например, если  ваша переменная iptr представляет собой ука-
       затель на целое,  вы можете проверить целое значение,  на которое
       она указывает, вычислив выражение Си:
               *(int *)iptr
            При формировании преобразования типов в Турбо отладчике мож-
       но использовать следующие ключевые слова:
               char            float              far
               int             double             huge


               short           unsigned           struct
               long            near               union
                                                  enum
                           Выражения языка Паскаль
       -----------------------------------------------------------------
            Турбо отладчик, за исключением конкатенации строк и операций
       над множествами,  поддерживает синтаксис выражений Паскаля. Выра-
       жение представляет собой  смесь  операций,  строк,  переменных  и
       констант.  В  следующих разделах описывается каждый из образующих
       выражение компонентов.
                           Идентификаторы Паскаля
       -----------------------------------------------------------------
            Идентификаторы в  Паскале  представляют  собой  определенные
       пользователем  имена элементов данных или подпрограмм вашей прог-
       раммы.  Имя идентификатора Паскаля может начинаться с буквы (a  -
       z,  A - Z) или символа подчеркивания. Последующие символы в имени
       могут содержать цифры (от 0 до 9) и подчеркивания, а также буквы.
            Обычно идентификаторы подчиняются правилам  области действия
       Паскаля,  при этом "вложенные" локальные идентификаторы переопре-
       деляют другие идентификаторы в том же имени.  Вы можете переопре-
       делить данную область действия,  если хотите  получить  доступ  к
       идентификаторам в других областях. Более подробно это описывается
       в разделе "Доступ к идентификаторам  вне  текущей  области  дейс-
       твия".
                      Константы Паскаля и формат чисел
       -----------------------------------------------------------------
            Константы могут быть либо вещественными  (с  плавающей  точ-

       TDeb 3.0 #2-3                = 24 =
       кой),  либо  целыми.  Отрицательные константы начинаются со знака
       минуса (-).  Если число содержит десятичную точку или  символ  e,
       что обозначает экспоненту, то это вещественное число.


Например:
               123.4   456e34  123.45e-5
            Константы целого типа являются десятичными,  если они не на-
       чинаются со знака доллара  ($),  что  означает  шестнадцатиричную
       константу.  Десятичные целые константы могут принимать значения в
       диапазоне от 2137483648 и 2147483647. Шестнадцатиричные константы
       должны лежать в диапазоне от $00000000 до $FFFFFFFF.
                               Строки Паскаля
       -----------------------------------------------------------------
            Строка представляет собой просто группу символов,  заключен-
       ных в одиночные кавычки, например:
               'abc'
            Указав перед десятичным управляющим символом символ #, можно
       включить в строку управляющие символы, например:
               'def'#7'xyz'

       TDeb 3.0 #2-3                = 25 =
                              Операции Паскаля
       -----------------------------------------------------------------
            Турбо отладчик  поддерживает все операции,  использующиеся в
       выражениях Паскаля.
            Унарные операции имеют старший и одинаковый приоритет.
               @       Получает адрес идентификатора.
               ^       Содержимое указателя.
               not     Поразрядное дополнение.
               typeid  Приведение типа.
               +       Унарный плюс (положительное значение).
               -       Унарный минут (отрицательное значение).
            Бинарные операции имеют более низкий приоритет,  чем унарные
       операции. Перечислим их в порядке убывания приоритета:
               *       \       div     mod     and     shl     shr
               in      +       -       or      xor
               <       <=      >       >=      =       <>
            Операция присваивания := имеет низший приоритет.  Для вашего
       удобства она возвращает значение (как в языке Си).
              Соглашения Паскаля по вызовам процедур и функций


       -----------------------------------------------------------------
            В выражениях Турбо Паскаля можно ссылаться  на  процедуры  и
       функции.  Например,  предположим, что вы описали функцию с именем
       HalfFunc, которая делит целое значение на 2:
               function HalfFunc(i: integer) real);
            Затем вы можете выбрать команду Data¦Evaluate/Modify (Данные
       ¦Вычисление/Модификация) и вызвать функцию HalfFunc следующим об-
       разом:
               HalfFunc(3)
               HalfFunc(10) = HalfFunc(10 div 3)
            Можно также вызывать процедуры (но,  конечно, не в выражени-
       ях). Когда вы вводите просто имя процедуры или функции, Турбо от-
       ладчик выводит ее адрес и описание.  Чтобы вызвать процедуру  или
       функцию, которая не имеет параметров, укажите после имени функции
       скобки, например:
               MyProc()        Вызывает MyProc.
               MyProc          Сообщает адрес MyProc и т.д.
               MyFunc=5        Сравнивает адрес MuFunc c 5.
               MyFunc()=5      Вызывает MyFunc и сравнивает возвращаемое
                               значение с 5.

       TDeb 3.0 #2-3                = 26 =
                            Выражения Ассемблера
       -----------------------------------------------------------------
            Турбо отладчик  поддерживает  полный синтаксис выражений Ас-
       семблера.  Выражение состоит из смеси операций, строк, переменных
       и  констант.  Каждый  из этих компонентов описывается в следующем
       разделе.
                          Идентификаторы Ассемблера
       -----------------------------------------------------------------
            Идентификаторы представляют собой определенные пользователем
       имена элементов данных и подпрограмм в вашей программе. Имя иден-
       тификатора Ассемблера начинается с буквы (a - z, A - Z) или одно-
       го из следующий символов: @, ?, _, $. Последующие символы в иден-


       тификаторе  могут  содержать цифры (0 - 9) или любой из указанных
       символов.  В качестве первого символа имени идентификатора (но не
       внутри имени) можно также использовать точку.
            Специальный идентификатор $ ссылается на текущий адрес прог-
       раммы, определяемый парой регистров CS:IP.
                            Константы Ассемблера
       -----------------------------------------------------------------
            Турбо отладчик обеспечивает работу с константами всех типов,
       которые используются в Ассемблере (byte,  word,  длинные, состав-
       ные,  с плавающей точкой,  вещественные,  с двойной и расширенной
       точностью). Константа  с  плавающей  точкой  содержит  десятичную
       точку и может использовать научное десятичное представление.
                      1.234        4.5e+11
            Если не  используется одно из соглашений Ассемблера по пере-
       определению основания,  то целочисленные константы являются шест-
       надцатиричными.
            -------------------------T---------------------------------¬
            ¦  Формат                ¦                 Основание       ¦
            +------------------------+---------------------------------+
            ¦  цифрыH                ¦              Шестнадцатиричное  ¦
            ¦  цифрыO                ¦              Восьмеричное       ¦
            ¦  цифрыQ                ¦              Восьмеричное       ¦
            ¦  цифрыD                ¦              Десятичное         ¦
            ¦  цифрыB                ¦              Двоичное           ¦
            L------------------------+----------------------------------
            Шестнадцатиричное число  всегда должно начинаться с цифры (0
       - 9). Если вы ходите начать число с одной из букв (A - F), то пе-
       ред ним должен следовать 0.
                 Примечание: Если вы хотите  закончить шестнадцатиричное

       TDeb 3.0 #2-3                = 27 =


            число символом D или B,  то, чтобы избежать неоднозначности,
            нужно добавить H.

       TDeb 3.0 #2-3                = 28 =
                             Операции Ассемблера
       -----------------------------------------------------------------
            Турбо отладчик поддерживает большинство операций, использую-
       щиеся в Ассемблере. Старшинство этих операций соответствует стар-
       шинству операций, принятому в Ассемблере:
            xxx PTR (BYTE PTR...)
            .(селектор элемента структуры)
            :(переопределение сегмента)
            OR XOR
            AND
            NOT
            EQ NE LT LE GT GE
            + -
            * / MOD SHR SHL
            Унарный -, Унарный +
            OFFSET SEG
            () []
            Переменные можно изменять с помощью операции присваивания =.
       Например:
               a = [BYTE PTR DS:4]
                             Управление форматом
       -----------------------------------------------------------------
            Когда вы указываете выражение,  которое должно выводиться на
       экран, Турбо  отладчик  выводит его в формате,  основывающемся на
       типе данных, которые в нем используются. Турбо отладчик игнориру-
       ет управление форматом, неверное для данного типа данных.
            Если вы хотите изменить используемый по умолчанию формат вы-
       вода данных на экран, поместите в конце выражения запятую и  нео-
       бязательный счетчик повторения, за которым указывается необязате-
       льная буква формата. Счетчик повторения нужно задавать только для
       массивов.

       TDeb 3.0 #2-3                = 29 =
            Символы, управляющие форматом вывода Ассемблера, описываются
       с следующей таблице:
       -----------------------------------------------------------------
       Идентификатор           Формат
       -----------------------------------------------------------------
        c              Символ или строка выводятся на экран в виде необ-


                       работанных символов. Обычно непечатаемые  символы
                       выводятся в виде управляющих символов или в  чис-
                       ловом формате. Этот параметр приводит к тому, что
                       при выводе символов будет  использоваться  полный
                       набор символов дисплея IBM.
        d              Целое число выводится в виде  десятичного  значе-
                       ния.
        f[#]           Формат с плавающей точкой с заданным числом цифр.
                       Если вы  не  задаете число цифр,  то используется
                       столько цифр, сколько необходимо.
        m              Выражение со ссылкой на память выводится  в  виде
                       шестнадцатиричных байт.
        md             Выражение со ссылкой на память выводится  в  виде
                       десятичных байт.
        P              Выводится необработанное значение указателя,  по-
                       казывающее сегмент, как имя  регистра  (если  это
                       возможно). Показывается также объект, на  который
                       указатель ссылается. Если управление форматом  не
                       задано, то это используется по умолчанию.
        s              Выводится массив или указатель на массив символов
                       (строка, заключенная в кавычки).  Строка заверша-
                       ется нулевым символом.
        x или h        Целое выводится в виде шестнадцатиричного  значе-
                       ния.
       -----------------------------------------------------------------

       TDeb 3.0 #2-3                = 30 =
       Глава 10. Объектно-ориентированная отладка для Паскаля и C++
       -----------------------------------------------------------------
            Чтобы удовлетворить  потребности  развития  методов  объект-
       но-ориентированного программирования,  принципы которого реализо-
       ваны в последних версиях таких языков высокого уровня,  как Турбо


       C++ и  Турбо Паскаль,  Турбо отладчик был также модифицирован для
       поддержки объектно-ориентированного программирования.  Кроме  тех
       расширений,  которые  позволяют вам выполнять трассировку методов
       объектов или функций-элементов классов в диалоговом окне Evaluate
       /Modify  (Вычисление/Модификация) и окне Watch (Просмотр),  Турбо
       отладчик версии 3.0 оснащен специальным набором окон  и локальных
       меню, созданных специально для работы с объектными типами и клас-
       сами.
           Отладка объектно-ориентированных программ Турбо Паскаля
       -----------------------------------------------------------------
              Пошаговое выполнение и трассировка вызовов методов
       -----------------------------------------------------------------
            Во время  трассировки  (клавиша  F7) и пошагового выполнения
       (клавиша F8) Турбо отладчик рассматривает методы в  точности так,
       как  если бы они были процедурами или функциями.  Клавиша F7 осу-
       ществляет трассировку исходного кода метода (если этот код досту-
       пен),  тогда как F8 рассматривает вызов метода,  словно это  один
       оператор, и "перешагивает" через него.
            Турбо отладчик  правильно управляет поздним связыванием вир-
       туальных методов: он всегда выполняет и выводит на экран коррект-
       ный  код.  В окне стека Турбо отладчика (окно Stack) выводятся на
       экран имена методов,  перед которыми указывается тип объекта, оп-
       ределяющего метод.

       TDeb 3.0 #2-3                = 31 =
                               Окно Hierarchy
       -----------------------------------------------------------------
            В Турбо отладчике предусмотрено специальное  окно  Hierarchy
       (Иерархия) для  проверки  иерархии объектов или классов.  Вывести
       это окно можно по команде меню View¦Hierarchy (Обзор¦Иерархия).
              г[*]====Class Hierarchy====================3=====[ ][ ]¬


              ¦Device      ¦ L--------Point                          ¦
              ¦GlowGauge   ¦           L----------Rectangle          ¦
              ¦HorzArrow   ¦                       +-------Device    ¦
              ¦HorzBar     ¦                       L-------TextWindow¦
              ¦LinearGauge ¦Range                                    ¦
              ¦Point       ¦ L------Device                           ¦
              ¦Range       ¦          +------GlowGauge               ¦
              ¦Rectangle   +-----------------------------------------¦
              ¦Screen      ¦Parents of Device                        ¦
              ¦TextWindow  ¦ ¦----------Range                        ¦
              ¦VertArrow   ¦ L----------Rectangle                    ¦
              ¦VertBar     ¦            L----------Point             ¦
              ¦            ¦                       L-------Screen    ¦
              L=============<--------------------------------------->-
            Рис. 10.1 Окно Hierarchy
            В окне Hierarchy (Иерархия) выводится информация об  объект-
       ных  типах или классах,  а не об их экземплярах.  В левой области
       выводится список в алфавитном порядке всех типов,  используемых в
       отлаживаемом модуле. В правой области (двух областях, если вы от-
       лаживаете программу на C++ с множественным наследованием) показа-
       на  иерархия всех объектов или классов (с помощью линейной графи-
       ки).  При этом по левой границе области выводится базовый  тип  и
       показываются порожденные им типы ("потомки"). Кроме того показаны
       все "предки" классов с множественным наследованием.  При этом ли-
       нии показывают отношения между "предками" и "потомками".
                 Примечание: Для  перемещения  между двумя областями ис-
            пользуйте клавишу Tab.
                   Области списка типов объектов и классов
       -----------------------------------------------------------------


            В левой области окна иерархии объектов/классов  выводится (в
       алфавитном порядке)  список всех типов классов или объектов в те-
       кущем модуле.  Она поддерживает средство инкрементального поиска,
       что исключает необходимость перемещать курсор по  большим спискам
       типов.  Когда  полоса подсветки находится в левой области,  можно
       просто начать набирать новое имя искомого типа объекта или  клас-
       са. При каждом нажатии клавиши Турбо отладчик подсвечивает первый
       тип, соответствующий всем нажатым к этому моменту клавишам.
            Для того,  чтобы открыть окно Inspector (Проверка) для подс-
       веченного типа  объекта или класса,  нажмите клавишу Enter.  Окна

       TDeb 3.0 #2-3                = 32 =
       проверки описаны далее.
       Локальное меню области области списка типов объектов и классов
       -----------------------------------------------------------------
            Для вывода  локального  меню  данной области нажмите клавиши
       Alt-F10. Вы можете  также  использовать  сокращения  (оперативные
       клавиши), если это разрешено с помощью утилиты TDINST. Данное ло-
       кальное меню содержит два элемента: Inspect и Tree.
                            ------------------¬
            Проверка        ¦ Inspect         ¦
            Дерево          ¦ Tree            ¦
                            L------------------
                               Команда Inspect
       -----------------------------------------------------------------
            Данная команда выводит для подсвеченного типа объекта/класса
       окно Inspector (Проверка).
                                Команда Tree
       -----------------------------------------------------------------
            Данная команда перемещает вас в правую область окна, в кото-
       рой выведено дерево иерархии объектов, и помещает полосу подсвет-
       ки на тип, который подсвечен в левой области.

       TDeb 3.0 #2-3                = 33 =


                           Область дерева иерархии
       -----------------------------------------------------------------
            В правой области окна Hierarchy  выводится  дерево  иерархии
       для всех  объектов или классов,  использующихся в текущем модуле.
       Отношения "предков" и "потомков" показаны линиями, при этом  "по-
       томки" расположены слева и ниже своих "предков".
            Чтобы найти  объект или класс конкретного типа в сложном де-
       реве иерархии,  перейдите обратно в левую область  и  используйте
       средство инкрементального поиска (или поиска по возрастанию). За-
       тем выберите в локальном меню элемент Tree (Дерево), чтобы перей-
       ти обратно к дереву иерархии. Соответствующий тип выводится в по-
       лосе подсветки.
            При нажатии  клавиши  Enter  для  подсвеченного  типа объек-
       та/класса выводится окно Inspector (Проверка).
            Если вы загрузили программу на языке C++,  в которой исполь-
       зуются классы с множественным наследованием,  то выводится третья
       область - дерево порождающих классов,  которая расположена в окне
       Hierarchy (Иерархия) ниже дерева иерархии.  Если исследуемый вами
       класс имеет нескольких "предков",  то,  если в локальном меню об-
       ласти дерева иерархии выбрана команда Parent (Порождающий класс),
       и для нее установлено значение Yes (Да), то области дерева порож-
       дающих  классов  выводится обратное дерево (с сообщением "Parents
       of Class" - "Порождающие классы для данного класса" в левой  гра-
       нице  области).  Ниже  и правее левой границы выводятся "предки".
       При этом линиями показаны отношения "предков" и "потомков".
            Также, как и в области дерева иерархии,  для любого  класса,
       выводимого  в  области дерева порождающих классов,  можно открыть
       окно Inspector (Проверка).


                   Локальные меню области дерева иерархии
       -----------------------------------------------------------------
            Локальное меню  области дерева иерархии содержит только один
       элемент - Inspect (Проверка). Когда вы его выбираете, для подсве-
       ченного типа выводится окно проверки типа класса/объекта. Однако,
       если вы хотите проверить подсвеченный тип,  быстрее и проще будет
       просто нажать клавишу Enter.
                            ------------¬
                 Проверка   ¦ Inspect   ¦
                            L------------
            Если вы загрузили программу на языке C++,  в которой исполь-
       зуются классы с множественным наследованием,  то  локальное  меню
       области дерева иерархии содержит два элемента: Inspect и Parents.
                             ---------------------¬
                 Проверка    ¦ Inspect            ¦
                 Предки      ¦ Parents        Yes ¦
                             L---------------------

       TDeb 3.0 #2-3                = 34 =
            Parents - это переключатель,  с помощью которого  вы  можете
       управлять выводом  "предков"  класса в области дерева порождающих
       классов. Его полезно использовать,  если проверяемый  вами  класс
       имеет множественное наследование.  По умолчанию данный переключа-
       тель имеет значение Yes (Да).
              Локальное меню области дерева порождающих классов
       -----------------------------------------------------------------
            Область дерева порождающих (родительских) классов,  если она
       присутствует,  содержит локальное меню  с  единственной  командой
       Inspect (Проверка).
                            -------------¬
                 Проверка   ¦ Inspect    ¦
                            L-------------
            Работает данная  команда аналогично команде Inspect (Провер-
       ка) локального меню области дерева иерархии,  то  есть  открывает


       окно Inspector для подсвеченного типа объекта или класса.

       TDeb 3.0 #2-3                = 35 =
                      Окно Object Type/Class Inspector
       -----------------------------------------------------------------
            Турбо отладчик предоставляет новый тип окна Inspector  (Про-
       верка) с  целью  позволить  вам проверять детали объектного типа.
       Это  окно  проверки  типов  объектов/классов  (Object  Type/Class
       Inspector).  В данном окне сведена информация о типе объекта,  но
       оно не относится к какому-либо отдельному экземпляру этого типа.
                    г==[*]==Class LinearGauge==4===[ ][ ]¬
                    ¦int-Range::Low----------------------^
                    ¦int Range::High                     -
                    ¦int Screen::MaxX                    v
                    ¦<---------------------------------->¦
                    ¦class Range *Range::ctr()           ¦
                    ¦int Range::GetValue()               ¦
                    ¦int Range::GetLow()                 ¦
                    ¦int Range::GetHigh()                ¦
                    L====================================-
            Рис. 10.2 Окно Object Type/Class Inspector
            Окно делится по горизонтали на две области, в верхней из ко-
       торых  выводится  список полей данных типа объекта,  а в нижней -
       список имен методов и (если выбранный  метод  является  функцией)
       возвращаемый функцией тип. Используйте клавишу горизонтальной та-
       буляции для   переключения  между  двумя  областями  окна  Object
       Type/Class Inspector (Проверка типов объектов/классов).
            Если подсвеченное поле данных является объектным  типом  или
       указателем  на объектный тип,  то нажатие клавиши Enter открывает
       другое окно проверки типов  объектов/классов  (Object  Type/Class
       Inspector) для подсвеченного типа. (Это действие идентично выбору


       элемента Inspect в локальном меню  этого  окна.)  Таким  образом,
       сложная вложенная структура объектов может быстро просматриваться
       при минимальном количестве нажатий клавиш.
            Для краткости  параметры  методов  не  показываются  в  окне
       проверки типов объектов.  Для проверки параметров метода перемес-
       тите подсветку на метод и нажмите клавишу  Enter.  Появится  окно
       проверки метода/функции (Inspector). Верхняя область окна выводит
       на экран адрес кода экземпляра типа объекта/класса для выбранного
       метода и имена и типы всех параметров метода.  Если ваша исходная
       программа написана на объектно-ориентированном Паскале, то нижняя
       область окна показывает, является ли метод процедурой или функци-
       ей.
            Нажатие клавиши Enter в любом месте окна проверки метода или
       функций-элементов классов (Inspector) выводит  на  передний  план
       окно Module (Модуль) и помещает курсор на код,  который реализует
       проверяемый метод.
            Как и в стандартном окне проверки,  нажатие клавиши Esc зак-

       TDeb 3.0 #2-3                = 36 =
       рывает текущее окно Inspector (Проверка), а нажатие клавиш Alt-F3
       закрывает их все.
               Локальное меню окна Object Type/Class Inspector
       -----------------------------------------------------------------
            Нажатие клавиш Alt-F10 выводит локальное меню любой области.
       Если  разрешено  использование  сокращений с клавишей Ctrl (с по-
       мощью утилиты TDINST),  то вы можете получить элемент  локального
       меню  путем нажатия клавиши Ctrl и первой буквы элемента. Верхняя
       область (область полей данных объектов) содержит  следующие  эле-
       менты меню:
                                       -----------------------¬
            Проверка                   ¦ Inspect              ¦
            Иерархия                   ¦ Hierarchy            ¦
            Вывод наследования         ¦ Show inherited   Yes ¦


                                       L-----------------------
                   Область полей данных объекта (верхняя)
       -----------------------------------------------------------------
            Локальное меню области полей данных объекта содержит следую-
       щите элементы:
                          Команда Inspect (Проверка)
       -----------------------------------------------------------------
            Если подсвеченное поле является объектным типом или указате-
       лем на него,  то для подсвеченного поля  открывается  новое  окно
       проверки типов объектов/классов (Object Type/Class Inspector).
                         Команда Hierarchy (Иерархия)
       -----------------------------------------------------------------
            Открывает окно иерархии объектов (Hierarchy) для проверяемо-
       го объектного типа или класса. Это окно описано выше.
                      Show Inherited (Вывод наследования)
       -----------------------------------------------------------------
            Yes (Да) является значением по умолчанию этого  переключате-
       ля.  Когда  он  установлен в значение Yes,  показываются все поля
       данных и методы (функции),  независимо от того, определены ли они
       внутри данного (проверяемого)  типа  объекта  (класса),  или  они
       унаследованы от родительского (порождающего) типа. Когда переклю-
       чатель установлен в значение No (Нет),  на экран выводятся только
       определенные внутри проверяемого типа поля и методы (функции-эле-
       менты).

       TDeb 3.0 #2-3                = 37 =
                      Область методов объекта (нижняя)
       -----------------------------------------------------------------
            Перечислим элементы  локального меню нижней области (области
       методов объектов):
                                       -----------------------¬
            Проверка                   ¦ Inspect              ¦
            Иерархия                   ¦ Hierarchy            ¦


            Вывод наследования         ¦ Show inherited   Yes ¦
                                       L-----------------------
                          Команда Inspect (Проверка)
       -----------------------------------------------------------------
            Для подсвеченного метода  открывается  окно  проверки  функ-
       ции/метода (Inspector).  Если вы нажмете клавиши Ctrl-I, а курсор
       будет при этом находиться выше адреса, показанного в окне провер-
       ки метода/функции, то на переднем плане появится окно Module (Мо-
       дуль), а курсор будет находиться на коде, реализующем проверяемый
       метод (функцию).
                         Команда Hierarchy (Иерархия)
       -----------------------------------------------------------------
            Открывает окно иерархии объектов (Hierarchy) для проверяемо-
       го объекта или класса. Это окно описано выше.
                      Show  Inherit  (Вывод наследования)
       -----------------------------------------------------------------
            Yes (Да) является состоянием по умолчанию для этого переклю-
       чателя.  Когда он установлен в значение Yes,  то показываются все
       методы или функции-элементы,  независимо от того,  определены  ли
       они в проверяемом объекте (классе), или они унаследованы от роди-
       тельского типа объекта (класса). Если этот переключатель установ-
       лен в значение No (Нет),  то показываются только методы,  опреде-
       ленные в проверяемом типе объекта (класса).

       TDeb 3.0 #2-3                = 38 =
                    Окно Object/Class Instance Inspector
       -----------------------------------------------------------------
            Окна Object/Class Instance  Inspector  (Проверка  экземпляра
       объектов/классов)  обеспечивают  информацию о типах объектов,  но
       ничего не говорит о данных,  содержащихся в отдельном  экземпляре
       объекта  или  класса в данный момент выполнения программы.  Турбо


       отладчик предоставляет расширенную форму знакомых уже  окон  про-
       верки  записей  специально  для проверки экземпляров объектов или
       классов.
            Откройте это  окно путем установки курсора на экземпляр объ-
       екта в окне Module (Модуль), затем нажмите клавиши Ctrl-I.
                  г=[*]==Inspecting tw=============3==[ ][ ]¬
                  ¦@75C6:01E8                               ^
                  ¦Screen::MaxX              500    (Ox1F4) -
                  ¦Screen::MaxY              512    (Ox200) v
                  ¦<--------------------------------------->¦
                  ¦Screen::Convert       @0000:0000         ¦
                  ¦Screen::VertVtoA      @0000:0000         ¦
                  ¦Screen::VertAtoV      @0000:0000         ¦
                  ¦-----------------------------------------¦
                  ¦class TextWindow                         ¦
                  L=========================================-
            Рис. 10.3 Окно Object/Class Instance Inspector
            Большинство окон Турбо отладчика,  предназначенных для  про-
       верки данных записи, имеют две части (области). В верхней области
       выводятся имена полей записи и их текущие значения,  а в нижней -
       тип поля,  подсвеченного в верхней области. Окно проверки экземп-
       ляра объекта/класса  (Object/Class Instance Inspector) предостав-
       ляет обе эти области,  а также третью область между ними. Эта но-
       вая область  содержит  методы экземпляра объекта или функции-эле-
       менты с адресами кода для каждого метода (функции).  (Адрес  кода
       учитывается полиморфическими объектами и  в  таблице  виртуальных
       методов.)
                 Примечание: Полное описание таблицы виртуальных методов
            можно найти в руководствах по Турбо Паскалю.

       TDeb 3.0 #2-3                = 39 =
             Локальное меню окна Object/Class Instance Inspector
       -----------------------------------------------------------------


            Каждая из двух верхних областей  окна  проверки  экземпляром
       объектов/классов  (Object/Class  Instance  Inspector)  имеет свое
       собственное локальное меню,  которое выводится на экран путем на-
       жатия клавиш Alt-F10. Здесь вы также можете использовать сокраще-
       ния с клавишей Ctrl для получения отдельных элементов  меню, если
       их использование разрешено с помощью утилиты TDINST.
                                            ----------------------¬
                   Диапазон                 ¦ Range...            ¦
                   Изменение                ¦ Change...           ¦
                   Методы                   ¦ Methods         Yes ¦
                   Вывод наследования       ¦ Show inherited  Yes ¦
                                            +---------------------+
                   Проверка                 ¦ Inspect             ¦
                   Спуск                    ¦ Descend             ¦
                   Новое выражение          ¦ New expression...   ¦
                   Приведение типа          ¦ Type cast           ¦
                   Иерархия                 ¦ Hierarchy           ¦
                                            L----------------------
            Как и в окне проверки  записи  (Inspector),  нижняя  область
       служит  только  для вывода типа подсвеченного поля и не имеет ло-
       кального меню.
            Верхняя область, которая содержит поля данных объекта, имеет
       следующие локальные команды:
                          Команда Range... (Диапазон)
       -----------------------------------------------------------------
            Эта команда  не изменилась при переходе от более ранних вер-
       сий.  Она позволяет выводить на экран границы элементов  массива.
       Если элемент не является массивом или указателем,  то эта команда
       недоступна.
                        Команда Change...  (Изменение)
       -----------------------------------------------------------------


            Путем выбора этой команды вы можете загрузить новые значения
       в подсвеченное поле данных. Эта команда также не претерпела изме-
       нений по сравнению с более ранними версиями Турбо отладчика.
                           Команда Methods (Методы)
       -----------------------------------------------------------------
            Эта команда является переключателем между состояниями Yes/No
       (Да/Нет) и с состоянием Yes (Да) по умолчанию. Если переключатель
       установлен в значение Yes, то методы выводятся в средней области.
       В состоянии No (Нет) средняя область отсутствует. Этот переключа-
       тель запоминается следующим окном Inspector  (Проверка),  которое

       TDeb 3.0 #2-3                = 40 =
       будет открыто.
                  Команда Show Inherited (Вывод наследования)
       -----------------------------------------------------------------
            Это элемент,  который также переключается между  состояниями
       Yes и No.  В состоянии Yes (Да) выводятся все поля данных и мето-
       ды,  независимо от того, определены ли они в проверяемом объекте,
       или они унаследованы от родительского типа.  В состоянии No (Нет)
       выводятся только те поля и методы, которые определены в проверяе-
       мом объектном типе.
                          Команда Inspect (Проверка)
       -----------------------------------------------------------------
            Как и в предыдущих версиях Турбо отладчика,  выбор этой  ко-
       манды открывает окно проверки данных (Inspector) для подсвеченно-
       го поля. Нажатие клавиши Enter над подсвеченным полем ведет к то-
       му же результату.
                            Команда Descend (Спуск)
       -----------------------------------------------------------------
            Эта команда не изменилась по отношению к более ранним верси-
       ям Турбо отладчика.  Подсвеченный элемент занимает место элемента
       в текущем окне  Inspector.  Не  открывается  никаких  новых  окон


       Inspector. Однако, вы не можете вернуться к предыдущему проверяе-
       мому полю,  как  могли бы сделать это, если бы использовали пара-
       метры Inspect.
                 Примечание: Используйте команду Descend (Спуск) при вы-
            полнении трассировки сложных структур данных и когда  вы  не
            собираетесь  открывать  отдельное  окно проверки (Inspector)
            для каждого проверяемого элемента.
                  Команда New Expression... (Новое выражение)
       -----------------------------------------------------------------
           Данная команда не изменена по сравнению с предыдущими версия-
       ми Турбо отладчика.  Эта команда подсказывает вам о необходимости
       ввести  новый  элемент  данных или выражение для проверки.  Новый
       элемент замещает текущий в окне, а новое окно не открывается.
                    Команда Type Cast... (Приведение типа)
       -----------------------------------------------------------------
            Команда Type Cast (Приведение типа) позволяет вам задать для
       проверяемого элемента другой тип данных. Ее полезно использовать,
       если окно Inspector содержит идентификатор,  для которого нет ин-
       формации о типе, а также для явного задания типа указателей.
                         Команда Hierarchy (Иерархия)
       -----------------------------------------------------------------

       TDeb 3.0 #2-3                = 41 =
            При выборе  данной команды открывается окно иерархии объекта
       (Hierarchy). Полное описание этого окна приведено выше.
                          Средняя и нижняя область
       -----------------------------------------------------------------
            В среднем окне выводятся методы объекта.  Единственным отли-
       чием между локальным меню области методов и локальным меню облас-
       ти полей данных (верхняя  область)  является  отсутствие  команды
       Change (Изменение).  В отличие от полей данных,  методы  и  функ-


       ции-элементы нельзя  изменять в процессе выполнения,  поэтому нет
       нужды в такой команде.
            В нижней области выводится  тип  элемента,  подсвеченного  в
       верхних двух областях.

       TDeb 3.0 #2-3                = 42 =
                   Глава 11. Отладка на уровне Ассемблера
       -----------------------------------------------------------------
            Данная глава предназначена для программистов, которые знако-
       мы с программированием на Ассемблере для процессоров серии 80х86.
                 Примечание: Вам не обязательно использовать при отладке
            программы возможности, которые здесь описаны, но при возник-
            новении определенных проблем их можно быстрее и проще устра-
            нить, если использовать описанные в данной главе методы.
            Мы поясним,  в каких случаях желательно использовать отладку
       на уровне Ассемблера. Затем мы опишем окно центрального процессо-
       ра (CPU) со встроенным дисассемблером и Ассемблером.  Вы узнаете,
       как можно с помощью данного окна проверять и модифицировать байты
       данных непосредственно в шестнадцатиричном виде,  как  анализиро-
       вать стек вызова функций, как проверять и модифицировать регистры
       центрального процессора (ЦП) и его флаги.
             Когда недостаточно отладки на уровне исходного кода
       -----------------------------------------------------------------
            В большинстве случаев при отладке программы вы ссылаетесь на
       код и данные программы на уровне исходного кода, обращаясь к име-
       нам идентификаторов точно так, как они набраны в исходном коде, и
       "проходите" программу, выполняя участки исходного кода.
            Однако иногда лучше рассмотреть проблему "изнутри", анализи-
       руя те инструкции.  которые генерирует компилятор, содержимое ре-
       гистров ЦП и его стека. Чтобы сделать это, вы должны быть знакомы
       как  с  процессором  серии 80х86,  так и с компилятором,  который


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

       TDeb 3.0 #2-3                = 43 =
                                  Окно CPU
       -----------------------------------------------------------------
            В окне CPU (ЦП) показано все состояние центрального  процес-
       сора.  С его помощью вы можете проверять и изменять биты и байты,
       составляющие код и данные программы.  В окне Code (Код) для  вре-
       менной  коррекции своей программы вы можете использовать встроен-
       ный Ассемблер.  При этом инструкции вводятся точно также, как при
       наборе исходных операторов Ассемблера.  Можно также получить дос-
       туп к соответствующим данным любой структуры данных, выводя и из-
       меняя их в различных форматах.
             г[*]=CPU 80286================================3===[ ][ ]¬
             ¦TPDEMO.120: Inc(NumLines);               ^ ax 0004 ¦c=0¦
             ¦  cs:04C4:4F36063000 inc word ptr [TPDEMO- bx 3EEE ¦z=0¦
             ¦TPDEMO.121  i := 1;                      - cx 0000 ¦s=0¦


             ¦ cs:04C8 C:43FE0100  word ptr [bp+02].000- dx 5920 ¦o=0¦
             ¦TPDEMO.122: while i <= Length(S) do      - si 3CEC ¦p=0¦
             ¦ cs:04C0 C47ED4    les  di,[bp+04]       - bp 3EF4 ¦a=0¦
             ¦ cs:0400 288A05    mov  al,es:[di]       - sp 3EF4 ¦i=1¦
             ¦ cs:0403 3D84      xor  ah,ah            - ds 5920 ¦d=0¦
             ¦ cs:0405 3B48FE    cmp ax,[bp+02]        - es 5920 ¦   ¦
             ¦ cs:0408 7D03      jnl TPDEMO.125 (04DD) - ss 595A ¦   ¦
             ¦ cs:040A 898A00    jmp TPDEMO.148        - cs 548A ¦   ¦
             ¦TPDEMO.125 while (i <= Length(S)) and notv ip 04C8 ¦   ¦
             ¦<--------------------------------------->¦-------------¦
             ¦ ds: 0000 00 00 00 00 00 00 00 00         ¦             ¦
             ¦ ds:0008 5A 5D 5A 5D 5A 5D 00 00         ¦ ss:3EF2 548A¦
             ¦ ds:0010 00 00 00 00 00 00 5A 5D         ¦ ss:3EF0>04C1¦
             ¦ ds:0018 00 00 5A 5D 00 00 00 90         ¦ ss:3EEE 0246¦
             L=======================================================-
            Рис. 11.1 Окно CPU
            Окно CPU (ЦП) можно создать,  выбрав команду основного  меню
       View¦CPU  (Обзор¦Центральный  процессор).  В зависимости от того,
       что вы просматриваете в текущем окне, окно CPU будет позициониро-
       вано на соответствующие код,  данные или стек.  Это предоставляет
       удобный способ просматривать код,  данные или стек (соответствую-
       щие  текущему положению курсора) "на нижнем уровне".  В следующей
       таблице показано,  где будет позиционирован курсор при выборе ко-
       манды CPU:
        ----------------------------------------------------------------
        Текущее окно         Область окна CPU      Позиционируется на...
        ----------------------------------------------------------------
        Окно Stack (Стек)           Stack (Стек)          Текущие SS:SP
        Окно Module (Модуль)        Code (Код)            Текущие SS:SP


        Окно Variable (Переменная)  Данные/Код            Адрес элемента
        Окно Watches (Просмотр)     Данные/Код            Адрес элемента
        Окно Inspector (Проверка)   Данные/кодж           Адрес элемента
        Точка останова (не          Код                   Адроес точки
        глобальная)                                       останова

       TDeb 3.0 #2-3                = 44 =
        ----------------------------------------------------------------
            Если TDW вновь получает управление от вашей прикладной прог-
       раммы, а текущим выполняемым кодом является код Windows  или DLL,
       то TDW автомачески переводит вас в окно CPU.
            Строка в  верхней части окна CPU (ЦП) показывает тип процес-
       сора (8086,  80186,  80286 или 80386). Окно CPU имеет пять облас-
       тей (или  6  в TDW).  Чтобы переходить из одной области в другую,
       можно использовать клавиши Tab или Shift-Tab. В верхней левой об-
       ласти (области кода) выводится дисассемблированный код программы,
       чередующийся со строками исходного текста. Во второй области (об-
       ласти регистров) показано содержимое регистров ЦП. Правая область
       представляет собой область флагов, где выводится состояние восьми
       флагов  ЦП.  В нижней левой области (области данных) в непосредс-
       твенном шестнадцатиричном виде выводится любая выбранная вами об-
       ласть  памяти.  В  нижней правой области (области стека) показано
       содержимое стека.
            Если вы работаете с TDW,  то в окне CPU имеется дополнитель-
       ная область - область селекторов. Эта область, которая расположе-
       на слева от области кода и области данных,  показывает все селек-
       торы Windows и показывает содержимое каждого из них.
            Как и во всех других окнах,  нажатие клавиш Alt-F10 приводит
       к выводу локального меню области кода. Если разрешено использова-
       ние сокращений с клавишей Ctrl,  то нажатие клавиши Ctrl с первой


       буквой  нужной команды может использоваться для непосредственного
       доступа к команде.
            В области кода, данных и стека для смещения начального адре-
       са вывода  на  1  байт  вверх или вниз можно использовать клавишу
       Ctrl со стрелками.  Если вы хотите просто слегка сместить изобра-
       жение, это легче, чем использовать команду Goto (Переход).

       TDeb 3.0 #2-3                = 45 =
                                Область кода
       -----------------------------------------------------------------
            В этой области по выбранному вами  адресу  выводятся  дисас-
       семблированные инструкции.
                 Примечание: Стрелка (>) в области кода показывает теку-
            щий адрес программы (CS:IP). В области стека стрелка показы-
            вает текущий указатель стека (SS:SP).
            В левой  части  каждой  дисассемблированной строки выводится
       адрес инструкции.  Адрес выводится либо в виде шестнадцатиричного
       значения сегмента и смещения,  либо со значением сегмента,  заме-
       ненным именем регистра CS (если значение сегмента совпадает с те-
       кущим  значение  регистра CS).  Эта область имеет ширину (которая
       может переключаться или настраиваться),  достаточную  для  вывода
       всех образующих  инструкцию байт.  Дисассемблированная инструкция
       выводится справа.
            Если в  подсвеченной  инструкции области кода имеется ссылка
       на память,  то адрес памяти и его текущее содержимое выводятся  в
       верхней строке  окна  CPU.  Это позволяет вам увидеть как операнд
       инструкции,  который указывает на память, так и значение, которое
       будет записано или считано.
                                Дисассемблер
       -----------------------------------------------------------------
            В области  кода  автоматически дисассемблируются и выводятся
       на экран инструкции вашей  программы.  Если  адрес  соответствует


       глобальному,  статическому  идентификатору или номеру строки,  то
       ( если режим вывода Mixed установлен в значение Yes) перед  дисас-
       семблированной  инструкцией  выводится строка.  Кроме того,  если
       имеется строка исходного кода, соответствующая адресу идентифика-
       тора, то она выводится после идентификатора.
            Глобальные идентификаторы  выводятся  просто  в  виде  имени
       идентификатора. Статические идентификаторы выводятся в виде имени
       модуля, за которым следует символ # или точка (.) и имя статичес-
       кого идентификатора.  Номера строк выводятся в виде имени модуля,
       за которым  следует разделяющий символ # или точка (.) и десятич-
       ный номер строки.
            При выводе непосредственного операнда вы  можете  определить
       его размер по числу цифр. Непосредственное байтовое значение сос-
       тоит из 2 цифр, а непосредственное значение размером в слово - из
       4 цифр.
            Турбо отладчик  может  распознавать наличие числового сопро-
       цессора 8087/80287/80387 и дисассемблировать соответствующие инс-
       трукции с плавающей точкой.
            Мнемоника инструкции  RETF  показывает,  что  это инструкция

       TDeb 3.0 #2-3                = 46 =
       возврата дальнего типа.  Обычная мнемоника RET свидетельствует  о
       ближнем возврате.
            Там, где  это  возможно,  инструкции  JMP и CALL выводятся в
       символическом виде.  Если CS:IP указывают на инструкцию  JMP  или
       инструкцию  условного  перехода,  то  стрелка  (стрелка вверх или
       вниз), показывающая направление перехода, будет выводиться только
       в  том  случае,  если  выполнение инструкции приведет к переходу.
       Кроме того,  адреса памяти, использующиеся в инструкциях MOV, ADD
       и др., выводятся в виде символических адресов.

       TDeb 3.0 #2-3                = 47 =
                         Локальное меню области кода
       -----------------------------------------------------------------


            Если вы не перешли в область  кода,  используйте  для  этого
       клавиши Tab или Shift-Tab.  Затем для вывода локального меню наж-
       мите клавиши Alt-F10.
                       ---------------¬
                       ¦ Goto...      ¦     Переход
                       ¦ Origin       ¦     Начало
                       ¦ Follow       ¦     Следующая
                       ¦ Caller       ¦     Вызывающая
                       ¦ Previous     ¦     Предыдущая
                       ¦ Search...    ¦     Поиск
                       ¦ View source  ¦     Просмотр исходного кода
                       ¦ Mixed    Yes ¦     Смешанный
                       +--------------+
                       ¦ New cs:ip    ¦     Новый CS:IP
                       ¦ Assemble...  ¦     Ассемблер
                       ¦ I¦O        > ¦     Ввод-вывод
                       L---------------
                               Команда Goto...
       -----------------------------------------------------------------
            После выбора  команды Goto (Переход) вам выводится подсказка
       для ввода нового адреса,  на который вы хотите перейти. Вы можете
       ввести адрес,  выходящий за пределы программы, что позволяет про-
       верить базовую  систему  ввода-вывода (BIOS),  внутренние области
       DOS и резидентные утилиты.  Полное описание ввода адресов  содер-
       жится в Главе 9.
            Команда Previous (Предыдущий) восстанавливает область кода в
       то  состояние (позицию),  которое она имела до выполнения команды
       Goto.
                               Команда Origin
       -----------------------------------------------------------------
            Команда Origin  (Начало)  позиционирует вас на текущий адрес
       программы в соответствии со значениями регистров CS:IP.
            Команда Previous (Предыдущий) восстанавливает область кода в
       то  состояние (позицию),  которое она имела до выполнения команды


       Origin.
                               Команда Follow
       -----------------------------------------------------------------
            Команда Follow (Следующий) позиционирует вас по целевому ад-
       ресу подсвеченной в данный момент инструкции.  Область кода пози-
       ционируется  заново,  чтобы  вывести код по адресу,  указанному в
       подсвеченной в данный момент инструкции, по которому будет переда-

       TDeb 3.0 #2-3                = 48 =
       но управление. Для условных переходов адрес показывается в случае
       выполнения перехода.
            Эту команду можно использовать с инструкциями CALL, JMP, ин-
       струкциями условных переходов (JZ, JNE, LOOP, JCXZ и т.д.) и инс-
       трукциями INT.
            Команда Previous (Предыдущий) восстанавливает область кода в
       то  состояние (позицию),  которое она имела до выполнения команды
       Follow.
                               Команда Caller
       -----------------------------------------------------------------
            Команда Caller  (Вызывающая  программа) позиционирует вас на
       инструкцию, по которой была вызвана текущая подпрограмма или пре-
       рывание.
            Данная команда будет работать не всегда.  Если процедура об-
       работки прерывания или подпрограмма занесла в стек элементы  дан-
       ных, иногда Турбо отладчик не может определить, откуда был выпол-
       нен вызов.
            Команда Previous (Предыдущий) восстанавливает область кода в
       то состояние (позицию),  которое она имела до выполнения  команды
       Caller.
                              Команда Previous
       -----------------------------------------------------------------
            Команда Previous (Предыдущий) восстанавливает позицию облас-
       ти кода в соответствии с адресом,  который был текущим перед пос-
       ледней командой, явно изменившей его значение. Использование кла-
       виш   перемещения  (стрелок)  или  PgUp  и  PgDn  не  приводит  к


       запоминанию позиции.
            При использовании команды Previous позиция окна кода запоми-
       нается,  поэтому  повторное использование этой команды приводит к
       переключению между двумя адресами (туда и обратно).
                             Команда Search...
       -----------------------------------------------------------------
            Команда Search  (Поиск) позволяет вам вводить инструкцию или
       список байт,  которые  вы хотите найти.  Вводите инструкцию точно
       также, как это делается в команде Assemble (Ассемблирование).
            Будьте внимательны при поиске инструкций.  Следует выполнять
       поиск только тех инструкций,  которые не изменяют байт, в которые
       они ассемблируются,  в зависимости от того,  где в памяти они ас-
       семблируются.  Например,  поиск  следующих инструкций проблемы не

       TDeb 3.0 #2-3                = 49 =
       представляет:
               PUSH    DX
               POP     [DI+4]
               ADD     AX,100
       а попытка поиска следующих инструкций может привести к непредска-
       зуемым результатам:
               JE      123
               CALL    MYFUNC
               LOOP    $-10
            Вместо инструкции  можно  вводить  также список байт.  Более
       подробно об этом рассказывается в Главе 9.
                             Команда View Source
       -----------------------------------------------------------------
            Команда View Source (Просмотр исходного кода) для вывода ис-
       ходного  кода,  соответствующего текущей дисассемблированной инс-
       трукции открывает окно Module (Модуль). Если соответствующего ис-
       ходного кода нет (например, вы находитесь в коде Windows, или от-
       сутствует  отладочная информация),  вы просто остаетесь в области
       кода.
                                Команда Mixed
       -----------------------------------------------------------------
            Локальная команда Mixed (Смешанный) позволяет  выбрать  один


       из трех способов вывода на экран дисассемблированных инструкций и
       исходного кода:
       No (Нет)        Исходный код не выводится,  выводятся только  ди-
                       сассемблированные инструкции.
       Yes (Да)        Перед первой дисассемблированной инструкцией, со-
                       ответствующей данной строке, выводится строка ис-
                       ходного кода.  Область устанавливается  в  данный
                       режим,  если исходный модуль написан на языке вы-
                       сокого уровня.
       Both (Оба)      Для тех  строк,  которым  соответствует  исходный
                       код,  дисассемблированные строки заменяются стро-
                       ками  исходного текста.  В противном случае выво-
                       дятся дисассемблированные инструкции. Используйте
                       этот  режим,  когда  вы отлаживаете модуль на Ас-
                       семблере и хотите видеть строку исходного текста,
                       а не соответствующую дисассемблированную инструк-
                       цию. Область устанавливается в данный режим выво-
                       да, если текущим модулем является исходный модуль
                       Ассемблера.

       TDeb 3.0 #2-3                = 50 =
                              Команда New CS:IP
       -----------------------------------------------------------------
            Команда New CS:IP (Новое значение регистров CS:IP)  устанав-
       ливает значение счетчика адреса программы (значение регистров CS:
       IP) в соответствии с текущим (подсвеченным) адресом.  При повтор-
       ном  запуске  вашей программы выполнение начнется с этого адреса.
       Это полезно использовать,  когда вы хотите пропустить  какие-либо
       участки кода, не выполняя их.
            Пользоваться данной командой нужно очень аккуратно.  Если вы
       изменяете  значение регистров CS:IP в соответствии с адресом, где
       стек имеет состояние, отличное от текущего значения CS:IP, то это


       почти  наверняка  приведет к аварийному завершению программы.  Не
       пользуйтесь этой командой, чтобы установить регистры CS:IP в зна-
       чение адреса, лежащего за пределами программы.
                             Команда Assemble...
       -----------------------------------------------------------------
            Команда Assemble  (Ассемблирование) ассемблирует инструкцию,
       заменяя текущую (подсвеченную)  инструкцию.  Инструкция,  которую
       требуется  ассемблировать,  вводится в ответ на подсказку.  Более
       детально это описывается далее в данной главе в разделе  "Ассемб-
       лер".
            Данную команду можно вызвать,  если просто  начать  набирать
       оператор, который вы хотите ассемблировать. Когда вы делаете это,
       то выводится окно подсказки (так же, как при использовании коман-
       ды Assemble).
                                 Команда I/O
       -----------------------------------------------------------------
            Команда I/O (Ввод-вывод) считывает или  записывает  значение
       в пространство адресов ввода-вывода ЦП и позволяет  вам проверить
       содержимое  регистров ввода-вывода и записать в них значения. При
       этом выводится меню, показанное ниже:
                        -------------¬
                        ¦ In byte    ¦    Ввести байт
                        ¦ Out byte   ¦    Вывести байт
                        ¦ Read byte  ¦    Прочитать байт
                        ¦ Write byte ¦    Записать байт
                        L-------------
                               Команда In Byte
       -----------------------------------------------------------------
            Команда In Byte (Ввести байт) считывает байт из адреса ввода
       -вывода.  Вам будет выведена подсказка для ввода адреса ввода-вы-
       вода,  значение которого вы хотите проверить.  Для считывания  из
       адреса ввода-вывода значения размером в слово используйте команду



       TDeb 3.0 #2-3                = 51 =
       Read word (Считать слово).
                              Команда Out Byte
       -----------------------------------------------------------------
            Команда Out Byte ( Вывести байт) записывает байт по заданному
       адресу ввода-вывода. Вам будет выведена подсказка для ввода адре-
       са ввода-вывода и значение, которое вы хотите записать. Для запи-
       си по адресу ввода-вывода значения размером в  слово  используйте
       команду Read word (Считать слово).
                              Команда Read Word
       -----------------------------------------------------------------
            Команда Read Word (Считать слово) считывает слово  из адреса
       ввода-вывода. Вам будет выведена подсказка для ввода адреса ввода
       -вывода, значение которого вы хотите проверить. Для считывания из
       адреса  ввода-вывода значения размером в байт используйте команду
       Read byte (Считать байт).
                             Команда Write Word
       -----------------------------------------------------------------
            Команда Write  Word (Записать слово) записывает слово по ад-
       ресу ввода-вывода.  Вам будет выведена подсказка для ввода адреса
       ввода-вывода и значения, которое вы хотите записать. Для считыва-
       ния из адреса ввода-вывода значения размером в  байт  используйте
       команду Write byte (Считать байт).
            Обращаться к пространству адресов ввода-вывода, где находят-
       ся такие контроллеры периферийных устройств,  как контроллер дис-
       ка,  платы  последовательных портов и видеоадаптеры,  можно с по-
       мощью инструкций Ассемблера IN и OUT.
             Будьте внимательны при использовании данных команд. В неко-
       торых  портах  ввода-вывода  считывание из порта рассматривается,
       как значительное событие,  приводящее к тому,  что устройство вы-
       полняет некоторые действия, такие, как переустановка бита состоя-


       ния или загрузка в порт нового байта.  При неограниченном исполь-
       зовании  данных  команд  вы  можете  нарушить  нормальную  работу
       отлаживаемой программы или устройства.

       TDeb 3.0 #2-3                = 52 =
                         Область регистров и флагов
       -----------------------------------------------------------------
            В области регистров ( верхняя область справа от области кода)
       выводится содержимое регистров центрального процессора.
            Верхней правой областью является область флагов, где показа-
       но содержимое  восьми  флагов центрального процессора.  В области
       флагов показано значение каждого флага ЦП.  Список различных фла-
       гов и то, как они выводятся в области флагов, показан в следующей
       таблице:
                 ----------------------T-----------------------¬
                 ¦   Буква в области   ¦     Название флага    ¦
                 +---------------------+-----------------------+
                 ¦         c           ¦     Флаг переноса     ¦
                 ¦         z           ¦     Флаг нуля         ¦
                 ¦         s           ¦     Флаг знака        ¦
                 ¦         o           ¦     Флаг переполнения ¦
                 ¦         p           ¦     Флаг четности     ¦
                 ¦         a           ¦     Флаг дополнитель- ¦
                 ¦                     ¦      ного переноса    ¦
                 ¦         i           ¦     Флаг разрешения   ¦
                 ¦                     ¦      прерывания       ¦
                 ¦         d           ¦     флаг направления  ¦
                 L---------------------+------------------------
                      Локальное меню области регистров
       -----------------------------------------------------------------
            Для вывода локального меню области регистров нажмите клавиши
       Alt-F10. Если разрешено использование сокращений с клавишей Ctrl,


       то  нажатие клавиши Ctrl с первой буквой нужной команды может ис-
       пользоваться для непосредственного доступа к команде.
                                          --------------------¬
                   Увеличение             ¦ Increment         ¦
                   Уменьшение             ¦ Decrement         ¦
                   Обнуление              ¦ Zero              ¦
                   Изменение              ¦ Change...         ¦
                   32-разрядные регистры  ¦ Register 32-bit No¦
                                          L--------------------
                               Команда Increment
       -----------------------------------------------------------------
            Команда Increment  (Увеличение)  добавляет  одно  значение к
       подсвеченному в данный момент регистру.  Это позволяет легко исп-
       равить небольшие ошибки в значении регистра.
                               Команда Decrement
       -----------------------------------------------------------------
            Команда Decrement (Уменьшение) вычитает 1 из значения  подс-

       TDeb 3.0 #2-3                = 53 =
       веченного в данный момент регистра.
                                 Команда Zero
       -----------------------------------------------------------------
            Команда Zero (Ноль) обнуляет содержимое текущего (подсвечен-
       ного) регистра.
                               Команда Change...
       -----------------------------------------------------------------
            Команда Change   (Изменение)  изменяет  содержимое  текущего
       (подсвеченного) регистра. Для ввода нового значения вам выводится
       подсказка.  При вводе нового значения можно использовать средство
       вычисления выражений.
            Эту команду можно вызвать также, если просто начать набирать
       новое значение регистра.  Когда вы делаете  это,  выводится  окно
       подсказки.
                           Команда Registers 32-bit


       -----------------------------------------------------------------
            Команда Registers 32-bit (32-разрядные регистры) позволяет с
       вывода регистров ЦП,  как 16-разрядных значений, на 32-разрядные.
       При работе на процессора 80386 вы обычно видите 32-разрядные  ре-
       гистры (если только не использована данная команда для переключе-
       ния на 16-разрядные регистры).  32-разрядные регистры  необходимы
       только в том случае, если вы отлаживаете программу, в которой ис-
       пользуются возможности 32-разрядной адресации процессора 386. Ес-
       ли  вы  отлаживаете  обычную  программу,  в  которой используется
       16-разрядная адресация,  можно выбрать вывод 16-разрядных регист-
       ров.
                         Локальное меню области флагов
       -----------------------------------------------------------------
            Для вывода  локального  меню  области флагов нажмите клавиши
       Alt-F10. Если разрешено использование сокращений с клавишей Ctrl,
       то  нажатие клавиши Ctrl с первой буквой нужной команды может ис-
       пользоваться для непосредственного доступа к команде.
                                          ---------¬
                     Переключение         ¦ Toggle ¦
                                          L---------

       TDeb 3.0 #2-3                = 54 =
                                Команда Toggle
       -----------------------------------------------------------------
            Команда Toggle (Переключение) устанавливает значение флага в
       0,  если он был равен 1,  и в 1,  если он был равен 0. Значение 0
       означает,  что флаг сброшен, а 1 - что он установлен. Для измене-
       ния (инвертирования) значения текущего (подсвеченного) флага мож-
       но также нажать клавишу Enter.

       TDeb 3.0 #2-3                = 55 =
                              Область селектора
       -----------------------------------------------------------------
            В этой области выводится список селекторов защищенного режи-


       ма и указывается некоторая информация для каждого из них.
            Селектор может быть допустимым или нет.  Допустимый селектор
       указывает на ячейку таблицы дескрипторов защищенного режима,  со-
       ответствующего адресу памяти.  Если селектор недопустим, то он не
       используется.
            Для допустимого селектора в области выводится следующее:
            - являются ли содержимым данные или код;
            - загружена ли область памяти, на которую ссылается селектор
              (присутствует в памяти) или разгружена (выведена на диск);
            - длина  сегмента  памяти,  на которую ссылается селектор (в
              байтах).
            Если селектор ссылается на сегмент данных, то имеется допол-
       нительная информация по полномочиям доступа (Read/Write - Чтение/
       Запись или Read only - только чтение)  и  направление  расширения
       сегмента в памяти (Up - вверх или Down - вниз).
                       Локальное меню области селектора
       -----------------------------------------------------------------
            Для вывода локального меню в области селектора нажмите  кла-
       виши Alt-F10, или, если разрешено использование сокращений с кла-
       вишей Ctrl, для доступа к нужной команды используйте клавишу Ctrl
       с подсвеченной буквой команды.
                                          -------------¬
                     Селектор             ¦ Selector   ¦
                     Проверка             ¦ Examine... ¦
                                          L-------------
            Локальное меню области селектора вы можете  использовать для
       перехода к  новому селектору (команда Selector) или просмотра со-
       держимого селектора,  который подсвечен в данный момент в области
       селектора (команда Examine).  Содержимое выводится в области кода
       или в области данных, в зависимости от его характера.
                               Команда Selector
       -----------------------------------------------------------------


            Данная команда  выводит  вам  подсказку для ввода селектора,
       который нужно вывести в области.  Для ввода селектора  вы  можете
       использовать полный синтаксис выражений. Если вы вводите числовое
       значение, то TDW подразумевает,  что оно десятичное (если  вы  не
       используете синтаксис текущего языка для указания того,  что зна-

       TDeb 3.0 #2-3                = 56 =
       чение является шестнадцатиричным).
            Например, если текущим языком является язык  Си,  вы  можете
       ввести шестнадцатиричное  значение  селектора  7F  как Ox7F.  Для
       Паскаля вы могли бы ввести его как 7F.  Чтобы перейти к селектору
       7F, можно было бы также ввести десятичное значение 127.
            Другим методом  ввода значения селектора является вывод окна
       CPU и проверка содержимого сегментных регистров. Если регистр со-
       держит интересующий вас селектор, то вы можете ввести имя регист-
       ра с предшествующим символом подчеркивания (_).  Например, вы мо-
       жете задать имя сегментного регистра данных, как _DS.
                                Команда Examine
       -----------------------------------------------------------------
            Команда Examine (Проверка) выводит содержимое области  памя-
       ти,  на которую ссылается текущий селектор, и переключается в об-
       ласть,  где выводится содержимое. Если селектор указывает на сег-
       мент   кода,   то  содержимое  выводится  в  области  кода.  Если
       содержимое представляет собой данные,  то оно выводится в области
       данных.

       TDeb 3.0 #2-3                = 57 =
                               Область данных
       -----------------------------------------------------------------
            В этой области показано непосредственное содержимое  выбран-
       ной вами области памяти.  В левой части каждой строки показан ад-
       рес данных,  выводимых на данной строке.  Адрес выводится в  виде
       шестнадцатиричного значения сегмента и смещения или значение сег-


       мента заменяется именем сегмента DS,  если значение сегмента сов-
       падает с текущим содержимым регистра DS.
            Далее в области выводится непосредственное содержимое одного
       или более элементов данных. Формат этой области зависит от режима
       вывода,  выбранного  с помощью команды локального меню Display As
       (Вывести как...).  Если вы выбираете один из  форматов  вывода  с
       плавающей точкой (Copm,  Float,  Double,  Extended), то на каждой
       строке выводится одно число с плавающей точкой. При байтовом фор-
       мате на одной строке выводится 8 байт, в формате размером в слово
       (Word) - 4 слова на строку,  а в длинном  формате  (Long)  -  два
       длинных слова на строку.
            В правой части каждой строки выводятся символы, соответству-
       ющие показанным байтам.  Турбо отладчик  выводит  все  печатаемые
       значения, соответствующие байтовым эквивалентам, поэтому не удив-
       ляйтесь,  если на экране вы увидите странные символы - просто это
       символьный эквивалент шестнадцатиричных значений байт данных.
            Число байт,  выводимых  на  каждой строке бывает различным и
       зависит от формата, заданного к команде Display As.
            Если вы  используете  окно  данных  для проверки содержимого
       дисплейной памяти, данных базовой системы ввода-вывода или векто-
       ров  в младших адресах памяти,  вы увидите значения,  находящиеся
       там во время выполнения отлаживаемой программы,  а действительные
       значения при работе Турбо отладчика. Они не совпадают с теми зна-
       чениями,  которые находятся в указанных областях памяти в тот мо-
       мент,  когда вы их просматриваете. Турбо отладчик определяет, что
       вы обращаетесь к областям данных,  которые также используются  им
       самим, и извлекает значения этих данных из их копии для программы
       пользователя.

       TDeb 3.0 #2-3                = 58 =
                        Локальное меню области данных


       -----------------------------------------------------------------
            Для вывода  локального  меню  области данных нажмите клавиши
       Alt-F10. Если разрешено использование сокращений с клавишей Ctrl,
       то  нажатие клавиши Ctrl с первой буквой нужной команды может ис-
       пользоваться для непосредственного доступа к команде.
                      -----------------¬
                      ¦ Goto           ¦  Переход
                      ¦ Search         ¦  Поиск
                      ¦ Next           ¦  Следующая
                      ¦ Change         ¦  Изменение
                      ¦ Follow        >¦  Следовать
                      ¦ Previous       ¦  Предыдущий
                      +----------------+
                      ¦ Display as    >¦  Вывести как...
                      ¦ Block         >¦  Блок
                      L-----------------
                                 Команда Goto
       -----------------------------------------------------------------
            Команда Goto (Переход) позиционирует вас на адрес  в данных.
       Введите  новый  адрес,  на  который вы хотите перейти.  Вы можете
       ввести внутренний адрес DOS,  адрес,  расположенный в резидентных
       утилитах  или  вне  вашей программы,  что позволяет вам проверить
       данные в базовой системе ввода-вывода.  Полное описание ввода ад-
       ресов содержится в Главе 9.
                                Команда Search
       -----------------------------------------------------------------
            Команда Search (Поиск) выполняет поиск строки символов,  на-
       чиная с текущего адреса памяти, указанного позицией курсора. Вве-
       дите список байт для поиска.  При достижении конца сегмента поиск
       не будет автоматически возобновляться с его начала.
            Подробнее о списках байт рассказывается в Главе 9.
                                 Команда Next
       -----------------------------------------------------------------


            Команда Next  (Следующий) выполняет поиск следующего вхожде-
       ния списка  байт,  который  вы задали ранее в команде Search (По-
       иск).
                               Команда Change...
       -----------------------------------------------------------------
            Команда Change (Изменение) позволяет изменять байты по теку-
       щему месту расположения курсора. Если содержимое выводится в коде
       ASCII  или  в байтовом формате,  то выводится подсказка для ввода

       TDeb 3.0 #2-3                = 59 =
       списка байт.  В противном случае запрашивается элемент, соответс-
       твующий текущему формату вывода.  Полное описание списка байт со-
       держится в Главе 9.
            Эту команду можно вызвать также, если просто начать набирать
       новое значение или значения. Когда вы делаете это, выводится окно
       подсказки (как при использовании команды Change).
                                Команда Follow
       -----------------------------------------------------------------
            По данной команде выводится следующее локальное меню:
                                 --------------------------¬
               Ближний код       ¦ Near code               ¦
               Дальний код       ¦ Far code                ¦
                                 +-------------------------+
               Смещение данных   ¦ Offset to data          ¦
               Сегмент:смещение  ¦ Cegment:offset to data  ¦
               Базовый сегмент   ¦ Base segment:0 to data  ¦
                                 L--------------------------
                               Команда Near Code
       -----------------------------------------------------------------
            Данная команда  интерпретирует  слово под курсором в области
       данных, как смещение в текущем сегменте кода  (как  это  задается
       регистром CS). Область кода становится текущей областью и позици-
       онируется на данный адрес.


                               Команда Far Code
       -----------------------------------------------------------------
            Данная команда интерпретирует двойное слово под  курсором  в
       области данных, как адрес дальнего типа (сегмент и смещение). Об-
       ласть кода становится текущей и позиционируется на данный адрес.
                           Команда Offset to Data
       -----------------------------------------------------------------
            Данная команда позволяет вам следовать по цепочке указателей
       размером в  слово (ближнего типа,  где используется только смеще-
       ние). Область данных устанавливается в соответствии со смещением,
       заданным словом в памяти по текущей позиции курсора.
                        Команда Segment:Offset to Data
       -----------------------------------------------------------------
            Эта команда  позволяет  вам  следовать по цепочке указателей
       дальнего типа размером в двойное слово (где  используется сегмент
       и  смещение).  Область  данных  устанавливается в соответствии со
       смещением, заданным двойным словом в памяти  по  текущей  позиции
       курсора.

       TDeb 3.0 #2-3                = 60 =
                        Команда Base Segment:0 to Data
       -----------------------------------------------------------------
            Данная команда интерпретирует слово под курсором,  как адрес
       сегмента, и позиционирует область данных на начало сегмента.
                Команда Previous локального меню области данных
       -----------------------------------------------------------------
            Команда Previous (Предыдущий) восстанавливает  адрес области
       данных в адрес, который был до последней команды, явно изменившей
       значение текущего адреса.  Использование клавиш стрелок и  клавиш
       PgUp и PgDn не приводит к запоминанию позиции.
            Турбо отладчик  поддерживает стек из пяти последних адресов,


       поэтому вы можете вернуться назад после многократного (<  5)  ис-
       пользования команд локального меню Follow, или команды Goto.
                              Команда Display As
       -----------------------------------------------------------------
            Команда Display  As (Режим вывода) позволяет выбирать формат
       вывода в области данных. Вы можете выбирать один из форматов дан-
       ных,  использующихся в языке Си, Паскале или Ассемблере. Эти фор-
       маты можно выбрать из меню:
                                      -----------¬
              Байт                    ¦ Byte     ¦
              Слово                   ¦ Word     ¦
              Длинный тип             ¦ Long     ¦
              Сложный тип             ¦ Comp     ¦
              С плавающей точкой      ¦ Float    ¦
              Вещественный            ¦ Real     ¦
              С удвоенной точностью   ¦ Double   ¦
              С расширенной точностью ¦ Extended ¦
                                      L-----------
                                 Команда Byte
       -----------------------------------------------------------------
            Команда Byte (Байт) устанавливает область данных в режим вы-
       вода шестнадцатиричных  байтовых  данных.  Это соответствует типу
       данных char в языке Си и типу byte в Паскале.
                                 Команда Word
       -----------------------------------------------------------------
            Команда Word  (Слово)  устанавливает  область данных в режим
       вывода шестнадцатиричных слов.  Это соответствует типу данных int
       в языке Си и типу word в Паскале.

       TDeb 3.0 #2-3                = 61 =
                                 Команда Long
       -----------------------------------------------------------------
            Команда Long (Длинный) устанавливает область данных  в режим
       вывода длинных  шестнадцатиричных целых чисел.  Это соответствует
       типу данных long в языке Си и типу longint в Паскале.


                                 Команда Comp
       -----------------------------------------------------------------
            Команда Comp  (Cложный) устанавливает область данных в режим
       вывода 8- байтовых целых чисел. Выводится десятичное значение чис-
       ла. Это соответствует типу данных comp в Паскале (формат IEEE).
                                 Команда Float
       -----------------------------------------------------------------
            Команда Float (C  плавающей  точкой)  устанавливает  область
       данных в режим вывода 6-байтовых чисел с плавающей точкой.  Выво-
       дится значение числа с плавающей точкой в  научном представлении.
       Это соответствует вещественному типу данных (real) в Паскале.
                                Команда Double
       -----------------------------------------------------------------
            Команда Double (C двойной точностью)  устанавливает  область
       данных в режим вывода 8-байтовых чисел с плавающей точкой.  Выво-
       дится значение числа с плавающей точкой в  научном представлении.
       Это соответствует типу данных с двойной точностью (double) в язы-
       ке Си.
                               Команда Extended
       -----------------------------------------------------------------
            Команда Extended (C расширенной точностью) устанавливает об-
       ласть данных в режим вывода 10-байтовых чисел с плавающей точкой.
       Выводится значение числа с плавающей точкой в научном представле-
       нии. Это внутренний формат, используемый в сопроцессоре 80х87. Он
       соответствует также типу длинных данных с двойной точностью (long
       double) в языке Си и типу с расширенной  точностью  (extended)  в
       Паскале.
                                 Команда Block
       -----------------------------------------------------------------
            Команда Block  (Блок) позволяет вам работать с блоками памя-
       ти.  Вы можете перемещать,  очищать,  присваивать значения блокам


       памяти,  а также записывать и считывать блоки памяти из файлов на
       диске. По данной команде на экран выводится всплывающее меню, по-
       казанное ниже:

                                        = 62 =
                        ------------¬
                        ¦ Clear...  ¦   Очистка
                        ¦ Move...   ¦   Перемещение
                        ¦ Set...    ¦   Установка
                        ¦ Read...   ¦   Чтение
                        ¦ Write...  ¦   Запись
                        L------------
                                 Команда Clear
       -----------------------------------------------------------------
            Команда Clear (Очистка) устанавливает непрерывный блок в па-
       мяти в  значение 0.  Адрес блока и число байт,  которые требуется
       очистить, запрашиваются в выводимой подсказке.
                                 Команда Move
       -----------------------------------------------------------------
            Команда Move  (Перемещение)  копирует  блок памяти из одного
       адреса в другой. Адреса исходного и целевого блока, а также число
       копируемых байт, будут запрашиваться в выводимой подсказке.
                                  Команда Set
       -----------------------------------------------------------------
            Команда Set  (Присваивание) присваивает непрерывному блоку в
       памяти конкретное байтовое значение. Адрес блока, число байт, ко-
       торым требуется присвоить значение,  а также само значение запра-
       шиваются в выводимой подсказке.
                                 Команда Read
       -----------------------------------------------------------------
            Команда Read (Cчитывание) считывает все содержимое или часть
       файла  в  блок  памяти.  Вам сначала будет выведена подсказка для
       ввода имени считываемого файла, затем адреса, куда требуется счи-
       тать информацию, и числа считываемых байт.
                                 Команда Write


       -----------------------------------------------------------------
            Команда Write (Запись) записывает блок памяти  в  файл.  Вам
       сначала будет выведена подсказка для ввода имени файла, куда тре-
       буется записать данные,  затем блока памяти,  который нужно запи-
       сать, и числа считываемых байт.

       TDeb 3.0 #2-3                = 63 =
                                Область стека
       -----------------------------------------------------------------
            В области стека (в нижнем правом углу окна CPU) показано со-
       держимое стека.
                                 Область стека
       -----------------------------------------------------------------
            В области стека для вывода локального меню  нажмите  клавиши
       Alt-F10. Если разрешено использование сокращений с клавишей Ctrl,
       то нажатие клавиши Ctrl с первой буквой нужной команды может  ис-
       пользоваться  для непосредственного доступа к команде данного ло-
       кального меню.
                                            ----------¬
                    Переход                 ¦Goto...  ¦
                    Начало                  ¦Origin   ¦
                    Следующий               ¦Follow   ¦
                    Предыдущий              ¦Previous ¦
                    Изменение               ¦Change...¦
                                            L----------
                                Команда Goto...
       -----------------------------------------------------------------
            Команда Goto  (Переход)  позиционирует вас на адрес в стеке.
       Введите новый адрес стека.  При желании вы можете  ввести  адрес,
       выходящий  за  пределы  стека программы,  хотя для проверки любых
       данных вне программы используется обычно область  данных.  Полное
       описание ввода адресов содержится в Главе 9.
            Команда Previous  (Предыдущий) восстанавливает область стека
       в то состояние (позицию), которое она имела до выполнения команды


       Goto.
                                Команда Origin
       -----------------------------------------------------------------
            Команда Origin (Начало) позиционирует вас на слово  в стеке,
       указанное текущим (подсвеченным) словом. Это полезно использовать
       для обратного отслеживания изменения границ стека при  возврате в
       вызывающую функцию.
            Команда Previous  (Предыдущий) восстанавливает область стека
       в то состояние (позицию), которое она имела до выполнения команды
       Origin.
                                Команда Follow
       -----------------------------------------------------------------
            Команда Follow (Следующий) позиционирует вас на слово в сте-
       ке,  указанное текущим (подсвеченным) словом. Это полезно исполь-

       TDeb 3.0 #2-3                = 64 =
       зовать для обратного  отслеживания  изменения  границ  стека  при
       возврате в вызывающую функцию.
            Команда Previous  (Предыдущий) восстанавливает область стека
       в то состояние (позицию), которое она имела до выполнения команды
       Follow.
                               Команда Previous
       -----------------------------------------------------------------
            Команда Previous (Предыдущий) восстанавливает позицию облас-
       ти стека в соответствии с адресом перед последней командой, кото-
       рая явно изменила выводимый адрес. Использование клавиш перемеще-
       ния  (стрелок) или PgUp и PgDn не приводит к запоминанию позиции.
            При использовании  команды Previous позиция окна стека запо-
       минается, поэтому повторное использование этой команды приводит к
       переключению между двумя адресами (туда и обратно).
                               Команда Change...
       -----------------------------------------------------------------
            Команда Change (Изменение) позволяет вам ввести новое значе-
       ние для текущего (подсвеченного) слова в  стеке.  Данную  команду


       можно  вызвать  также,  если просто начать вводить новое значение
       для подсвеченной записи в стеке.  Когда вы это делаете, выводится
       окно подсказки (как и при использовании команды Change).

       TDeb 3.0 #2-3                = 65 =
                                  Ассемблер
       -----------------------------------------------------------------
            Турбо отладчик  позволяет вам ассемблировать инструкции про-
       цессоров 8086,  80186 и 80286, а также арифметических сопроцессо-
       ров 8087, 80287 и 80387.
            Когда для   модификации  программы  используется  встроенный
       (внутренний) ассемблер Турбо отладчика, внесенные в нее изменения
       не  являются постоянными.  Если вы перезагрузите свою программу с
       помощью команд Run¦Program Reset (Выполнение¦Сброс программы) или
       загрузите другую программу с помощью команды File¦Open (Файл¦Отк-
       рыть), то все сделанные вами изменения будут потеряны.
            Обычно Ассемблер  используется  для  проверки   правильности
       предположений  о коррекции программы.  После того,  как вы убеди-
       тесь,  что при изменениях программа работает правильно, нужно из-
       менить  исходный  код и перекомпилировать и перекомпоновать прог-
       рамму.
            В следующих разделах описываются различия  между  встроенным
       Ассемблером и синтаксисом, воспринимаемым Турбо Ассемблером.
                   Переопределения размера адреса операнда
       -----------------------------------------------------------------
            Для вызовов (CALL) инструкции перехода  (JMP)  и  инструкций
       условного перехода (JNE,  JL, и т.д.) Ассемблер автоматически ге-
       нерирует наименьшую инструкцию,  с помощью которой можно  достичь
       целевого адреса. Перед целевым адресом, чтобы ассемблировать инс-
       трукцию с заданным размером,  можно использовать  переопределения
       NEAR (ближний) и FAR (дальний). Например:
               CALL    FAR XYZ


               JMP     NEAR    A1
                     Память и непосредственные операнды
       -----------------------------------------------------------------
            Когда вы  используете  в своей программе идентификатор в ка-
       честве операнда инструкции, нужно указать встроенному Ассемблеру,
       имеете ли вы в виду содержимое идентификатора или его адрес. Если
       вы используете просто имя идентификатора,  то Ассемблер интерпре-
       тирует его,  как адрес (как если бы перед ним использовалась опе-
       рация Ассемблера OFFSET).  Если идентификатор заключается в квад-
       ратные  скобки,  то  он  будет означать ссылку на память.  Если в
       вашей программе содержится определение данных:
               A       DW      4
       вы можете ссылаться на содержимое идентификатора  A, ассемблируя:
       с помощью [A].

       TDeb 3.0 #2-3                = 66 =
            Когда вы ассемблируете инструкцию или  вычисляете  выражение
       Ассемблера для ссылки на содержимое переменной,  используйте само
       имя переменной или имя переменной, заключенное в квадратные скоб-
       ки:
               mov     dx,A
               mov     ax,[a]
            Для ссылки на адрес переменных можно  использовать  операцию
       OFFSET:
            mov ax,offset a
                 Переопределение размера данных в операндах
       -----------------------------------------------------------------
            В некоторых  инструкциях перед операндом нужно задавать раз-
       мер операнда,  для чего используется одно из следующих выражений:
               BYTE PTR
               WORD PTR
            Приведем примеры  инструкций,  в  которых используются такие
       переопределения:
               add     BYTE PTR[si],10
               mov     WORD PTR[bp+10],99
            Кроме этих  переопределений  при  ассемблировании инструкций
       арифметических сопроцессором 8087¦80287  вы  можете  использовать
       следующие переопределения:


               DWORD PTR
               QWORD PTR
               TBYTE PTR
            Вот примеры таких переопределений:
               fild QWORD PTR[bx]
               stp  TBYTE PTR[bp+4]

       TDeb 3.0 #2-3                = 67 =
                            Строковые инструкции
       -----------------------------------------------------------------
            При ассемблировании  строковой  инструкции в самой мнемонике
       инструкции нужно указать размер (байт  или  слово),  в  противном
       случае  Ассемблер не воспримет такую мнемонику.  Например,  нужно
       использовать мнемонику STOSW, а не STOS WORD PTR[DI].
                                  Окно Dump
       -----------------------------------------------------------------
            В окне  Dupm  (Дамп)  выводится в непосредственном виде дамп
       любой области памяти. Оно работает так же, как область данных ок-
       на CPU (ЦП).
                 г=[*]==Dump====================3=====[ ][ ]¬
                 ¦ ds:0000 CD 20 00 A0 00 9A F0 FE = & U**  ^
                 ¦ ds:0008 1B 02 B2 01 22 31 7C 01 <.^%¦.`  -
                 ¦ ds:0010 22 31 88 02 52 2B E2 1D vX[1]4-#  -
                 ¦ ds:0018 01 01 01 00 03 FF FF FF
         v
                 L<---------------------------------------->-
            Рис. 11.2 Окно Dump
            Описание содержимого  и локального меню для данного окна со-
       держится ранее в разделе "Локальное меню области данных".
            Обычно это окно приходится использовать при отладке програм-
       мы на Ассемблере на уровне исходного кода,  когда вы хотите прос-
       мотреть (на нижнем уровне),  как выглядят некоторые области  дан-
       ных. Для  создания  окна  Dump  (Дамп) можно использовать команду
       View¦Dump (Обзор¦Дамп).
            Вы можете также использовать данное окно,  находясь  в  окне
       Inspector (Проверка), когда нужно в непосредственном виде увидеть
       байты проверяемого объекта.


Для получения окна Dump, позициониро-
       ванного   на   данные   в  окне  Inspector,  используйте  команду
       View¦Dump (Обзор¦Дамп).

       TDeb 3.0 #2-3                = 68 =
                               Окно Registers
       -----------------------------------------------------------------
            В окне Registers (Регистры) выводится содержимое регистров и
       флагов центрального процессора.  оно работает,  как сочетание об-
       ластей регистров и флагов в окне CPU (ЦП).
                            г=[*]==Regs===3=[ ][ ]¬
                            ¦ ax 0000       ¦ c=0 ¦
                            ¦ bx 0000       ¦ z=0 ¦
                            ¦ cx 0000       ¦ s=0 ¦
                            ¦ dx 0000       ¦ o=0 ¦
                            ¦ si 0000       ¦ p=0 ¦
                            ¦ di 0000       ¦ a=0 ¦
                            ¦ bp 0000       ¦ i=1 ¦
                            ¦ sp 2FFF       ¦ d=0 ¦
                            ¦ ds 61AF       ¦     ¦
                            ¦ es 61AF       ¦     ¦
                            ¦ ss 668F       ¦     ¦
                            ¦ cs 618F       ¦     ¦
                            ¦ ip 084E       ¦     ¦
                            L=====================-
            Рис. 11.3 Окно Registers
            Описание содержимого  и  локальных меню для этого окна можно
       найти в разделе "Локальное меню области регистров".
            Используйте данное окно,  когда при отладке на уровне исход-
       ного  кода программы на Ассемблере вы хотите просмотреть содержи-
       мое регистров.  Вы можете сократить размер окна Module (Модуль) и
       поместить рядом с ним окно Registers.
                 Примечание: Вы  можете  уменьшить  размер окна Module и
            вывести наряду с ним окно Registers (Регистры).

       TDeb 3.0 #2-3                = 69 =
                   Глава 12. Сопроцессор 80х87 и эмулятор
       -----------------------------------------------------------------


            Если в вашей программе используются числа с  плавающей  точ-
       кой,  Турбо отладчик позволяет вам проверять и изменять состояние
       арифметического сопроцессора или программного  эмулятора.  Данная
       глава предназначена для программистов,  которые знакомы с работой
       арифметического сопроцессора 80х87. Для отладки программ, которые
       работают с числами с плавающей точкой, вам не обязательно исполь-
       зовать возможности,  описанные в данной главе,  однако  некоторые
       трудноуловимые ошибки найти будет легче.
            В данной главе мы обсудим различия между платой сопроцессора
       80х87  и  программным  эмулятором.  Мы  также опишем окно Numeric
       Processor (Арифметический сопроцессор) и покажем вам,  как  можно
       проверять  и модифицировать содержимое регистров с плавающей точ-
       кой, биты состояния и управления.
                 Примечание: Данная  глава предназначена для программис-
            тов, которые знакомы с операциями сопроцессоров серии 80х87.
                       Сопроцессор 80х87 или эмулятор?
       -----------------------------------------------------------------
            Турбо отладчик  автоматически распознает,  используется ли в
       вашей программе плата арифметического сопроцессора, или эмулятор,
       и работает соответствующим образом.
            Заметим, что  большинство программ используют либо эмулятор,
       либо сопроцессор, но не оба этих средства в одной программе. Если
       вы  написали  специальный  код  на  Ассемблере,  использующий оба
       средства,  Турбо отладчик не сможет показать вам состояние  платы
       сопроцессора и будет сообщать только об эмуляторе.
                           Окно Numeric Processor
       -----------------------------------------------------------------
            Окно Numeric Processor  (Арифметический  сопроцессор)  можно
       создать  с  помощью команды основного меню View¦Numeric Processor


       (Обзор¦Арифметический сопроцессор). В строке в верхней части окна
       выводятся  текущий  указатель инструкций,  указатель данных и код
       операции для инструкции.  Указатель данных и указатель инструкций
       выводятся в виде 20- разрядных физических адресов. Эти адреса мож-
       но преобразовать в форму  "сегмент:смещение",  если  использовать
       первые 4 цифры,  как значение сегмента,  а последние 4 цифры, как
       значение смещения.
            Например, если в верхней части  окна  выводится  IPTR=5A669,
       это можно рассматривать,  как адрес 5a66:9 (если вы хотите прове-
       рить текущие данные и инструкцию в окне CPU (ЦП)).  Это окно  со-
       держит три области: в левой области (области регистров) выводится

       TDeb 3.0 #2-3                = 70 =
       содержимое регистров с плавающей точкой,  в средней области  (об-
       ласти  управления) показываются значения управляющих флагов,  а в
       правой области (области состояния) показаны флаги состояния.
                г[*]=Emulator IPTR=000000 OPCODE=000 OPTR=00003=[ ][ ]¬
                ¦Empty ST(0)                            ¦ im=0 ¦ ie=0 ¦
                ¦Empty ST(1)                            ¦ dm=0 ¦ de=0 ¦
                ¦Empty ST(2)                            ¦ zm=0 ¦ ze=0 ¦
                ¦Empty ST(3)                            ¦ om=0 ¦ oe=0 ¦
                ¦Empty ST(4)                            ¦ um=1 ¦ ue=0 ¦
                ¦Empty ST(5)                            ¦ pm=1 ¦ pe=0 ¦
                ¦Empty ST(6)                            ¦iem=0 ¦ ir=0 ¦
                ¦Empty ST(7)                            ¦ pc=3 ¦ cc=9 ¦
                ¦                                       ¦ rc=0 ¦ st=2 ¦
                ¦                                       ¦ ic=1 ¦      ¦
                L<------------------------------------->-=============-
            Рис. 12.1 Окно Numeric Processor
            В верхней  части окна (первая строка) выводится информация о


       последней выполненной операции с плавающей точкой:
            - Emulator показывает, что арифметический сопроцессор эмули-
              руется.   При наличии арифметического  сопроцессора вместо
              этого индикатора  появляется  индикатор  8087,  80287  или
              80387.
            - IPTR показывает 20-разрядный физический адрес, из которого
              была извлечена последняя инструкция с плавающей точкой.
            - OPCODE показывает тип извлеченной инструкции. OPTR показы-
              вает  20-разрядный  адрес в памяти,  на который инструкция
              ссылается (если он имеется).

       TDeb 3.0 #2-3                = 71 =
                              Область регистров
       -----------------------------------------------------------------
                   80-разрядные регистры с плавающей точкой
       -----------------------------------------------------------------
            В области регистров показан каждый (от ST(0)  до  ST(7))  из
       регистров с плавающей точкой и его состояние (valid/zero/special/
       empty - допустимое/нулевое/специальное/пустое). Содержимо  выво-
       дится в виде 80-разрядных чисел с плавающей точкой.
            Если вы  переключили  окно  Numeric Processor (нажав клавишу
       F5) или расширили его с  помощью  команды  Window¦Size/Move  (Ок-
       но¦Размер/Перемещение),  вы также увидите непосредственное содер-
       жимое регистров с плавающей точкой,  выведенное в виде шестнадца-
       тиричных байтовых значений.
                      Локальное меню области регистров
       -----------------------------------------------------------------
            Чтобы вывести локальное меню области регистров, нажмите кла-
       виши Alt-F10,  или для непосредственного доступа к  команде  меню
       используйте клавишу Ctrl вместе с первой буквой имени команды.
                        -------------¬
                        ¦ Zero       ¦   Обнуление
                        ¦ Empty      ¦   Пусто


                        ¦ Change...  ¦   Изменение
                        L-------------
                                 Команда Zero
       -----------------------------------------------------------------
            Команда Zero  (Обнуление)  устанавливает текущий (подсвечен-
       ный) регистр в значение 0.
                                 Команда Empty
       -----------------------------------------------------------------
            Команда Empty (Пусто) присваивает подсвеченному в данный мо-
       мент регистру пустое значение. Это специальное состояние, показы-
       вающее, что регистр не содержит более допустимых данных.
                                Команда Change
       -----------------------------------------------------------------
            Команда Change (Изменение) загружает в  текущий  (подсвечен-
       ный)  регистр новое значение.  Допускается вводить целое значение
       или значение с плавающей точкой.  Введенное вами  значение  будет
       преобразовано  во  временный 80-битовый вещественный формат,  ис-
       пользуемый арифметическим сопроцессором.
            Эту команду можно вызвать,  если просто начать печатать  для

       TDeb 3.0 #2-3                = 72 =
       регистра с плавающей точкой новое значение.  При этом будет выво-
       диться окно подсказки (как при использовании команды Change).

       TDeb 3.0 #2-3                = 73 =
                             Область управления
       -----------------------------------------------------------------
                                Биты управления
       -----------------------------------------------------------------
            В следующей таблице приведен список различных флагов  управ-
       ления, выводимых в области управления.
       -------------------------T-------------------------------------¬
       ¦ Название в области     ¦                     Описание флага  ¦
       +------------------------+-------------------------------------+


       ¦         im             ¦ Маска недопустимой операции         ¦
       ¦         dm             ¦ Маска ненормализованной операции    ¦
       ¦         zm             ¦ Маска деления на нуль               ¦
       ¦         om             ¦ Маска переполнения                  ¦
       ¦         um             ¦ Маска потери значимости             ¦
       ¦         pm             ¦ Маска точности                      ¦
       ¦         iem            ¦ Маска разрешения прерывания (только ¦
       ¦                        ¦ для сопроцессора 8087)              ¦
       ¦         pc             ¦ Управление точностью                ¦
       ¦         rc             ¦ Управление округлением              ¦
       ¦         ic             ¦ Контроль бесконечности              ¦
       L------------------------+--------------------------------------
                      Локальное меню области управления
       -----------------------------------------------------------------
            Для перемещения в область управления  нажмите  клавишу  Tab,
       затем  для получения локального меню нажмите клавиши Alt-F10. (Вы
       можете также использовать клавишу Ctrl вместе с первой буквой ко-
       манды, что позволяет получить непосредственный доступ к команде.)
                                               ---------¬
                           Переключение        ¦ Toggle ¦
                                               L---------
                                Команда Toggle
       -----------------------------------------------------------------
            Команда Toggle  (Переключение) позволяет циклически переклю-
       чать значение текущего (подсвеченного) управляющего флага. Значе-
       ния большинства флагов могут быть только установлены или сброшены
       (принимать значения 1 или 0), поэтому данная команда будет перек-
       лючать флаг в другое значение.  Однако некоторые другие флаги мо-
       гут принимать больше значений.  Для таких флагов  данная  команда


       будет  увеличивать значение флага,  пока не будет получено макси-
       мальное значение, затем снова установит флаг в значение 0.
            Состояние управляющих флагов можно также переключать,  нажи-
       мая клавишу Enter.

       TDeb 3.0 #2-3                = 74 =
                              Область состояния
       -----------------------------------------------------------------
                                Биты состояния
       -----------------------------------------------------------------
            В следующей таблице приведен список различных флагов состоя-
       ния, выводимых в области состояния.
             ------------------------T------------------------------¬
             ¦  Название в области   ¦         Описание флага       ¦
             +-----------------------+------------------------------+
             ¦        ie             ¦   Недопустимая операция      ¦
             ¦        de             ¦   Ненормализованный операнд  ¦
             ¦        ze             ¦   Деление на нуль            ¦
             ¦        oe             ¦   Переполнение               ¦
             ¦        ue             ¦   Потеря значимости          ¦
             ¦        pe             ¦   Точность                   ¦
             ¦        ir             ¦   Запрос прерывания          ¦
             ¦        cc             ¦   Код состояния              ¦
             ¦        st             ¦   Указатель вершины стека    ¦
             L-----------------------+-------------------------------
                      Локальное меню области состояния
       -----------------------------------------------------------------
            Для перемещения в область состояния нажмите клавишу Tab, за-
       тем для вывода локального меню нажмите клавиши Alt-F10. (Вы може-
       те  также использовать клавишу Ctrl вместе с первой буквой коман-
       ды,  что позволяет  получить  непосредственный  доступ  к  нужной
       команде.)


                                                      ---------¬
                                    Переключение      ¦ Toggle ¦
                                                      L---------
                                Команда Toggle
       -----------------------------------------------------------------
            Команда Toggle (Переключение) позволяет циклически  переклю-
       чать  значение текущего (подсвеченного) флага состояния. Значения
       большинства флагов могут быть  только  установлены  или  сброшены
       (принимать значения 1 или 0), поэтому данная команда будет перек-
       лючать флаг в другое значение.  Однако некоторые другие флаги мо-
       гут  принимать  больше значений.  Для таких флагов данная команда
       будет увеличивать значение флага,  пока не будет получено  макси-
       мальное значение, затем снова установит флаг в значение 0.
            Состояние флагов  можно  также переключать,  нажимая клавишу
       Enter.

       TDeb 3.0 #2-3                = 75 =
                      Глава 13. Команды Турбо отладчика
       -----------------------------------------------------------------
            Теперь, после  того,  как  мы рассказали вам о всех командах
       Турбо отладчика, перечислим их кратко. Мы перечислим и опишем:
            - все  команды,  выполняющиеся  при  нажатии одной из клавиш
              (функциональной или другой клавиши);
            - все команды основного меню и команды  локальных  меню  для
              каждого типа окна;
            - клавиши,  используемые для разных областей окон при ответе
              на подсказку,  а также при задании нового размера  окна  и
              его положения;
            - клавиши перемещения и изменения размера окон.
                             Оперативные клавиши
       -----------------------------------------------------------------
            Оперативная клавиша - это клавиша, которая выполняет опреде-
       ленное действие вне зависимости от вашего положения в среде Турбо


       отладчика TDW.  Список всех оперативных клавиш приведен в Таблице
       13.1.
          Функциональная клавиша и соответствующая команда  Таблица 13.1
       ----------T----------------------T------------------------------¬
       ¦Клавиша  ¦Команда меню          ¦Функция                       ¦
       +---------+----------------------+------------------------------+
       ¦F1       ¦                      ¦Выводит на  экран  контекстно-¦
       ¦         ¦                      ¦зависимую справочную  информа-¦
       ¦         ¦                      ¦цию.                          ¦
       ¦         ¦                      ¦                              ¦
       ¦F2       ¦Breakpoints¦Toggle    ¦Устанавливает в позиции курсо-¦
       ¦         ¦(Точки останова¦Пе-   ¦ра точку останова.            ¦
       ¦         ¦реключение)           ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦F3       ¦View¦Module (Обзор¦   ¦Выводит список для выбора  мо-¦
       ¦         ¦Модуль)               ¦дуля.                         ¦
       ¦         ¦                      ¦                              ¦
       ¦F4       ¦Run¦Go to Cursor      ¦Выполняет программу до позиции¦
       ¦         ¦(Выполнение¦Переход   ¦курсора.                      ¦
       ¦         ¦к курсору)            ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦F5       ¦Window¦Zoom (Окно¦    ¦Переключает текущее окно.     ¦
       ¦         ¦Переключение)         ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦F6       ¦Window¦Next Window    ¦Выполняет переход к следующему¦
       ¦         ¦(Окно¦Следующее окно) ¦окну.                         ¦
       ¦         ¦                      ¦                              ¦
       ¦F7       ¦Run¦Trace Into        ¦Выполняет одну исходную строку¦


       ¦         ¦(Выполнение¦Трасси-   ¦или инструкцию.               ¦

       TDeb 3.0 #2-3                = 76 =
       ¦         ¦ровка вглубь)         ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦F8       ¦Run¦Step Over (Вы-    ¦ Выполняет одну исходную строку¦
       ¦         ¦(полнение¦Шаг)        ¦или инструкцию, пропуская  вы-¦
       ¦         ¦                      ¦зовы.                         ¦
       ¦         ¦                      ¦                              ¦
       ¦F9       ¦Run¦Run (Выполне-     ¦Выполняет программу.          ¦
       ¦         ¦ние¦Выполнение)       ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦F10      ¦                      ¦Вызывает основное меню и пере-¦
       ¦         ¦                      ¦водит вас в него.             ¦
       ¦         ¦                      ¦                              ¦
       +---------+----------------------+------------------------------+
       ¦         ¦                      ¦                              ¦
       ¦Alt-F1   ¦Help¦Previous Topic   ¦Выводит   последний  экран  со¦
       ¦         ¦(Cправка¦Предыдущая   ¦справочной информацией.       ¦
       ¦         ¦тема)                 ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-F2   ¦Breakpoints¦At        ¦Устанавливает  точку  останова¦
       ¦         ¦(Точка останова¦На...)¦по заданному адресу.          ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-F3   ¦Window¦Close (Окно¦   ¦Закрывает текущее окно.       ¦
       ¦         ¦Закрытие)             ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-F4   ¦Run¦Back Trace (Вы-   ¦Выполняет программу "в  обрат-¦
       ¦         ¦нение¦Обратная трас-  ¦ном направлении".             ¦


       ¦         ¦сировка)              ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-F5   ¦Window¦User Screen    ¦Показывает экран вывода  прог-¦
       ¦         ¦(Обзор¦Экран поль-    ¦раммы.                        ¦
       ¦         ¦зователя)             ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-F6   ¦Window¦Undo Close     ¦Вновь открывает последнее зак-¦
       ¦         ¦(Окно¦Отменить за-    ¦рытое окно.                   ¦
       ¦         ¦крытие)               ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-F7   ¦Run¦Instruction trace ¦Выполняет одну инструкцию.    ¦
       ¦         ¦(Выполнение¦Трасси-   ¦                              ¦
       ¦         ¦ровка инструкции)     ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-F8   ¦Run¦Until Return (Вы- ¦Выполняет программу до возвра-¦
       ¦         ¦полнение¦До возврата) ¦та управления из функции.     ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-F9   ¦Run¦Execute To (Выпол-¦Выполняет программу до  задан-¦
       ¦         ¦нение¦Выполнение      ¦ного адреса.                  ¦
       ¦         ¦до...)                ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-F10  ¦                      ¦ Вызывает локальное меню окна. ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-1-9  ¦                      ¦Переводит вас в окно с  задан-¦
       ¦         ¦                      ¦ным номером (1 - 9).          ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-     ¦                      ¦Переводит вас в системное  ме-¦

       TDeb 3.0 #2-3                = 77 =


       ¦ пробел  ¦                      ¦ню.                           ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-B    ¦                      ¦Переводит  в  меню Breakpoints¦
       ¦         ¦                      ¦(Точки останова).             ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-D    ¦                      ¦Переводит   вас  в  меню  Data¦
       ¦         ¦                      ¦(Данные).                     ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-F    ¦                      ¦Переводит  вас  в  меню   File¦
       ¦         ¦                      ¦(Файл).                       ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-H    ¦                      ¦Переводит   вас  в  меню  Help¦
       ¦         ¦                      ¦(Cправка).                    ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-O    ¦                      ¦ Переводит вас в  меню  Options¦
       ¦         ¦                      ¦(Параметры).                  ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-R    ¦                      ¦Переводит вас в меню  Run (Вы-¦
       ¦         ¦                      ¦полнение).                    ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-V    ¦                      ¦Переводит   вас  в  меню  View¦
       ¦         ¦                      ¦(Обзор).                      ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-W    ¦                      ¦Переводит  вас  в  меню Window¦
       ¦         ¦                      ¦(Окно).                       ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-X    ¦                      ¦Выполняет выход из  Турбо  от-¦
       ¦         ¦                      ¦ладчика  и  возвращает  вас  в¦


       ¦         ¦                      ¦DOS.                          ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-=    ¦Options¦Macros¦Create ¦Определяет клавиатурную макро-¦
       ¦         ¦(Параметры¦Макроко-   ¦команду.                      ¦
       ¦         ¦манды¦Создание)       ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦Alt-минус¦Options¦Macros¦Stop   ¦Заканчивает запись макрокоман-¦
       ¦         ¦Recording (Параметры¦ ¦ды.                           ¦
       ¦         ¦Макрокоманды¦Остано-  ¦                              ¦
       ¦         ¦вить запись)          ¦                              ¦
       ¦         ¦                      ¦                              ¦
       +---------+----------------------+------------------------------+
       ¦Ctrl-F2  ¦Run¦Program Reset     ¦ Останавливает сеанс  отладки и¦
       ¦         ¦(Выполнение¦Сброс     ¦сбрасывает состояние программы¦
       ¦         ¦программы)            ¦для повторного выполнения.    ¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-F4  ¦Data¦Evaluate (Дан-   ¦Вычисляет выражение.          ¦
       ¦         ¦ные¦Вычисление)       ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-F5  ¦Window¦Size/Move      ¦Инициализирует перемещение или¦
       ¦         ¦(Окно¦Размен/Переме-  ¦изменение размера окна.       ¦
       ¦         ¦щение)                ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-F7  ¦Data¦Add Watch (Дан-  ¦Добавляет  переменную  в  окно¦
       ¦         ¦ные¦Добавить выражение¦просмотра (Watch).            ¦

       TDeb 3.0 #2-3                = 78 =
       ¦         ¦просмотра)            ¦                              ¦
       ¦         ¦                      ¦                              ¦


       ¦Ctrl-F8  ¦Breakpoints¦Toggle    ¦Переключает   состояние  точки¦
       ¦         ¦(Точка останова¦Пере- ¦ в месте расположения курсора. ¦
       ¦         ¦ключение)             ¦                              ¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-F9  ¦Run¦Run (Выполнение¦  ¦Запускает программу на  выпол-¦
       ¦         ¦Выполнение)           ¦нение.                        ¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-F10 ¦                      ¦Вызывает локальное меню окна. ¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-->  ¦                      ¦Сдвигает начальный адрес в об-¦
       ¦         ¦                      ¦ласти кода, данных  или  стека¦
       ¦         ¦                      ¦окна CPU (ЦП) на 1 байт вверх.¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-<-  ¦                      ¦Сдвигает начальный адрес в об-¦
       ¦         ¦                      ¦ласти кода, данных  или  стека¦
       ¦         ¦                      ¦окна CPU (ЦП) на 1 байт вниз. ¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-A   ¦                      ¦Перемещение к предыдущему сло-¦
       ¦         ¦                      ¦ву.                           ¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-C   ¦                      ¦"Прокручивает" вниз  один  эк-¦
       ¦         ¦                      ¦ран.                          ¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-D   ¦                      ¦Перемещает вправо на одну  по-¦
       ¦         ¦                      ¦зицию.                        ¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-E   ¦                      ¦Перемещает вверх на одну стро-¦


       ¦         ¦                      ¦ку.                           ¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-F   ¦                      ¦Перемещает к следующему слову.¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-R   ¦                      ¦"Прокручивает" вверх  на  один¦
       ¦         ¦                      ¦экран.                        ¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-S   ¦                      ¦ Перемещает влево на одну пози-¦
       ¦         ¦                      ¦цию.                          ¦
       ¦         ¦                      ¦                              ¦
       ¦Ctrl-X   ¦                      ¦Перемещает вниз на одну  стро-¦
       ¦         ¦                      ¦ку.                           ¦
       ¦         ¦                      ¦                              ¦
       +---------+----------------------+------------------------------+
       ¦Shift-F1 ¦Help¦Index            ¦Переходит к оглавлению  опера-¦
       ¦         ¦                      ¦тивного справочника.          ¦
       ¦         ¦                      ¦                              ¦
       ¦Shift-Tab¦                      ¦Переводит курсор в  предыдущую¦
       ¦         ¦                      ¦область окна или элемент.     ¦
       ¦         ¦                      ¦                              ¦
       ¦Shift--> ¦                      ¦Перемещает курсор между облас-¦
       ¦         ¦                      ¦тями.                         ¦
       ¦         ¦                      ¦                              ¦
       ¦Shift-<- ¦                      ¦Перемещает курсор между облас-¦

       TDeb 3.0 #2-3                = 79 =
       ¦         ¦                      ¦тями в окне  в соответствии  с¦
       ¦Shift-v  ¦                      ¦направлениями стрелок (область¦
       ¦         ¦                      ¦в направлении  стрелки  стано-¦


       ¦Shift-^  ¦                      ¦вится текущей областью).      ¦
       ¦         ¦                      ¦                              ¦
       +---------+----------------------+------------------------------+
       ¦Esc      ¦                      ¦Закрывает окно проверки  (Ins-¦
       ¦         ¦                      ¦pector), выводит вас из меню. ¦
       ¦         ¦                      ¦                              ¦
       ¦Ins      ¦                      ¦Начинает выборку блока  текста¦
       ¦         ¦                      ¦(подсветку).  Используйте кла-¦
       ¦         ¦                      ¦виши   управления     курсором¦
       ¦         ¦                      ¦(стрелки).                    ¦
       ¦         ¦                      ¦                              ¦
       ¦Tab      ¦Window¦Next Pane      ¦Перемещает курсор к  следующей¦
       ¦         ¦(Окно¦Следующая       ¦области окна или к  следующему¦
       ¦         ¦область)              ¦элементу диалогового окна.    ¦
       L---------+----------------------+-------------------------------

       TDeb 3.0 #2-3                = 80 =
                    Команды, доступные из основного меню
       -----------------------------------------------------------------
            Основное меню  (строку меню) можно вызвать с помощью клавиши
       F10. После этого вы можете перейти на одно из меню:
            - переместив курсор на заголовок меню и нажав клавишу Enter;
            - нажав первую буквы подсвеченного элемента (пункта) меню.
            Кроме того, можно открыть меню непосредственно (не перемеща-
       ясь сначала к заголовку меню),  нажав клавишу Alt в  сочетании  с
       первой буквой имени нужного меню.
                           Меню Ё (системное меню)
       ------------------------T---------------------------------------¬
       ¦                       ¦                                       ¦
       ¦Repaint Desktop        ¦Повторно выводит весь экран.           ¦


       ¦(Изобразить экран)     ¦                                       ¦
       ¦                       ¦                                       ¦
       +-----------------------+---------------------------------------+
       ¦                       ¦                                       ¦
       ¦Restore Standard       ¦Восстанавливает стандартную схему окон.¦
       ¦(Восстановить стандарт)¦                                       ¦
       ¦                       ¦                                       ¦
       +-----------------------+---------------------------------------+
       ¦                       ¦                                       ¦
       ¦About (О Турбо отлад-  ¦Выводит информацию о Турбо отладчике.  ¦
       ¦чике)                  ¦                                       ¦
       ¦                       ¦                                       ¦
       L-----------------------+----------------------------------------

       TDeb 3.0 #2-3                = 81 =
                              Меню File (Файл)
       ----------------------T-----------------------------------------¬
       ¦                     ¦                                         ¦
       ¦Open (Открытие)      ¦ Открывает новую программу для отладки.  ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Change Dir (Смена    ¦ Выполняет переход на новый диск или в   ¦
       ¦каталога)            ¦ новый каталог.                          ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Get Info (Получение  ¦ Выводит на экран информацию о программе.¦
       ¦информации)          ¦                                         ¦


       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Resident (Резидент-  ¦ Приводит к тому, что Турбо отладчик  за-¦
       ¦ный)                 ¦ вершит работу и останется резидентным  в¦
       ¦                     ¦ памяти.                                 ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Symbol Load (Загруз- ¦ Загружает  таблицу  идентификаторов,    ¦
       ¦ка таблицы идентифи- ¦ независимую от файла .EXE.              ¦
       ¦каторов)             ¦                                         ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Table Relocate (Пе-  ¦ Задает значение базового сегмента табли-¦
       ¦ремещение таблицы)   ¦ цы идентификаторов.                     ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Quit (Выход)         ¦ Возвращает вас в DOS.                   ¦
       ¦                     ¦                                         ¦
       L---------------------+------------------------------------------

       TDeb 3.0 #2-3                = 82 =
                         Меню Edit (Редактирование)
       ------------------------T---------------------------------------¬
       ¦                       ¦                                       ¦
       ¦Copy (Копирование)     ¦Копирует элемент в карман (Clipboard).


¦
       ¦                       ¦                                       ¦
       +-----------------------+---------------------------------------+
       ¦                       ¦                                       ¦
       ¦Paste (Вставка)        ¦Вставляет элемент из кармана в окно или¦
       ¦                       ¦в диалоговую подсказку.                ¦
       ¦                       ¦                                       ¦
       +-----------------------+---------------------------------------+
       ¦                       ¦                                       ¦
       ¦Copy to Log (Копирова- ¦ Копирует подсвеченный элемент или эле- ¦
       ¦ние в окно Log)        ¦мент в точке расположения курсора в    ¦
       ¦                       ¦окно Log.                              ¦
       ¦                       ¦                                       ¦
       L-----------------------+----------------------------------------
                              Меню View (Обзор)
       ---------------------T------------------------------------------¬
       ¦                    ¦                                          ¦
       ¦Breakpoints (Точки  ¦Просмотр точек останова.                  ¦
       ¦останова)           ¦                                          ¦
       ¦                    ¦                                          ¦
       +--------------------+------------------------------------------+
       ¦                    ¦                                          ¦
       ¦Stack (Стек)        ¦Просмотр стека вызовов функций.           ¦
       ¦                    ¦                                          ¦
       +--------------------+------------------------------------------+
       ¦                    ¦                                          ¦
       ¦Log (Регистрация)   ¦Просмотр журнала регистрации событий и    ¦
       ¦                    ¦данных.                                   ¦
       ¦                    ¦                                          ¦


       +--------------------+------------------------------------------+
       ¦                    ¦                                          ¦
       ¦Watches (Выражения  ¦Просмотр наблюдаемых переменных.          ¦
       ¦просмотра)          ¦                                          ¦
       ¦                    ¦                                          ¦
       +--------------------+------------------------------------------+
       ¦                    ¦                                          ¦
       ¦Variables (Перемен- ¦Просмотр глобальных и локальных перемен-  ¦
       ¦ные)                ¦ных.                                      ¦
       ¦                    ¦                                          ¦
       +--------------------+------------------------------------------+
       ¦                    ¦                                          ¦
       ¦Module (Модуль)     ¦Просмотр исходного модуля программы.      ¦
       ¦                    ¦                                          ¦
       +--------------------+------------------------------------------+
       ¦                    ¦                                          ¦
       ¦File (Файл)         ¦ Просмотр содержимого файла на диске в     ¦
       ¦                    ¦коде ASCII или в шестнадцатиричном виде.  ¦
       ¦                    ¦                                          ¦
       +--------------------+------------------------------------------+

       TDeb 3.0 #2-3                = 83 =
       ¦                    ¦                                          ¦
       ¦CPU (ЦП)            ¦Просмотр инструкций, данных и стека       ¦
       ¦                    ¦центрального процессора.                  ¦
       ¦                    ¦                                          ¦
       +--------------------+------------------------------------------+
       ¦                    ¦                                          ¦
       ¦Dump (Дамп)         ¦Просмотр дампа данных в непосредственном  ¦


       ¦                    ¦виде.                                     ¦
       ¦                    ¦                                          ¦
       +--------------------+------------------------------------------+
       ¦                    ¦                                          ¦
       ¦Registers (Регистры)¦Просмотр регистров и флагов процессора.   ¦
       ¦                    ¦                                          ¦
       +--------------------+------------------------------------------+
       ¦                    ¦                                          ¦
       ¦Numeric Processor   ¦Просмотр сопроцессора или эмулятора.      ¦
       ¦(Арифметический     ¦                                          ¦
       ¦сопроцессор)        ¦                                          ¦
       ¦                    ¦                                          ¦
       +--------------------+------------------------------------------+
       ¦                    ¦                                          ¦
       ¦Execution History   ¦Выводит код Ассемблера, сохраненный для   ¦
       ¦(Протокол выполне-  ¦обратной трассировки или повторного       ¦
       ¦ния)                ¦выполнения нажатий клавиш.                ¦
       ¦                    ¦                                          ¦
       +--------------------+------------------------------------------+
       ¦                    ¦                                          ¦
       ¦Hierarchy (Иерархия)¦ Выводит список типов объектов или классов ¦
       ¦                    ¦и дерево иерархии.                        ¦
       ¦                    ¦                                          ¦
       +--------------------+------------------------------------------+
       ¦                    ¦                                          ¦
       ¦Windows messages    ¦Выводит список сообщений Windows для      ¦
       ¦(Cообщения Windows) ¦одного или более окон в вашей прикладной  ¦
       ¦                    ¦программе.                                ¦


       ¦                    ¦                                          ¦
       +--------------------+------------------------------------------+
       ¦                    ¦                                          ¦
       ¦Clipboard (Карман)  ¦ Выводит на экран окно Clipboard, в кото-  ¦
       ¦                    ¦ров вы можете видеть элементы, скопиро-   ¦
       ¦                    ¦ванные в буфер вырезанного изображения    ¦
       ¦                    ¦(карман).                                 ¦
       ¦                    ¦                                          ¦
       +--------------------+------------------------------------------+
       ¦                    ¦                                          ¦
       ¦Another (Другой...) ¦                                          ¦
       ¦                    ¦                                          ¦
       ¦        Module      ¦Создает другое окно Module (Модуль).      ¦
       ¦        Dump        ¦Создает другое окно Dump (Дамп).          ¦
       ¦        File        ¦Создает другое окно File (Файл).          ¦
       ¦                    ¦                                          ¦
       L--------------------+-------------------------------------------

       TDeb 3.0 #2-3                = 84 =
                            Меню Run (Выполнение)
       ------------------------------T---------------------------------¬
       ¦                             ¦                                 ¦
       ¦Run (Выполнение)             ¦Запускает программу на выполнение¦
       ¦                             ¦(без остановки).                 ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Go To Cursor (Переход к      ¦Выполняет программу до текущего  ¦
       ¦курсору)                     ¦места расположения курсора.      ¦


       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Trace Into (Трассировка      ¦ Выполняет одну строку исходного  ¦
       ¦вглубь)                      ¦кода или инструкцию.             ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Step Over (Шаг с пропуском)  ¦Выполняет трассировку с пропуском¦
       ¦                             ¦трассировки вызовов подпрограмм. ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Execute To (Выполнение до...)¦Выполняет программу до заданного ¦
       ¦                             ¦адреса.                          ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Until Return (До возврата    ¦Выполняет программу до возврата  ¦
       ¦управления)                  ¦функцией.                        ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Animate (Автоматизировать)   ¦Непрерывно выполняет программу по¦
       ¦                             ¦шагам.                           ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦


       ¦Back Trace (Обратная трас-   ¦Изменяет порядок выполнения прог-¦
       ¦сировка)                     ¦раммы на обратный (по одной стро-¦
       ¦                             ¦ ке исходного  кода  или  инструк-¦
       ¦                             ¦ции).                            ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Instruction Trace (Трасси-   ¦Выполняет одну инструкцию.       ¦
       ¦ровка инструкций)            ¦                                 ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Arguments (Аргументы)        ¦Выполняет одну инструкцию.       ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+

       TDeb 3.0 #2-3                = 85 =
       ¦                             ¦                                 ¦
       ¦Program Reset (Сброс програм-¦Выполняет перезагрузку текущей   ¦
       ¦мы)                          ¦программы.                       ¦
       ¦                             ¦                                 ¦
       L-----------------------------+----------------------------------

       TDeb 3.0 #2-3                = 86 =
                     Меню Breakpoints (Точки останова)
       -----------------------------T----------------------------------¬
       ¦                            ¦                                  ¦
       ¦Toggle (Переключение)       ¦ Переключает состояние точки      ¦
       ¦                            ¦ останова в месте расположения    ¦
       ¦                            ¦ курсора.                         ¦
       ¦                            ¦                                  ¦


       +----------------------------+----------------------------------+
       ¦                            ¦                                  ¦
       ¦At (На...)                  ¦ Устанавливает по заданному адресу¦
       ¦                            ¦ точку останова.                  ¦
       ¦                            ¦                                  ¦
       +----------------------------+----------------------------------+
       ¦                            ¦                                  ¦
       ¦Changed Memory Global       ¦ Устанавливает глобальную точку   ¦
       ¦(Изменение памяти (глоб.))  ¦ для области памяти.              ¦
       ¦                            ¦                                  ¦
       +----------------------------+----------------------------------+
       ¦                            ¦                                  ¦
       ¦Expression True Global      ¦ Устанавливает глобальную точку   ¦
       ¦(Выражение истинно (глоб.)) ¦ для выражения.                   ¦
       ¦                            ¦                                  ¦
       +----------------------------+----------------------------------+
       ¦                            ¦                                  ¦
       ¦Delete All (Удалить все)    ¦ Удаляет все точки останова.      ¦
       ¦                            ¦                                  ¦
       L----------------------------+-----------------------------------
                             Меню Data (Данные)
       ------------------------------T---------------------------------¬
       ¦                             ¦                                 ¦
       ¦Inspect (Проверка)           ¦ Проверяет объект данных.        ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Evaluate/Modify (Вычисление/ ¦ Вычисляет выражение.            ¦


       ¦Модификация)                 ¦                                 ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Add Watch (Просмотр)         ¦ Добавляет переменную в окно     ¦
       ¦                             ¦ просмотра.                      ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Function Return (Возврат     ¦ Проверяет значение, возвращаемое¦
       ¦функции)                     ¦ текущей функцией.               ¦
       ¦                             ¦                                 ¦
       L-----------------------------+----------------------------------

       TDeb 3.0 #2-3                = 87 =
                          Меню Options (Параметры)
       ------------------------------T---------------------------------¬
       ¦                             ¦                                 ¦
       ¦Language (Язык)              ¦Задает использование выражений   ¦
       ¦                             ¦ языка из исходного модуля.       ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Macros (Maкрокоманды)        ¦                                 ¦
       ¦        Create (Создание)    ¦Определяет строковую             ¦
       ¦                             ¦макрокоманду.                    ¦
       ¦        Stop Recording       ¦Завершает сеанс записи.          ¦
       ¦        (Завершить запись)   ¦                                 ¦
       ¦        Remove (Удалить)     ¦Удаляет строковую макрокоманду.  ¦


       ¦        Delete All (Удалить  ¦Удаляет все строковые            ¦
       ¦        все)                 ¦макрокоманды.                    ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Display Options (Режим вывода¦ Позволяет вам задать параметры   ¦
       ¦на экран)                    ¦вывода (переключение экрана,     ¦
       ¦                             ¦размер, табуляция)               ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Path for Source (Маршрут дос-¦Список каталогов исходных файлов.¦
       ¦тупа к исходным файлам)      ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Save Options (Сохранение     ¦Сохраняет параметры, макрокоманды¦
       ¦параметров)                  ¦и окна на диске.                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Restore Options (Восстанов-  ¦Восстанавливает параметры с      ¦
       ¦ление параметров)            ¦диска.                           ¦
       ¦                             ¦                                 ¦
       L-----------------------------+----------------------------------

       TDeb 3.0 #2-3                = 88 =
                            Меню Window (Окно)
       ------------------------------T---------------------------------¬
       ¦                             ¦                                 ¦
       ¦Zoom (Переключение размера)  ¦Увеличивает размер окна до       ¦


       ¦                             ¦размера всего экрана и обратно.  ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Next (Следующее)             ¦Открывает и активизирует на      ¦
       ¦                             ¦экране следующее последовательное¦
       ¦                             ¦окно.                            ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Next Pane (Следующая область)¦Выполняет переход в следующую    ¦
       ¦                             ¦область окна.                    ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Size/Move (Перемещение/      ¦Перемещает текущее окно или      ¦
       ¦Изменение размера)           ¦изменяет его размер.             ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Iconsize/Restore (Cжатие/    ¦ Сжимает окно до размера символа  ¦
       ¦восстановление)              ¦или восстанавливает его.         ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Close (Закрыть)              ¦Стирает текущее окно.            ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+


       ¦                             ¦                                 ¦
       ¦Undo Close (Отмена закрытия) ¦Отменяет последнюю команду       ¦
       ¦                             ¦стирания.                        ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Dump Pane to Log (Вывод      ¦Записывает текущее окно в окно   ¦
       ¦области в протокол регистра- ¦регистрации (Log).               ¦
       ¦ции)                         ¦                                 ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦User Screen (Экран пользова- ¦Выводит экран вывода вашей       ¦
       ¦теля)                        ¦программы.                       ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Нумерованный список окон     ¦Выводится для активизации список ¦
       ¦                             ¦9 открытых окон.                 ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+

       TDeb 3.0 #2-3                = 89 =
       ¦                             ¦                                 ¦
       ¦Window Pick (Выбор окна)     ¦ Выбирает окно из списка открытых ¦
       ¦                             ¦окон.                            ¦
       L-----------------------------+----------------------------------
                            Меню Help (Справка)
       -----------------------------T----------------------------------¬


       ¦                            ¦                                  ¦
       ¦Index (Оглавление)          ¦Выводит на экран оглавление       ¦
       ¦                            ¦оперативного справочника.         ¦
       ¦                            ¦                                  ¦
       +----------------------------+----------------------------------+
       ¦                            ¦                                  ¦
       ¦Previous Topic (Предыдущая  ¦Выводит последний справочный      ¦
       ¦тема)                       ¦экран.                            ¦
       ¦                            ¦                                  ¦
       +----------------------------+----------------------------------+
       ¦                            ¦                                  ¦
       ¦Help on Help (Информация по ¦Выводит на экран информацию по    ¦
       ¦справочнику)                ¦справочной системе.               ¦
       ¦                            ¦                                  ¦
       L----------------------------+-----------------------------------

       TDeb 3.0 #2-3                = 90 =
                            Команды локальных меню
       -----------------------------------------------------------------
            Для текущего окна вызвать всплывающее или  "локальное"  меню
       можно с помощью клавиш Alt-F10.  Если разрешено использовать сок-
       ращения с клавишей Ctrl (разрешить это можно с  помощью программы
       установки TDINST),  то к отдельным элементам этого меню можно об-
       ратиться непосредственно с помощью клавиши Ctrl  и  первой  буквы
       нужного элемента (команды) меню (нажав их одновременно).
                 Примечание: Каждый  тип  окна и каждая область окна со-
            держат разные локальные меню.
            В следующих разделах описываются локальные меню  для каждого
       окна и области.
                Примечание: Меню  в данном разделе для облегчения поиска


            упорядочены по алфавиту.
            Некоторые области в своих локальных меню могут содержать об-
       щие  команды (их сокращения для оперативных клавиш).  В следующих
       разделах эти специальные клавиши описываются перед командами меню
       для той области, к которой они относятся. Во многих областях окон
       клавиша Enter представляет собой сокращение для проверки или  из-
       менения текущего (подсвеченного) элемента.  Клавиша Del часто вы-
       зывает команду локального меню, которая удаляет подсвеченный эле-
       мента.  Некоторые области позволяют вам начать ввод букв или цифр
       без предварительного вызова команды локального меню.  В этом слу-
       чае выводится рамка (окно) подсказки,  куда можно вводить данные.
              Локальное меню окна Breakpoints (Точки останова)
       -----------------------------------------------------------------
            Окно Breakpoints содержит две области:  область списка (сле-
       ва)  и область детализации (справа).  Локальное меню имеет только
       область списка.
       ------------------------------T---------------------------------¬
       ¦                             ¦                                 ¦
       ¦Set Option (Задать параметры)¦Задает действие, по которому     ¦
       ¦                             ¦срабатывает точка                ¦
       ¦                             ¦останова, условия, счетчик       ¦
       ¦                             ¦проходов, разрешает или          ¦
       ¦                             ¦запрещает данную точку           ¦
       ¦                             ¦останова.                        ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Add (Добавить)               ¦Добавляет новую точку останова.  ¦
       ¦                             ¦                                 ¦


       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Remove (Удаление)            ¦Удаляет текущую (подсвеченную)   ¦

       TDeb 3.0 #2-3                = 91 =
       ¦                             ¦точку останова.                  ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Delete All (Удалить все)     ¦Удаляет все точки останова.      ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Inspect (Проверка)           ¦Просмотр кода, где находится     ¦
       ¦                             ¦точка останова.                  ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Group (Группа)               ¦Работа с группами точек останова.¦
       ¦                             ¦                                 ¦
       L-----------------------------+----------------------------------
            В данном окне в качестве сокращения команды Remove ф (Удале-
       ние) используется клавиша Del.

       TDeb 3.0 #2-3                = 92 =
                             Меню окна CPU (ЦП)
       -----------------------------------------------------------------
            Окно CPU  (Центральный  процессор) имеет пять (шесть для от-
       ладчика TDW) областей (область кода, область данных, область сте-
       ка,  область регистров и область флагов), и в каждой области име-
       ется локальное меню (шестая область - область селектора).


                                Область кода
       ----------------------T-----------------------------------------¬
       ¦                     ¦                                         ¦
       ¦Goto (Переход)       ¦ Выводит на экран исходный код по новому  ¦
       ¦                     ¦адресу.                                  ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Origin (Начало)      ¦Выводит на экран код по адресу cs:ip.    ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Follow (Следовать)   ¦Выводит на экран код по целевому адресу  ¦
       ¦                     ¦JMP или CALL.                            ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Caller (Вызывающая   ¦Выводит на экран код вызывающей функции. ¦
       ¦функция)             ¦                                         ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Previous (Предыдущий)¦Выводит на экран код по последнему       ¦
       ¦                     ¦адресу.                                  ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Search (Поиск)       ¦Выполняет поиск инструкций или байт.     ¦


       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦View Source (Просмотр¦Переключается в окно Module (Модуль).    ¦
       ¦исходного кода)      ¦                                         ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Mixed (Смешанный)    ¦No/Yes/Both - Нет/Да/Оба: выводимый      ¦
       ¦                     ¦исходный код чередуется с                ¦
       ¦                     ¦инструкциями Ассемблера.                 ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦New CS:IP (Новое     ¦Устанавливает CS:IP для выполнения нового¦
       ¦значение CS:IP)      ¦адреса.                                  ¦
       ¦                     ¦                                         ¦

       TDeb 3.0 #2-3                = 93 =
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Assemble (Ассембли-  ¦                                         ¦
       ¦рование)             ¦                                         ¦
       ¦        In byte (Ввод¦ Считывает байт по адресу ввода-вывода.   ¦
       ¦        байта)       ¦                                         ¦
       ¦        Out Byte (Вы-¦Записывает байт по адресу ввода-вывода.  ¦
       ¦        вод байта)   ¦                                         ¦
       ¦        Read Word    ¦Считывает слово из адреса ввода-вывода.  ¦
       ¦        (Считать     ¦                                         ¦


       ¦        слово)       ¦                                         ¦
       ¦        Write Word   ¦Записывает слово по адресу ввода-вывода. ¦
       ¦        (Записать    ¦                                         ¦
       ¦        слово)       ¦                                         ¦
       ¦                     ¦                                         ¦
       L---------------------+------------------------------------------
             Вместо команды локального меню  Assemble  (Ассемблирование)
       можно использовать сокращенный вариант: набор любого символа.
                              Область селектора
       ----------------------T-----------------------------------------¬
       ¦                     ¦                                         ¦
       ¦Selector (Селектор)  ¦Позволяет вам ввести новый селектор и    ¦
       ¦                     ¦перейти на него.                         ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Examine (Проверка)   ¦Выводит содержимое области памяти, на    ¦
       ¦                     ¦которую ссылается селектор, в области    ¦
       ¦                     ¦кода или в области данных, в зависимости ¦
       ¦                     ¦от типа содержимого.                     ¦
       ¦                     ¦                                         ¦
       L---------------------+------------------------------------------

       TDeb 3.0 #2-3                = 94 =
                               Область данных
       ------------------------T---------------------------------------¬
       ¦                       ¦                                       ¦
       ¦ Goto (Переход)        ¦Выводит на экран данные по новому адре-¦
       ¦                       ¦су.                                    ¦
       +-----------------------+---------------------------------------+


       ¦                       ¦                                       ¦
       ¦ Search (Поиск)        ¦Выполняет поиск строки или байт.       ¦
       ¦                       ¦                                       ¦
       +-----------------------+---------------------------------------+
       ¦                       ¦                                       ¦
       ¦ Next (Следующий)      ¦Выполняет повторный поиск (следующего  ¦
       ¦                       ¦вхождения).                            ¦
       ¦                       ¦                                       ¦
       +-----------------------+---------------------------------------+
       ¦                       ¦                                       ¦
       ¦ Change (Изменение)    ¦ Изменяет байты данных по адресу курсо- ¦
       ¦                       ¦ра.                                    ¦
       ¦                       ¦                                       ¦
       +-----------------------+---------------------------------------+
       ¦                       ¦                                       ¦
       ¦ Follow (Следовать)    ¦Следует по цепочке указателя (ближний  ¦
       ¦                       ¦тип или дальний тип).                  ¦
       ¦                       ¦                                       ¦
       ¦      Near Code (Ближ- ¦Следует по цепочке указателя (ближний  ¦
       ¦      ний код)         ¦тип). Устанавливает область кода под   ¦
       ¦                       ¦курсором в ближний адрес.              ¦
       ¦                       ¦                                       ¦
       ¦      Far Code (Даль-  ¦Следует по цепочке указателя (дальний  ¦
       ¦      ний код)         ¦тип). Устанавливает область кода под   ¦
       ¦                       ¦курсором в дальний адрес.              ¦
       ¦                       ¦                                       ¦
       ¦      Offset to Data   ¦Смещение данных. Устанавливает область ¦
       ¦      (Смещение данных)¦кода в ближний адрес под курсором.     ¦


       ¦                       ¦                                       ¦
       ¦      Base Segment:0   ¦Устанавливает область данных в начало  ¦
       ¦      to Data (Базовый ¦сегмента, который содержит адрес под   ¦
       ¦      сегмент данных)  ¦курсором.                              ¦
       ¦                       ¦                                       ¦
       +-----------------------+---------------------------------------+
       ¦                       ¦                                       ¦
       ¦ Previous (Предыдущий) ¦ Выводит на экран данные по последнему  ¦
       ¦                       ¦адресу.                                ¦
       ¦                       ¦                                       ¦
       +-----------------------+---------------------------------------+
       ¦                       ¦                                       ¦
       ¦ Display As (Режим     ¦                                       ¦
       ¦ вывода)               ¦                                       ¦
       ¦         Byte (Байт)   ¦На экран выводятся шестнадцатиричные   ¦
       ¦                       ¦байты.                                 ¦
       ¦                       ¦                                       ¦
       ¦         Word (Слово)  ¦На экран выводятся шестнадцатиричные   ¦
       ¦                       ¦слова.                                 ¦

       TDeb 3.0 #2-3                = 95 =
       ¦                       ¦                                       ¦
       ¦         Long (Длинный)¦На экран выводятся  шестнадцатиричные  ¦
       ¦                       ¦32-битовые длинные слова.              ¦
       ¦                       ¦                                       ¦
       ¦         Comp (Cложный)¦На экран выводятся 8-байтовые целые    ¦
       ¦                       ¦Паскаля (тип comp).                    ¦
       ¦                       ¦                                       ¦
       ¦         Float (С пла- ¦На экран выводятся короткие (4 байта)  ¦


       ¦         вающей точкой)¦числа с плавающей точкой (вещественный ¦
       ¦                       ¦тип с одинарной точностью Паскаля, тип ¦
       ¦                       ¦fvloat в Си).                          ¦
       ¦                       ¦                                       ¦
       ¦         Real (Вещест- ¦На экран выводятся 6-байтовые числа с  ¦
       ¦         венный)       ¦плавающей точкой (вещественный тип     ¦
       ¦                       ¦Паскаля).                              ¦
       ¦                       ¦                                       ¦
       ¦         Double (С     ¦На экран выводятся 8-байтовые числа с  ¦
       ¦         двойной точ-  ¦плавающей точкой (двойная точность в Си¦
       ¦         ностью)       ¦и Паскале).                            ¦
       ¦                       ¦                                       ¦
       ¦         Extended (С   ¦На экран выводятся 10-байтовые числа с ¦
       ¦         расширенной   ¦плавающей точкой (тип extended языка   ¦
       ¦         точностью)    ¦Паскаль, long double языка Си).        ¦
       ¦                       ¦                                       ¦
       +-----------------------+---------------------------------------+
       ¦ Block (Блок)          ¦                                       ¦
       ¦         Clear (Очист- ¦Очищает блок памяти.                   ¦
       ¦         ка)           ¦                                       ¦
       ¦                       ¦                                       ¦
       ¦         Move (Переме- ¦Перемещает блок в памяти.              ¦
       ¦         мещение)      ¦                                       ¦
       ¦                       ¦                                       ¦
       ¦         Set (Присваи- ¦Присваивает блоку памяти значение      ¦
       ¦         сваивание)    ¦(побайтно).                            ¦
       ¦                       ¦                                       ¦
       ¦         Read (Считы-  ¦Выполняет чтение из файла в память.    ¦


       ¦         тывание)      ¦                                       ¦
       ¦                       ¦                                       ¦
       ¦         Write (Запись)¦Записывает из памяти в файл.           ¦
       L-----------------------+----------------------------------------
            Вместо команды  локального меню данной области Change (Изме-
       нение) можно использовать сокращенный вариант:  набор любого сим-
       вола.
                               Область флагов
       ----------------------T-----------------------------------------¬
       ¦                     ¦                                         ¦
       ¦Toggle (Переключение)¦Устанавливает или сбрасывает (очищает)   ¦
       ¦                     ¦текущий (подсвеченный) флаг.             ¦
       ¦                     ¦                                         ¦
       L---------------------+------------------------------------------

       TDeb 3.0 #2-3                = 96 =
            В качестве сокращений данной команды можно использовать кла-
       виши Enter или "пробел".
                               Область регистров
       -----------------------T----------------------------------------¬
       ¦                      ¦                                        ¦
       ¦Increment (Увеличение)¦Добавляет 1 к текущему (подсвеченному)  ¦
       ¦                      ¦регистру.                               ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Decrement (Уменьшение)¦Вычитает 1 из текущего (подсвеченного)  ¦
       ¦                      ¦регистра.                               ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦


       ¦Zero (Очистка)        ¦Очищает содержимое текущего регистра.   ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Change (Изменение)    ¦Присваивает текущему (подсвеченному)    ¦
       ¦                      ¦регистру новое значение.                ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Register 32-bit (32-  ¦No/Yes (Да/Нет): переключает экран в    ¦
       ¦разрядный регистр)    ¦режим вывода 32-разрядных регистров.    ¦
       ¦                      ¦                                        ¦
       L----------------------+-----------------------------------------
            Вместо команды локального меню данной области Change  (Изме-
       нение) можно использовать сокращенный вариант:  набор любого сим-
       вола.

       TDeb 3.0 #2-3                = 97 =
                                Область стека
       -----------------------T----------------------------------------¬
       ¦                      ¦                                        ¦
       ¦ Goto (Переход)       ¦Выводит на экран содержимое стека по    ¦
       ¦                      ¦новому адресу.                          ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦ Origin (Начало)      ¦Выводит на экран данные по адресу SS:SP.¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦


       ¦ Follow (Следовать)   ¦Выводит код, на который указывает       ¦
       ¦                      ¦текущий элемент.                        ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦ Previous (Предыдущий)¦Восстанавливает на экране вывод по      ¦
       ¦                      ¦последнему адресу.                      ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦ Change (Изменение)   ¦Позволяет вам редактировать информацию. ¦
       ¦                      ¦                                        ¦
       L----------------------+-----------------------------------------
            Вместо команды локального меню данной области Change  (Изме-
       нение) можно использовать сокращенный вариант:  набор любого сим-
       вола.

       TDeb 3.0 #2-3                = 98 =
                              Окно Dump (Дамп)
       -----------------------------------------------------------------
            Окно Dump идентично области данных окна CPU (ЦП). Их локаль-
       ные меню также эквивалентны.
                         Меню окна Execution History
       -----------------------------------------------------------------
            Окно Execution  History  (Протокол выполнения) имеет две об-
       ласти,  каждая из которых  имеет  свое  локальное  меню:  область
       Instructions  (область  инструкций) и область Keystroke Recording
       (область регистрации нажатий клавиш).
                             Область инструкций
       -----------------------------------------------------------------
            Область инструкций показывает уже выполненные команды, кото-
       рые вы можете изучать или для которых можно выполнить "откат".


       -----------------------T----------------------------------------¬
       ¦                      ¦                                        ¦
       ¦Inspect               ¦Переход к выделенной команде.           ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Reverse Execute       ¦Реверсирует выполнение программы до     ¦
       ¦                      ¦команды, выделенной в  области          ¦
       ¦                      ¦инструкций.                             ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Full History          ¦Разрешает (On) или отменяет (Off)       ¦
       ¦                      ¦реверсивное выполнение.                 ¦
       ¦                      ¦                                        ¦
       L----------------------+-----------------------------------------

       TDeb 3.0 #2-3                = 99 =
                     Область регистрации нажатий клавиш
       -----------------------------------------------------------------
            Область Keystroke Recording  показывает  записанные  нажатия
       клавиш. Вы можете использовать их для изучения исходного кода или
       при перезапуске программы.
       ----------------------T-----------------------------------------¬
       ¦                     ¦                                         ¦
       ¦Inspect              ¦Показывает  строку исходного кода, в ко- ¦
       ¦                     ¦торой была нажата клавиша.               ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦


       ¦Keystroke Restore    ¦Перезагружает и выполняет вашу программу ¦
       ¦                     ¦до контекста, относящегося к выделенному ¦
       ¦                     ¦нажатию клавиши (это может оказаться по- ¦
       ¦                     ¦лезным, если  средство  записи протокола ¦
       ¦                     ¦выполнения (Execution History) было вык- ¦
       ¦                     ¦лючено.                                  ¦
       ¦                     ¦                                         ¦
       L---------------------+------------------------------------------
                              Окно File (Файл)
       -----------------------------------------------------------------
            В окне File (Файл) выводится в текстовом или шестнадцатирич-
       ном виде содержимое файла на диске.
       ----------------------T-----------------------------------------¬
       ¦                     ¦                                         ¦
       ¦Goto (Переход)       ¦Выводится строка с указанным номером  или¦
       ¦                     ¦шестнадцатиричным смещением.             ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Search (Поиск)       ¦Выполняет поиск строки или байт данных.  ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Next (Следующий)     ¦Выполняет повторный поиск (следующего    ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Display As (Режим    ¦Ascii¦Hex (В  коде  ASCII/               ¦


       ¦вывода)              ¦шестнадцатиричный): задает режим вывода  ¦
       ¦                     ¦файла.                                   ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦File (Файл)          ¦Переключает на вывод нового файла.       ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+

       TDeb 3.0 #2-3               = 100 =
       ¦                     ¦                                         ¦
       ¦Edit (Редактирование)¦ Редактирует файл или изменяет данные в   ¦
       ¦                     ¦текущей позиции курсора.                 ¦
       ¦                     ¦                                         ¦
       L---------------------+------------------------------------------
            Вместо команды локального меню Search (Поиск) можно  исполь-
       зовать сокращенный вариант: набор любого символа.
                    Локальное меню окна Log (Регистрация)
       -----------------------------------------------------------------
            В окне Log (Регистрация) выводятся сообщения, переданные для
       регистрации (протокол).
       ------------------------------T---------------------------------¬
       ¦                             ¦                                 ¦
       ¦Open Log File (Открыть файл  ¦Начинает запись протокола в файл.¦
       ¦регистрации)                 ¦                                 ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Close Log File (Закрыть файл ¦Прекращает запись протокола в    ¦
       ¦регистрации)                 ¦файл.                            ¦


       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Logging (Регистрация)        ¦No¦Yes (Да¦Нет): включает или    ¦
       ¦                             ¦выключает регистрацию.           ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Add Comment (Добавить ком-   ¦Записывает в протокол регистрации¦
       ¦ментарий)                    ¦комментарий пользователя.        ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Erase Log (Стереть протокол) ¦Стирает все зарегистрированные   ¦
       ¦                             ¦сообщения.                       ¦
       ¦                             ¦                                 ¦
       +-----------------------------+---------------------------------+
       ¦                             ¦                                 ¦
       ¦Display Windows Info         ¦ Выводит диалоговое окно Windows  ¦
       ¦(Вывод информации Windows)   ¦Information (Информация Windows),¦
       ¦                             ¦из которого выбрать, что вы      ¦
       ¦                             ¦хотите выводить на экран         ¦
       ¦                             ¦(глобальную динамически          ¦
       ¦                             ¦распределяемую область памяти,   ¦
       ¦                             ¦локальную динамически            ¦
       ¦                             ¦распределяемую область памяти или¦
       ¦                             ¦модуль).                         ¦
       ¦                             ¦                                 ¦


       L-----------------------------+----------------------------------

       TDeb 3.0 #2-3               = 101 =
            Вместо команды локального меню Add Comment (Добавить коммен-
       тарий) можно использовать сокращенный вариант:  набор любого сим-
       вола.

       TDeb 3.0 #2-3               = 102 =
                            Окно Module (Модуль)
       -----------------------------------------------------------------
            В окне  Module (Модуль) выводится содержимое исходного файла
       программного модуля.
       ----------------------T-----------------------------------------¬
       ¦                     ¦                                         ¦
       ¦Inspect (Проверка)   ¦Выводится  содержимое переменной под     ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Watch (Просмотр)     ¦К списку выражений просмотра добавляется ¦
       ¦                     ¦переменная под курсором.                 ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Module (Модуль)      ¦Выводит на экран другой модуль.          ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦File (Файл)          ¦Выводит на экран другой файл.            ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Previous (Предыдущий)¦Выводит на экран последний модуль и      ¦


       ¦                     ¦позицию.                                 ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Line (Строка)        ¦Выводит строку в модуле с указанным      ¦
       ¦                     ¦номером.                                 ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Search (Поиск)       ¦Выполняет поиск текстовой строки.        ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Next (Следующий)     ¦Выполняет повторный поиск (ищет следующее¦
       ¦                     ¦вхождение строки).                       ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Origin (Начало)      ¦ Выводит на экран программу по текущему   ¦
       ¦                     ¦адресу.                                  ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Goto (Переход)       ¦Выводит на экран исходный код или        ¦
       ¦                     ¦инструкции по указанному адресу.         ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+

       TDeb 3.0 #2-3               = 103 =


       ¦                     ¦                                         ¦
       ¦Edit (Редактирование)¦Запускает редактор для редактирования    ¦
       ¦                     ¦исходного файла.                         ¦
       ¦                     ¦                                         ¦
       L---------------------+------------------------------------------
            Вместо команды локального меню Goto (Переход) можно  исполь-
       зовать сокращенный вариант: набор любого символа.
                            Окно Windows Messages
       -----------------------------------------------------------------
            Окно Windows Messages (Сообщения Windows) имеет три области:
       область выбора окна (Window Selection),  область класса сообщения
       (Message Class) и область сообщений (Messages).

       TDeb 3.0 #2-3               = 104 =
                             Область выбора окна
       -----------------------------------------------------------------
            Эта область имеет следующие команды локального меню:
       -----------------------T----------------------------------------¬
       ¦                      ¦                                        ¦
       ¦Add (Добавление)      ¦Добавляет имя окна или логический номер.¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Remove (Удаление)     ¦Удаляет выбранное окно.                 ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Delete All (Удалить   ¦Удаляет все выбранные окна.             ¦
       ¦все)                  ¦                                        ¦
       ¦                      ¦                                        ¦


       L----------------------+-----------------------------------------
            Ввод любого  символа является сокращенной формой команды Add
       (Добавление) локального меню данной области.
            Клавиша Del или комбинация Ctrl-Y - это сокращение  для  ко-
       манды локального меню Remove.

       TDeb 3.0 #2-3               = 105 =
                          Область класса сообщений
       -----------------------------------------------------------------
            Эта область имеет следующие команды локального меню:
       ------------------------T---------------------------------------¬
       ¦                       ¦                                       ¦
       ¦Add (Добавление)       ¦Добавляет класс сообщений или отдельное¦
       ¦                       ¦сообщение.                             ¦
       ¦                       ¦                                       ¦
       +-----------------------+---------------------------------------+
       ¦                       ¦                                       ¦
       ¦Remove                 ¦Удаляет выбранный класс сообщений или  ¦
       ¦(Удаление)             ¦отдельное сообщение.                   ¦
       ¦                       ¦                                       ¦
       +-----------------------+---------------------------------------+
       ¦                       ¦                                       ¦
       ¦Delete All             ¦Удаляет все выбранные классы или       ¦
       ¦(Удалить все)          ¦отдельные сообщения.                   ¦
       ¦                       ¦                                       ¦
       L-----------------------+----------------------------------------
             Ввод любого символа является сокращенной формой команды Add
       локального меню данной области.
            Клавиша Del или комбинация Ctrl-Y - это сокращение  для  ко-
       манды локального меню Remove.
                               Область сообщений


       -----------------------------------------------------------------
            Эта область имеет следующие команды локального меню:
       -----------------------T----------------------------------------¬
       ¦                      ¦                                        ¦
       ¦Send to log window    ¦Посылает все принятые сообщения в окно  ¦
       ¦(Пересылка в окно     ¦регистрации, чтобы сохранить их в       ¦
       ¦регистрации)          ¦протоколе  регистрации.                 ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Erase log (Стирание)  ¦Удаляет все сообщения в области.        ¦
       ¦                      ¦                                        ¦
       L----------------------+-----------------------------------------

       TDeb 3.0 #2-3               = 106 =
                               Окно Clipboard
       -----------------------------------------------------------------
            В окне Clipboard выводятся все элементы, которые вы скопиро-
       вали в карман.  Оно имеет единственную область со следующими  ко-
       мандами локального меню:
       -----------------------T----------------------------------------¬
       ¦                      ¦                                        ¦
       ¦Inspect (Проверка)    ¦Переводит вас в то окно, из которого был¦
       ¦                      ¦скопирован элемент, благодаря чему вы   ¦
       ¦                      ¦можете его проверить.                   ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Remove (Удаление)     ¦Удаляет подсвеченный элемент.           ¦
       ¦                      ¦                                        ¦


       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Delete All (Удалить   ¦Удаляет все элементы окна Clipboard.    ¦
       ¦все)                  ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Freeze ("Заморозить") ¦Приостанавливает изменение значение     ¦
       ¦                      ¦(сохраняется текущее значение элемента).¦
       ¦                      ¦                                        ¦
       L----------------------+-----------------------------------------
                    Окно Numeric Proseccor (Сопроцессор)
       -----------------------------------------------------------------
            Окно Numeric Processor (Арифметический сопроцессор) содержит
       три области:  область регистров,  область состояния и область уп-
       равления.

       TDeb 3.0 #2-3               = 107 =
                              Область регистров
       -----------------------------------------------------------------
            В качестве сокращенных вариантов команд локального меню дан-
       ной области можно использовать следующие клавиши:
       ---------------T------------------------------------------------¬
       ¦              ¦                                                ¦
       ¦Zero (Ноль)   ¦Очищает подсвеченный регистр.                   ¦
       +--------------+------------------------------------------------+
       ¦              ¦                                                ¦
       ¦Empty (Пусто) ¦Устанавливает подсвеченный регистр в пустое     ¦
       ¦              ¦значение.                                       ¦
       +--------------+------------------------------------------------+
       ¦              ¦                                                ¦


       ¦Change        ¦Устанавливает подсвеченный регистр в заданное   ¦
       ¦(Изменение)   ¦значение.                                       ¦
       L--------------+-------------------------------------------------
            Вместо команды  локального меню данной области Change (Изме-
       нение) можно использовать сокращенный вариант:  набор любого сим-
       вола.
                              Область состояния
       -----------------------------------------------------------------
       ------------------------T--------------------------------------¬
       ¦                       ¦                                      ¦
       ¦ Toggle (Переключение) ¦ Циклически изменяет значение флага.  ¦
       L-----------------------+---------------------------------------
            В качестве сокращенного варианта данной  команды  локального
       меню  можно использовать просто нажатие клавиши Enter или пробел.
                             Область управления
       -----------------------------------------------------------------
       ------------------------T--------------------------------------¬
       ¦                       ¦                                      ¦
       ¦ Toggle (Переключение) ¦ Циклически изменяет значение флага.  ¦
       ¦                       ¦                                      ¦
       L-----------------------+---------------------------------------
            В качестве сокращенного варианта данной  команды  локального
       меню  можно использовать просто нажатие клавиши Enter или пробел.
                          Окно Hierarchy (Иерархия)
       -----------------------------------------------------------------
            Окно Hierarchy  (Иерархия)  содержит  две  области:  область

       TDeb 3.0 #2-3               = 108 =
       списка типов объектов и область дерева иерархии.
                    Область списка типов объектов/классов
       ---------------------T-----------------------------------------¬


       ¦                    ¦                                         ¦
       ¦Inspect (Проверка)  ¦Выводит содержимое подсвеченного типа    ¦
       ¦                    ¦объекта/класса                           ¦
       ¦                    ¦                                         ¦
       +--------------------+-----------------------------------------+
       ¦                    ¦                                         ¦
       ¦Tree (Дерево)       ¦Переводит вас в область дерева иерархии. ¦
       ¦                    ¦                                         ¦
       L--------------------+------------------------------------------

       TDeb 3.0 #2-3               = 109 =
                           Область дерева иерархии
       ----------------------T----------------------------------------¬
       ¦                     ¦                                        ¦
       ¦Inspect (Проверка)   ¦Выводит содержимое подсвеченного типа   ¦
       ¦                     ¦объекта/класса.                         ¦
       ¦                     ¦                                        ¦
       +---------------------+----------------------------------------+
       ¦                     ¦                                        ¦
       ¦Parents (Порождающие ¦Если вы выполняете программу с          ¦
       ¦объекты/классы)      ¦множественным наследованием, выполняет  ¦
       ¦                     ¦переключение области дерева порождающих ¦
       ¦                     ¦объектов/классов.                       ¦
       ¦                     ¦                                        ¦
       L---------------------+-----------------------------------------
                 Область дерева порождающих объектов/классов
       -----------------------T----------------------------------------¬
       ¦                      ¦                                        ¦
       ¦Inspect (Проверка)    ¦Выводит содержимое подсвеченного типа   ¦
       ¦                      ¦объекта.                                ¦


       ¦                      ¦                                        ¦
       L----------------------+-----------------------------------------
                    Меню окна Registers (Регистры)
       -----------------------------------------------------------------
            Окно Registers (Регистры)  идентично  областям  регистров  и
       флагов окна CPU (ЦП). Его локальные меню идентичны локальным меню
       области регистров и области флагов.

       TDeb 3.0 #2-3               = 110 =
                              Окно Stack (Стек)
       -----------------------------------------------------------------
            В области стека выводятся активные в данный момент  процеду-
       ры.
       -----------------------T----------------------------------------¬
       ¦                      ¦                                        ¦
       ¦Inspect (Проверка)    ¦Выводит исходный код текущей            ¦
       ¦                      ¦подсвеченной) процедуры.                ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Locals (Локальные)    ¦Выводит локальные переменные процедуры. ¦
       ¦                      ¦                                        ¦
       L----------------------+-----------------------------------------
            В качестве сокращенного  варианта  команды  локального  меню
       Inspect можно использовать просто нажатие клавиши Enter.
                         Окно Variables (Переменные)
       -----------------------------------------------------------------
            Это окно разделено на две области,  у каждой из которых име-
       ется  свое  локальное меню:  область глобальных идентификаторов и
       область локальных идентификаторов.
                      Область глобальных идентификаторов
       ------------------------T---------------------------------------¬


       ¦                       ¦                                       ¦
       ¦Inspect                ¦Отображает значение выделенной         ¦
       ¦                       ¦переменной.                            ¦
       ¦                       ¦                                       ¦
       +-----------------------+---------------------------------------+
       ¦                       ¦                                       ¦
       ¦Change                 ¦Заменяет значение выделенной           ¦
       ¦                       ¦переменной.                            ¦
       ¦                       ¦                                       ¦
       +-----------------------+---------------------------------------+
       ¦                       ¦                                       ¦
       ¦Watches                ¦Добавляет выделенный идентификатор в   ¦
       ¦                       ¦окно Watches.                          ¦
       ¦                       ¦                                       ¦
       L-----------------------+----------------------------------------
            Нажатие клавиши Enter является  сокращенной  формой  команды
       Inspect локального меню данной области.

       TDeb 3.0 #2-3               = 111 =
                   Область локальных идентификаторов
       -----------------------T----------------------------------------¬
       ¦                      ¦                                        ¦
       ¦Inspect               ¦Отображает значение выделенной          ¦
       ¦                      ¦переменной.                             ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Change                ¦Заменяет значение выделенной            ¦
       ¦                      ¦переменной.                             ¦
       ¦                      ¦                                        ¦


       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Watches               ¦Добавляет выделенный идентификатор в    ¦
       ¦                      ¦окно Watches.                           ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Show                  ¦Изменяет модули, или показывает         ¦
       ¦   Static             ¦только статические переменные,          ¦
       ¦   Auto               ¦только динамические переменные,         ¦
       ¦   Both               ¦или и то, и другое.                     ¦
       ¦   Module             ¦Изменяет текущий модуль.                ¦
       ¦                      ¦                                        ¦
       L----------------------+-----------------------------------------
            В качестве  сокращенного  варианта  команды  локального меню
       Inspect можно использовать просто нажатие клавиши Enter.

       TDeb 3.0 #2-3               = 112 =
                           Окно Watches (Просмотр)
       -----------------------------------------------------------------
            Окно Watches (Просмотр) содержит единственную область, в ко-
       торой выводятся имена и значения просматриваемых переменных.
       ----------------------T-----------------------------------------¬
       ¦                     ¦                                         ¦
       ¦Watch (Просмотр)     ¦Добавляет переменную в область просмотра.¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Edit (Редактирование)¦Позволяет редактировать переменную.      ¦


       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Remove (Удаление)    ¦Удаляет подсвеченную переменную.         ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Delete All (Удалить  ¦Удаляет все переменные просмотра.        ¦
       ¦все)                 ¦                                         ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Inspect (Проверка)   ¦Выводит содержимое подсвеченной          ¦
       ¦                     ¦переменной.                              ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Change (Изменение)   ¦Изменяет содержимое подсвеченной         ¦
       ¦                     ¦переменной.                              ¦
       ¦                     ¦                                         ¦
       L---------------------+------------------------------------------
            В качестве  сокращений  команд данного локального меню можно
       использовать следующие клавиши:
                         -------------------------------------
                         Клавиша                 Функция
                         -------------------------------------
                         Любой символ           Просмотр
                         Enter                  Редактирование
                         Del                    Удаление


                         -------------------------------------

       TDeb 3.0 #2-3               = 113 =
                          Окно Inspector (Проверка)
       -----------------------------------------------------------------
            В окне  Inspector  (Проверка)  выводится содержимое элемента
       данных.
       ----------------------T-----------------------------------------¬
       ¦                     ¦                                         ¦
       ¦Range (Диапазон)     ¦ Позволяет выбрать для проверки элементы  ¦
       ¦                     ¦массива.                                 ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Change (Изменение)   ¦Изменяет значение подсвеченного элемента.¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Inspect (Проверка)   ¦Открывает для подсвеченного элемента     ¦
       ¦                     ¦новое окно Inspector.                    ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Descend (Нисходящий) ¦Расширяет подсвеченный элемент в данное  ¦
       ¦                     ¦окно проверки.                           ¦
       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦New Expression (Новое¦Проверяет в данном окне Inspector новое  ¦
       ¦выражение)           ¦выражение.                               ¦


       ¦                     ¦                                         ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Type Cast (Приведение¦Приводит тип подсвеченного элемента в    ¦
       ¦типа)                ¦соответствие с новым элементом.          ¦
       ¦                     ¦                                         ¦
       L---------------------+------------------------------------------
                      Окно проверки типа объекта/класса
       -----------------------------------------------------------------
             Окно проверки  типа   объекта/класса   (Object   Type/class
       Inspector) имеет две области, в которых выводится содержимое (по-
       ля данных или элементы класса либо методы  или функции-элементы).
       Локальные меню обеих областей совпадают,  но сильно отличаются от
       локальных меню обычных окно проверки (Inspector).

       TDeb 3.0 #2-3               = 114 =
       -----------------------T----------------------------------------¬
       ¦                      ¦                                        ¦
       ¦Inspect (Проверка)    ¦Выводит содержимое подсвеченного типа   ¦
       ¦                      ¦объекта/класса.                         ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Hierarchy (Иерархия)  ¦Возвращает вас в окно иерархии.         ¦
       ¦                      ¦                                        ¦
       +----------------------+----------------------------------------+
       ¦                      ¦                                        ¦
       ¦Show Inherited (Вывод ¦Переключает между выводом содержимого   ¦
       ¦наследования)         ¦всех объектов или классов и содержимым, ¦


       ¦                      ¦описанным в текущем объекте.            ¦
       ¦                      ¦                                        ¦
       L----------------------+-----------------------------------------

       TDeb 3.0 #2-3               = 115 =
                      Окно проверки экземпляра объекта
       -----------------------------------------------------------------
            Окно проверки   экземпляра   объекта/класса    (Object/Class
       Instance Inspector) содержит три области,  из которых только пер-
       вая область имеет локальное меню  (в  третьей  области  выводится
       только  тип  объекта или класса,  к которому относится данный эк-
       земпляр).  Локальные меню первых двух областей совпадают и содер-
       жат следующие команды:
                 Клавиатурные команды области текста        Таблица 13.2
       ----------------------T-----------------------------------------¬
       ¦                     ¦                                         ¦
       ¦Range (Диапазон)     ¦Выбирает элементы массива для проверки.  ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Change (Изменение)   ¦Изменяет значение подсвеченного элемента.¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Methods (Методы)     ¦Разрешает или запрещает вывод всех       ¦
       ¦                     ¦методов в средней области.               ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Show Inherited       ¦Разрешает или запрещает вывод вывод      ¦
       ¦(Вывод наследования) ¦содержимого всех объектов и содержимого, ¦
       ¦                     ¦описанного в текущем объекте/классе      ¦
       +---------------------+-----------------------------------------+


       ¦                     ¦                                         ¦
       ¦Inspect (Проверка)   ¦Открывает новое окно Inspector для       ¦
       ¦                     ¦подсвеченного элемента.                  ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Descend (Спуск)      ¦Расширяет подсвеченный элемент в данное  ¦
       ¦                     ¦окно Inspector.                          ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Type Cast (Приведение¦Приводит тип подсвеченного элемента к    ¦
       ¦типа)                ¦новому типу.                             ¦
       +---------------------+-----------------------------------------+
       ¦                     ¦                                         ¦
       ¦Hierarchy (Иерархия) ¦Возвращает вас в окно иерархии объектов. ¦
       L---------------------+------------------------------------------
                               Области текста
       -----------------------------------------------------------------
            Это общее название тех областей, в которых на экран выводит-

       TDeb 3.0 #2-3               = 116 =
       ся содержимое текстового файла.  Текущая позиция в файле отмечена
       мерцающим курсором.  В следующей таблице приведен список всех ко-
       манд:
                 Клавиатурные команды области списка        Таблица 13.3
       ---------------T------------------------------------------------¬
       ¦ Клавиша      ¦                 Функция                        ¦
       +--------------+------------------------------------------------+
       ¦ Ins          ¦ Отмечает блок текста                           ¦
       ¦ Стрелка вверх¦ Перемещает вверх на одну строку                ¦
       ¦ Стрелка вниз ¦ Перемещает на одну строку вниз                 ¦


       ¦ Ctrl-->      ¦ Перемещает на следующее слово                  ¦
       ¦ Ctrl-<-      ¦ Перемещает на предыдущее слово                 ¦
       ¦ Home         ¦ Перемещает к началу строки                     ¦
       ¦ End          ¦ Перемещает к последнему символу строки         ¦
       ¦ PgUp         ¦ "Прокручивает" изображение на один экран вверх ¦
       ¦ PgDn         ¦ "Прокручивает" изображение на один экран вниз  ¦
       ¦ Сtrl-Home    ¦ Переводит на верхнюю строку области            ¦
       ¦ Сtrl-End     ¦ Переводит на нижнюю строку области             ¦
       ¦ Сtrl-PgUp    ¦ Переводит первую строку файла                  ¦
       ¦ Сtrl-PgDn    ¦ Переводит на последнюю строку файла            ¦
       L--------------+-------------------------------------------------
             Если вы не используете сокращения с клавишей Ctrl, то можно
       также для перемещения в области текста  использовать  управляющие
       клавиши, аналогичные редактору WordStar.

       TDeb 3.0 #2-3               = 117 =
                               Области списков
       -----------------------------------------------------------------
            Области списков - это общее название области, где перечисля-
       ется информация, которую вы можете "пролистывать". На текущую по-
       зицию в списке указывает подсветка.  Приведем список всех доступ-
       ных вам команд:
       ----------------------T-----------------------------------------¬
       ¦ Клавиша             ¦ Функция                                 ¦
       +---------------------+-----------------------------------------+
       ¦ Стрелка вверх       ¦ Перемещение вверх на один элемент       ¦
       ¦ Стрелка вниз        ¦ Перемещение вниз на один элемент        ¦
       ¦ Home                ¦ Переход к началу строки                 ¦
       ¦ PgUp                ¦ "Прокрутка" вверх на один экран         ¦
       ¦ PgDn                ¦ "Прокрутка" вниз на один экран          ¦


       ¦ Ctrl-Home           ¦ Переход к верхней строке области списка ¦
       ¦ Ctrl-End            ¦ Переход к нижней строке области списка  ¦
       ¦ Ctrl-PgUp           ¦ Переход к первому элементу списка       ¦
       ¦ Ctrl-PgDn           ¦ Переход к последнему элементу списка    ¦
       ¦ Backspace           ¦ Возврат  назад на один символ при       ¦
       ¦                     ¦ сравнении                               ¦
       ¦ Буква               ¦ Поиск с увеличением (выбор при наборе)  ¦
       L---------------------+------------------------------------------
            Можно также для перемещения в  области  текста  использовать
       управляющие клавиши, аналогичные редактору WordStar.

       TDeb 3.0 #2-3               = 118 =
                          Команды в окнах подсказки
       -----------------------------------------------------------------
            В следующей таблице перечислены все команды,  которые  можно
       использовать внутри окна подсказки, в окне ввода или в окне спис-
       ка:
                Клавиатурные команды диалогового окна      Таблица 13.4
       -----------------------T----------------------------------------¬
       ¦Клавиша               ¦         Функция                        ¦
       +----------------------+----------------------------------------+
       ¦Стрелка вверх         ¦ Перемещение вверх на одну запись       ¦
       ¦Стрелка вниз          ¦ Перемещение вниз на одну запись        ¦
       ¦Стрелка вправо        ¦ Перемещение вправо на один символ      ¦
       ¦Стрелка влево         ¦ Перемещение влево на один символ       ¦
       ¦Ctrl-->               ¦ Перемещение к следующему слову         ¦
       ¦Ctrl-<-               ¦ Перемещение к предыдущему слову        ¦
       ¦Home                  ¦ Переход к началу строки                ¦
       ¦End                   ¦ Переход к концу строки                 ¦
       ¦PgUp                  ¦ "Прокрутка" вверх на один экран        ¦


       ¦PgDn                  ¦ "Прокрутка" вниз на один экран         ¦
       ¦Ctrl-Home             ¦ Переход к верхней строке области списка¦
       ¦Ctrl-End              ¦ Переход к нижней строке области списка ¦
       ¦Ctrl-PgUp             ¦ Переход к первому элементу списка      ¦
       ¦Ctrl-PgDn             ¦ Переход к последнему элементу списка   ¦
       ¦Backspace             ¦ Удаление символа перед курсором        ¦
       ¦Enter                 ¦ Воспринимается и обрабатывается то,    ¦
       ¦                      ¦ что вы ввели                           ¦
       ¦Del                   ¦ Удаление одного символа после курсора  ¦
       ¦Esc                   ¦ Отмена подсказки и возврат в меню      ¦
       L----------------------+-----------------------------------------

       TDeb 3.0 #2-3               = 119 =
                          Команды перемещения окна
       -----------------------------------------------------------------
            В следующей таблице показаны клавиши,  с помощью которых  вы
       можете изменять позицию и размер окна на экране.
                  Клавиатурные команды перемещения окна      Таблица 13.5
       -----------------------T-----------------------------------------¬
       ¦ Клавиша              ¦ Функция                                 ¦
       +----------------------+-----------------------------------------+
       ¦ Ctrl-F5              ¦ Переключение режима позиционирования    ¦
       ¦                      ¦ окна                                    ¦
       ¦ Cтрелка вверх        ¦ Перемещение окна вверх на одну строку   ¦
       ¦ Стрелка вниз         ¦ Перемещение окна вниз на одну строку    ¦
       ¦ Стрелка влево        ¦ Перемещение окна влево на одну позицию  ¦
       ¦ Стрелка вправо       ¦ Перемещение окна вправо на одну позицию ¦
       ¦ Shift-Стрелка вверх  ¦ Перемещение окна вверх на несколько     ¦
       ¦                      ¦ строк                                   ¦


       ¦ Shift-Стрелка вниз   ¦ Перемещение окна вниз на несколько строк¦
       ¦ Shift-->             ¦ Перемещение окна вправо на несколько    ¦
       ¦                      ¦ cтрок                                   ¦
       ¦ Shift-<-             ¦ Перемещение окна влево на несколько     ¦
       ¦                      ¦ строк                                   ¦
       ¦ Home                 ¦ Перемещение в левую часть экрана        ¦
       ¦ End                  ¦ Перемещение в правую часть экрана       ¦
       ¦ PgUp                 ¦ Перемещение в верхнюю строку экрана     ¦
       ¦ PgDn                 ¦ Перемещение к нижней строке экрана      ¦
       ¦ Enter                ¦ Фиксируется текущая позиция             ¦
       ¦ Esc                  ¦ Отмена команды позиционирования окна    ¦
       L----------------------+------------------------------------------
                Трафаретные символы, используемые при поиске
       -----------------------------------------------------------------
            Трафаретные символы  при  поиске  можно  использовать в двух
       случаях:
               - при вводе имени файла, который нужно загрузить и прове-
                 рить;
               - при  вводе  текстового выражения,  поиск которого нужно
                 выполнить в области текста.
            Знак вопроса (?) в выражении поиска совпадает с  любым  оди-
       ночным  символом.  Звездочка (*) в выражении поиска совпадает с 0
       или более символов.

       TDeb 3.0 #2-3               = 120 =
                             Полное дерево меню
       -----------------------------------------------------------------
            На Рис.  13.1  показана  полная  структуру спускающихся меню
       Турбо отладчика TD.
       ----------------------------------------------------------------¬
       ¦Ё File Edit View Run Breakpoints  Data  Options  Window  Help  ¦
       L-T--T--T----T----T-------T---------T------T--------T------T-----


         ¦  ¦  ¦    ¦    ¦       ¦         ¦      ¦        ¦      ¦
         ¦  ¦  ¦    ¦    ¦       ¦         ¦      ¦        ¦      L----¬
         ¦  ¦  ¦    ¦    ¦       ¦         ¦      ¦        L----------¬¦
         ¦  ¦  ¦    ¦    ¦       ¦         ¦      L------------------¬¦¦
         ¦  ¦  ¦    ¦    ¦       ¦         L------------------------¬¦¦¦
         ¦  ¦  ¦    ¦    ¦       L---------------------------------¬¦¦¦¦
         ¦  ¦  ¦    ¦    L--------------------------¬              ¦¦¦¦¦
         ¦  ¦  ¦    L------------¬                  ¦              ¦¦¦¦¦
         ¦  ¦  L----------------¬¦                  ¦              ¦¦¦¦¦
         ¦  L------------------¬¦¦                  v              ¦¦¦¦¦
         L------¬              ¦¦¦    ---------------------------¬ ¦¦¦¦¦
                ¦              ¦¦¦    ¦            Run           ¦ ¦¦¦¦¦
                v              ¦¦¦    ¦--------------------------¦ ¦¦¦¦¦
           -------------------¬¦¦¦    ¦ Run                   F9 ¦ ¦¦¦¦¦
           ¦    Ё (System)    ¦¦¦¦    ¦ Go to cursor          F4 ¦ ¦¦¦¦¦
           ¦------------------¦¦¦¦    ¦ Trace Into            F7 ¦ ¦¦¦¦¦
           ¦ Repaint Desktop  ¦¦¦¦    ¦ Step Over             F8 ¦ ¦¦¦¦¦
           ¦ Restore Standard ¦¦¦¦    ¦ Execute to...     Alt-F9 ¦ ¦¦¦¦¦
           ¦------------------¦¦¦¦    ¦ Until Return      Alt-F8 ¦ ¦¦¦¦¦
           ¦ About...         ¦¦¦¦    ¦ Animate...               ¦ ¦¦¦¦¦
           L-------------------¦¦¦    ¦ Back Trace        Alt-F4 ¦ ¦¦¦¦¦
       -------------------------¦¦    ¦ Instruction Trace Alt-F7 ¦ ¦¦¦¦¦
       ¦            -------------¦    ¦--------------------------¦ ¦¦¦¦¦
       ¦            v            ¦    ¦ Arguments...             ¦ ¦¦¦¦¦
       ¦   -------------------¬  ¦    ¦ Program reset    Ctrl-F2 ¦ ¦¦¦¦¦
       ¦   ¦      File        ¦  ¦    L--------------------------- ¦¦¦¦¦
       ¦   ¦------------------¦  ¦                 -----------------¦¦¦¦
       ¦   ¦ Open...          ¦  ¦                 ¦                ¦¦¦¦


       ¦   ¦ Change dir...    ¦  ¦                 v               --¦¦¦
       ¦   ¦ Get Info...      ¦  ¦    ---------------------------¬ ¦ ¦¦¦
       ¦   ¦                  ¦  ¦    ¦      Breakpoints         ¦ ¦ ¦¦¦
       ¦   ¦                  ¦  ¦    ¦--------------------------¦ ¦ ¦¦¦
       ¦   ¦------------------¦  ¦    ¦ Toggle                F2 ¦ ¦ ¦¦¦
       ¦   ¦ Symbol Load...   ¦  ¦    ¦ At...             Alt-F2 ¦ ¦ ¦¦¦
       ¦   ¦                  ¦  ¦    ¦ Changed memory global... ¦ ¦ ¦¦¦
       ¦   ¦------------------¦  ¦    ¦ Expression true global...¦ ¦ ¦¦¦
       ¦   ¦ Quit       Alt-X ¦  ¦    ¦ Handware Breakpoint...   ¦ ¦ ¦¦¦
       ¦   L-------------------  ¦    ¦ Delete all               ¦ ¦ ¦¦¦
       ¦             -------------    L--------------------------- ¦ ¦¦¦
       ¦             ¦                              ---------------- ¦¦¦
       ¦             v                              ¦                ¦¦¦
       ¦    --------------------¬                   v                ¦¦¦
       ¦    ¦        View       ¦     ------------------------------¬¦¦¦
       ¦    ¦-------------------¦     ¦           Data              ¦¦¦¦

       TDeb 3.0 #2-3               = 121 =
       ¦    ¦ Breakpoints       ¦     ¦-----------------------------¦¦¦¦
       ¦    ¦ Stack             ¦     ¦ Inspect...                  ¦¦¦¦
       ¦    ¦ Log               ¦     ¦ Evaluate¦modify...  Ctrl-F4 ¦¦¦¦
       ¦    ¦ Watches           ¦     ¦ Add watch...        Ctrl-F7 ¦¦¦¦
       ¦    ¦ Variables         ¦     ¦ Function return             ¦¦¦¦
       ¦    ¦ Module...      F3 ¦     L------------------------------¦¦¦
       ¦    ¦ File...           ¦                                    ¦¦¦
       ¦    ¦ CPU               ¦                           ----------¦¦
       ¦    ¦ Dump              ¦     -------------¬        ¦         ¦¦
       ¦    ¦ Registers         ¦  ---¦ Module...  ¦        ¦         ¦¦
       ¦    ¦ Numeric Processor ¦  ¦  ¦ Dump       ¦        ¦         ¦¦


       ¦    ¦ Execution History ¦  ¦  ¦ File...    ¦        ¦         ¦¦
       ¦    ¦ Hierarchy         ¦  ¦  L-------------        ¦         ¦¦
       ¦    ¦ Windows messages  ¦  ¦                        ¦         ¦¦
       ¦    ¦ Another          >¦---                        ¦         ¦¦
       ¦    L--------------------  --------------------------         ¦¦
       ¦                  ----------                        -----------¦
       ¦                  v                                 ¦          ¦
       ¦    ----------------------------¬                   v          ¦
       ¦    ¦          Options          ¦        ---------------------¬¦
       ¦    ¦---------------------------¦        ¦       Window       ¦¦
       ¦    ¦ Language...        Source ¦        ¦--------------------¦¦
       ¦    ¦ Macros                   >¦--¬     ¦ Zoom            F5 ¦¦
       ¦    ¦ Display options...        ¦  ¦     ¦ Next            F6 ¦¦
       ¦    ¦ Path for source...        ¦  ¦     ¦ Next pane      Tab ¦¦
       ¦    ¦ Save options...           ¦  ¦     ¦ Size/move  Ctrl-F5 ¦¦
       ¦    ¦ Restore options...        ¦  ¦     ¦ Iconsize/restore   ¦¦
       ¦    L----------------------------  ¦     ¦ Close       Alt-F3 ¦¦
       ¦                  ------------------     ¦ Undo close  Alt-F6 ¦¦
       ¦                  ¦                      ¦--------------------¦¦
       ¦                  v                      ¦ Dump pane to log   ¦¦
       ¦    ----------------------------¬        ¦ User screen Atl-F5 ¦¦
       ¦    ¦ Create...           Alt = ¦        ¦ 1 Module TPDEMO    ¦¦
       ¦    ¦ Stop recording      Alt - ¦        ¦ 2 Watches          ¦¦
       ¦    ¦ Remove                    ¦        L---------------------¦
       ¦    ¦ Delete all                ¦                ---------------
       ¦    L----------------------------                ¦
       L--------------¬                                  v
                      ¦                      ------------------------¬


                      v                      ¦         Help          ¦
          ------------------------¬          ¦-----------------------¦
          ¦         Edit          ¦          ¦ Index        Shift-F1 ¦
          ¦-----------------------¦          ¦ Previous topic Alt-F1 ¦
          ¦ Copy         Shift-F3 ¦          ¦ Help on help          ¦
          ¦ Paste        Shift-F4 ¦          L------------------------
          ¦ Copy to Log           ¦
          ¦ Dump pane to log      ¦
          L------------------------

       TDeb 3.0 #2-3               = 122 =
                         Глава 14. Отладка программы
       -----------------------------------------------------------------
            Отладка программы  аналогична  всем другим этапам реализации
       программы - это наполовину искусство, наполовину наука. Существу-
       ют специальные процедуры, которые можно использовать для отслежи-
       вания  ошибки,  однако,  чтобы сократить этот процесс,  требуется
       также хорошая интуиция.
            В большинстве отлаживаемых вами программ лучшее,  что вы мо-
       жете сделать - это быстро найти источник ошибок в  исходном коде.
       Для  этого нужно освоить соответствующие методы,  а также изучить
       такие способы,  которые позволят  избежать  повторного  появления
       ошибок.
            Мы начнем с того, что посмотрим, с чего можно начать отладку
       программы, которая не работает должным образом.
            В данной главе мы обсудим также различные подходы к отладке,
       разные  типы  ошибок,  которые  могут встречаться в программе,  и
       предложим методы проверки программы, позволяющие убедиться в пра-
       вильности ее работы.
            Давайте посмотрим,  с чего можно начать,  когда программа не
       работает корректно.
                          Когда что-то не работает
       -----------------------------------------------------------------
            Прежде всего не следует  впадать  в  панику.  Даже  наиболее


       опытные программисты редко пишут программы,  которые начинают ра-
       ботать с первого раза.
            Чтобы избежать напрасной траты времени на долгие и  бесплод-
       ные поиски ошибки, постарайтесь побороть стремление случайно уга-
       дать,  где находится ошибка.  Лучшим методом здесь будет  универ-
       сальный принцип "разделяй и властвуй".
            Нужно сделать  ряд предположений,  проверив каждое из них по
       очереди.  Например, вы можете предположить: "Ошибка должна возни-
       кать перед вызовом функции xyz".  Затем нужно проверить это пред-
       положение,  остановив программу перед вызовом функции xyz и  пос-
       мотрев,  есть ли ошибка.  Если вы обнаружите ошибку в этой точке,
       можно сделать следующее предположение,  что  ошибка  возникает  в
       программе где-то раньше.
            С другой  стороны,  если при вызове функции xyz все выглядит
       прекрасно,  ваше предположение оказалось неверным. Нужно изменить
       это  предположение  на следующее:  "Ошибка возникает где-то после
       вызова функции xyz.  Выполнив ряд аналогичных проверок,  вы скоро
       найдете ту часть программы, где возникает ошибка.
            Это прекрасно,  скажете вы, но как же определить после оста-

       TDeb 3.0 #2-3               = 123 =
       новки программы,  что она ведет себя правильно? Один из наилучших
       путей проверки поведения программы состоит в анализе значений пе-
       ременных и объектов данных программы.  Например,  если у вас есть
       подпрограмма,  очищающая  массив,  вы можете проверить ее работу,
       остановив программу после выполнения данной подпрограммы и прове-
       рив затем каждый элемент массива, чтобы убедиться, что он очищен.
                                Стиль отладки
       -----------------------------------------------------------------
            У каждого свой стиль как разработки программы,  так и ее от-
       ладки.


Те рекомендации по отладке, которые мы здесь приводим, яв-
       ляются лишь отправными пунктами,  которые позволят вам  сформиро-
       вать свой подход.
            В многих  случаях на метод отладки влияет предполагаемое ис-
       пользование (назначение) программы. Некоторые программы вы пишете
       для  себя,  либо  они будут использованы только один или два раза
       для выполнения конкретной задачи.  Для таких программ разносторо-
       нее  тестирование всех их элементов было бы напрасной тратой вре-
       мени, особенно, если после проверки ее выходных данных вы видите,
       что программа работает правильно. Для тех программ, которые пред-
       полагается распространять, или для тех, которые выполняют задачу,
       правильность  которой трудно определить с помощью проверки, может
       оказаться желательным более строгое тестирование.
                              Полное выполнение
       -----------------------------------------------------------------
            Для простых программ лучший подход, вероятно, состоит в том,
       чтобы просто запустить программу и  посмотреть,  что  получилось.
       Если при такой проверке будут обнаружены ошибки,  вы можете "сде-
       лать шаг назад" и  запустить  программу  с  максимально  простыми
       входными данными, чтобы проверить затем ее вывод. Затем можно пе-
       рейти к проверке с более сложными входными данными,  и так далее,
       пока выходная информация не станет неверной. Это даст вам хорошее
       представление о том, насколько корректно работает программа.
                        Последовательное тестирование
       -----------------------------------------------------------------
            Если вы  хотите полностью убедиться,  что программа работает
       правильно,  нужно проверить отдельные подпрограммы,  а также убе-
       диться,  что  программа выдает ожидаемые результаты для некоторых
       тестовых входных данных. Это можно сделать двумя способами: можно


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

       TDeb 3.0 #2-3               = 124 =
                                 Типы ошибок
       -----------------------------------------------------------------
            Ошибки в  программе  можно разбить на две больших категории:
       ошибки,  относящиеся к используемому языку (Си,  Паскалю или  Ас-
       семблеру),  и  ошибки,  общие  для всех языков программирования и
       операционных сред.
            По мере отладки программы вы изучите как  специфические  для
       языка конструкции, которые могут приводить к неприятностям, так и
       более общие ошибки программирования, которые вы сделали. Это зна-
       ние можно использовать в последующем,  чтобы постараться избежать
       повторения таких ошибок.  Кроме того,  это послужит хорошей базой
       для того,  чтобы быстрее обнаруживать ошибки в следующих програм-
       мах, которые вы будете писать.
            Здесь важно понимать,  что собой представляет каждая ошибка:
       относится  ли  она к общим ошибкам или вызвана непониманием.  Это
       улучшит ваши возможности по разработке кода без ошибок. Кроме то-
       го,  всегда  лучше писать программу без ошибок,  чем уметь быстро
       потом их исправлять.
                                Общие ошибки
       -----------------------------------------------------------------
            В следующий примерах кратко охватываются различные типы оши-
       бок, которые могут встречаться в ваших программах.
                               Скрытые эффекты
       -----------------------------------------------------------------
            Иногда вызов функции может приводить к неожиданным результа-
       там:
               char workbuf[20];


               strcpy(workbuf, "all done\n");
               convert("xyz");
               print(workbuf);
               ...
               convert(char *p) {
                       strcpy(workbuf, p);
                       while (*p)
                       ...
               }
            Здесь правильнее было бы использовать в функции  свой  собс-
       твенный рабочий буфер (workbuf).
                    Предположения об инициализации данных
       -----------------------------------------------------------------
            Иногда вы предполагаете,  что другая функция уже  установила

       TDeb 3.0 #2-3               = 125 =
       для вас какие-то значения:
               char *workbuf;
               addworkstring(char *s)
               {
                       strcpy(workbuf, s);
               }
            Надежнее будет записать эту подпрограмму,  добавив оператор:
               if (workbuf == 0) workbuf = (char *)malloc(20);
                           Не забывайте об очистке
       -----------------------------------------------------------------
            Этот тип ошибки может привести к тому,  что  ваша  программа
       будет  долго  работать,  но  в конце-концов исчерпает динамически
       распределяемую область памяти и аварийно завершит работу:
               crunch_string(char *p)
               {
                       char *word = (char*)malloc(strlen(p));
                       ctrcpy(work,p);
                       ...
                       return(p)
               }
                              "Забор и столбы"
       -----------------------------------------------------------------
            Этот тип ошибок аналогичен следующему. Сколько столбов пона-
       добиться, чтобы построить 100-метровую изгородь,если столбы нужно
       ставить через каждые 10 метров? Напрашивается ответ 10, но он не-
       верен, так как в расчет принимается последний столб в конце забо-


       ра. Приведем простой пример из программирования на Си:
               for (n = 1; n < 10; n++)
               {
               ...      /* выполняется только 9 раз */
               }
            Здесь ясно  видны  числа 1 и 10,  и вы можете подумать,  что
       цикл будет выполняться от 1 до 10.  Чтобы это действительно  было
       так, нужно вместо < указать <=.
                     Ошибки, специфические для языка Си
       -----------------------------------------------------------------
            В "Руководстве  пользователя"  по Си и С++ есть раздел о не-
       достатках программирования на Си.  Однако лучше всего изучать эту

       TDeb 3.0 #2-3               = 126 =
       тему во время отладки.
            Компиляторы Borland  Си и Borland C++ прекрасно подходит для
       того, чтобы находить многие из специфических для языка Си ошибок,
       о  которых  другие компиляторы вам даже не сообщают.  "Включив" в
       компиляторе все предупреждающие сообщения, которые он может гене-
       рировать, вы сэкономите время, необходимое для отладки программы.
       (О том,  как задавать уровень  предупреждений,  рассказывается  в
       "Руководстве пользователя по Borland C++".)
            Далее мы приведем далеко не полный перечень возможных ошибок
       при использовании языка Си.  Для некоторых из них  Borland  Си  и
       Borland  C++  генерирует  предупреждающие сообщения.  Не забудьте
       найти причину вывода всех  предупреждающих  сообщений,  поскольку
       они могут быть вызваны возможной допущенной вами ошибкой.
           Использование неинициализированных локальных переменных
       -----------------------------------------------------------------
            В языке  Си  динамические  локальные  переменные,  описанные
       внутри функции, будут иметь неопределенное значение, пока вы что-
       нибудь в них не загрузите. Например:
               do_ten_times()


               {
                       int n;
                       while   (n < 10)
                               {
                               ...
                               n++;
                       }
               }
           Данная функция будет выполнять цикл while неопределенное чис-
       ло  раз,  так  как  перед использованием в качестве счетчика n не
       инициализируется значением 0.
                          Не следует путать = и ==
       -----------------------------------------------------------------
            В выражениях язык Си позволяет использовать как присваивание
       (=), так и проверку на равенство (==). Например:
               if (x = y) {
                       ...
               }
            При этом y будет ошибочно загружено в x,  а оператор  выпол-
       нится,  если значение y не равно 0. Вероятно, вы предполагали на-
       писать следующее:
               if (x == y)
                       ...

       TDeb 3.0 #2-3               = 127 =
                   Не следует путать старшинство операций
       -----------------------------------------------------------------
            В языке Си так много операций, что иногда легко спутать, ка-
       кая из них применяется первой, когда выражение содержит несколько
       операций.  Одна из наиболее общих ошибок состоит  в  неправильном
       выполнении комбинации операции сдвига и операции сложения или вы-
       читания. Например:
               x = 3 << 1 + 1
            Если << указывается перед +,  то при вычислении этого опера-
       тора будет получено значение 12,  а не 7,  как можно было бы ожи-
       дать.
               Неверные арифметические действия с указателями
       -----------------------------------------------------------------
            Когда вы освоитесь с указателями и будет использовать их для
       работы с массивами,  будьте внимательны при сложении и  вычитании
       указателей.


Например:
               int *intp;
               intp += sizeof(int);
       не будет работать так,  как вы  задумали  (предполагая  увеличить
       intp для ссылки на следующий элемент массива).  Фактически,  intp
       продвигается на два элемента массива.  При сложении или при вычи-
       тании  из указателя Си принимает во внимание размер элемента,  на
       который ссылается указатель,  поэтому все,  что нужно сделать для
       продвижения  указателя  на следующий элемент массива - это опера-
       ция:
               intp++
                     Не забывайте о расширении по знаку
       -----------------------------------------------------------------
            Будьте аккуратны  при  присваивании  целых  чисел различного
       размера:
               int i = OXFFFE;
               long    l;
               l = i;
               if (l & OX800000000) {
               ...                            /* это будет выполнено */
               }
            Один из моментов в Си,  который может привести к неприятнос-
       тям, состоит в том, что вы не знаете о последствиях. Язык Си поз-
       воляет  свободно  использовать  присваивание  одной целочисленной
       скалярной величины (char, int и т.д.) другой, знак (положительный

       TDeb 3.0 #2-3               = 128 =
       или  отрицательный)  сохраняется  в  переменной большего размера,
       причем бит знака (старший бит) распространяется  на  всю  старшую
       часть большего скалярного значения. Например, значение типа int -
       2 (Oxfffe) становится значением типа long -2 (oxfffffffe).

       TDeb 3.0 #2-3               = 129 =
                             Помните об усечении
       -----------------------------------------------------------------
            Данный пример противоположен примеру предыдущего раздела:
               int i = 1;
               long    l = OX10000;
               l = i;
               if (i > 0) {
               ...                          /* это не будет выполнено */


               }
            Здесь присваивание i значения 1 приводит к  усечению старших
        16 бит 1, при этом в i остается значение 0.
                        Использование точки с запятой
       -----------------------------------------------------------------
            Следующий фрагмент программы на первый взгляд выглядит прек-
       расно:
               for (x = 0; x < 10; x++);
               {
               ...             /* будет выполнено 1 раз */
               }
            Почему фрагмент в фигурных скобках будет выполнен  только  1
       раз?  При ближайшем рассмотрении оказывается, что в конце выраже-
       ния for содержится точка с запятой (;).  Это труднообнаруживаемая
       ошибка приводит к тому,  что цикл выполниться 10 раз, не реализуя
       никаких действий.  Последующий блок выполниться только 1 раз. Это
       неприятная ошибка, так как ее нельзя обнаружить с помощью обычных
       методов проверки и идентификации блоков программы.
                     Макрокоманды с побочными эффектами
       -----------------------------------------------------------------
            Следующая проблема  может заставить вас никогда не использо-
       вать макрокоманды #define:
               #define toupper(c) 'a'<= (c)&&(c)<='z' ? (c)-'a'-'A': (c)
               char c, *p;
               c = toupper(*p++);
            Здесь p увеличивается 2 или 3 раза, в зависимости от регист-
       ра символа  (строчная  или  прописная буква).  Такую ошибку очень
       трудно найти, так как побочный эффект скрыт внутри макроопределе-
       ния.
              Повторение имен локальных динамических переменных
       -----------------------------------------------------------------

       TDeb 3.0 #2-3               = 130 =
            Следующую ошибку также трудно обнаружить:
               myfunc()
               {
                       int n;
                       for (n=5; n >= 0; n--)
                       {


                               int n = 10;
                               ...
                               if (n == 0)
                               {
                               ...   /* никогда не будет выполняться */
                               }
                       }
                  }
               }
            Здесь имя динамической локальной переменной повторно исполь-
       зуется во внутреннем блоке,  скрывая доступ к переменной внешнего
       блока.  При  таком  повторном использовании имен переменных нужно
       соблюдать аккуратность.  Сделать такую ошибку гораздо легче,  чем
       может вам показаться, так как большинство программистов использу-
       ют в качестве имени счетчика ограниченный  набор  имен  (i,  n  и
       т.д.).
        Неправильное использование динамических локальных переменных
       -----------------------------------------------------------------
            Рассмотрим пример функции:
               int *divide_by_3(int n)
               {
                       int i;
                       i = n / 3;
                       return(&i);
               }
            Смысл данной функции состоит в возврате указателя на резуль-
       тат.  Ошибка состоит в том,  что к тому  моменту,  когда  функция
       возвращает  управление,  динамическая локальная переменная стано-
       вится недействительной и будет вероятно заполнена другими данными
       в стеке.
                 Функция возвращает неопределенное значение
       -----------------------------------------------------------------
            Если вы не завершаете функцию ключевым словом return, за ко-
       торым  следует  выражение,  то  будет возвращаться неопределенное
       значение. Например:
               char *first_capital_letter(char *p)

       TDeb 3.0 #2-3               = 131 =
               {
                       while (*p)
                       {
                               if ('A' <= *p && *p <= 'Z)


                                       return(p);
                       p++;
                       }
               }
            Если в строке не содержится  буква в  верхнем  регистре,  то
       возвращается  случайное значение ("мусор").  В качестве последней
       строки данной функции нужно использовать оператор return(0).
              Неправильное использование ключевого слова break
       -----------------------------------------------------------------
            Ключевое слово break выполняет выход только из одного уровня
       операторов do, for, switch или while:
               for (...)
               {
                       while (...)
                       {
                               if (...)
                                       break; /* хотим выйти из цикла */
                       }
               }
            Здесь break выполняет выход только из цикла while.  Это один
       из немногих случаев,  когда предпочтительнее  использовать опера-
       тор goto.
                       Код, не приводящий к результату
       -----------------------------------------------------------------
            Иногда может встречаться прекрасно компилируемый код,  кото-
       рый не приводит ни к какому результату:
               a + b;
            Правильным вариантом этой строки будет:
               a += b

       TDeb 3.0 #2-3               = 132 =
                      Ошибки, специфические для Паскаля
       -----------------------------------------------------------------
            Поскольку в Паскале имеются средства, обеспечивающие строгую
       проверку типов и проверку ошибок,  то этот язык мало способствует
       специфическим для него ошибкам.  Однако,  поскольку Турбо Паскаль
       предоставляет вам возможность "выключать" проверку ошибок, вы мо-
       жете внести ошибки,  которые в противном случае не  возникли  бы.
       Между тем даже в Паскале есть способы этого избежать.


                        Инициализированные переменные
       -----------------------------------------------------------------
            Турбо Паскаль не инициализирует переменные автоматически. Вы
       должны  сделать  это  сами  с помощью операторов присваивания или
       описав такие переменные в виде типизованных  констант. Рассмотрим
       следующую программу:
               program Test;
               var
                       I,J,Count       : integer;
               begin
                       for I := 1 to Count do begin
                        J := I*J;
                        Writeln(I:2,' ',J:4)
                       end
               end
            Здесь Count будет иметь какое-то случайное значение,  содер-
       жащееся в занимаемой этой переменной ячейке памяти, поэтому вы не
       сможете определить, сколько раз будет выполнен данный цикл. Кроме
       того,  переменные,  описанные внутри процедуры или функции, будут
       создаваться каждый раз при входе в эту подпрограмму и уничтожать-
       ся при выходе из нее. Поэтому нельзя полагать, что эти переменные
       в промежутке между вызовами подпрограммы сохраняют свое значение.
                      Неправильная работа с указателями
       -----------------------------------------------------------------
            Этот общий тип ошибок встречается при работе  с указателями.
       Во-первых,  как уже упоминалось ранее, не следует использовать их
       до того, как им будет присвоено значение (nil (пустое) или какое-
       либо другое).  Как  и все другие переменные или структуры данных,
       указатель не инициализируется автоматически при его описании. Ему
       нужно  явным  образом присвоить начальное значение (передав его в
       качестве параметра процедуре New или  возможно  быстрее  присвоив
       ему значение nil).
            Во-вторых, не ссылайтесь на пустой указатель, то есть не пы-
       тайтесь обратиться к данным или структуре, на которые он указыва-


       ет, если указатель имеет значение nil. Например, предположим, что
       у вас имеется линейный связанный список записей, и вы хотите  вы-
       полнить  в нем поиск записи с заданным значением.  Ваша программа

       TDeb 3.0 #2-3               = 133 =
       может выглядеть следующим образом:
                function FindNode(Head : NodePtr, Val : integer);
                var
                        Temp : NodePtr;
                begin
                        Temp := Head;
                        while (Temp^.Key <> Val) and (Tamp <> nil) do
                                Temp := Temp^.Next
                        FindNode := Temp
                end { FindNode }
            Если Val не равно полю Key в каком-либо из  узлов связанного
       списка,  то эта программа,  когда Temp имеет значение nil,  будет
       пытаться вычислить Temp^.Key, что приведет к непредсказуемому по-
       ведению. Каково же здесь решение? Нужно записать выражение следу-
       ющим образом:
               while (Temp <> nil) and (Temp^.Key <> Val)
       и разрешить вычисление булевских выражений по короткой  схеме  (с
       помощью    директивы    Турбо    Паскаля    {$B-}   или   команды
       Options¦Compiler¦Boolean (Параметры¦Компилятор¦Булевские  выраже-
       ния)).  Таким образом, если Temp не равно nil, второе условие вы-
       числяться не будет.
            Наконец, не следует предполагать, что указатель устанавлива-
       ется в значение nil только потому, что вы передаете его процедуре
       Dispose или FreeMem. Указатель будет иметь при этом свое исходное
       значение,  однако память,  на которую он указывает,  будет теперь
       освобождена, и может использоваться для другой динамической пере-
       менной  После освобождения структуры данных указатель нужно явным
       образом установить в значение nil.
                 Неправильное использование области действия
       -----------------------------------------------------------------


            Паскаль позволяет  вам  использовать большой уровень вложен-
       ности процедур и функций,  и в каждой их этих процедур и  функций
       могут  содержаться ее собственные описания.  Рассмотрим следующую
       программу:
                program Confused;
                var
                        A,B :integer;
                procedure Swap(var A,B : integer);
                var
                        T : integer;
                begin
                        Writeln('2: A,B,T = ',A:3,B:3,' ',T);
                        T := A;
                        A := B;

       TDeb 3.0 #2-3               = 134 =
                        B := T;
                        Writeln('3: A,B,T =',A:3,B:3,' ',T);
                end { Swap }
                begin { тело основной программы Confused }
                        A:= 10; B := 20; T := 3-;
                        Writeln('1: A,B,T = ',A:3,B:3,' ',T);
                        Swap(B,A);
                        Writeln('4: A,B,T = ',A:3,B:3,' ',T);
                end. { Confused }
            Выводимая программой  информация  будет  выглядеть  примерно
       следующим образом:
               1: A,B,T = 10 20 30
               2: A,B,T = 20 10 22161
               3: A,B,T = 10 20 20
               4: A,B,T = 20 10 30
            Все это вызвано тем, что у вас имеется две версии переменных
       A,  B и T. В теле основной программы используются глобальные вер-
       сии, в процедуре Swap - локальные версии (ее формальные параметры
       A и B и локальная переменная T).  И что еще более запутало ситуа-
       цию,  мы обратились с вызовом Swap(B,A),  что означает,  что фор-
       мальный параметр A является на самом деле глобальной переменной B
       и наоборот.  И, конечно, нет никакой связи между локальной и гло-
       бальной версией переменной T.
            Настоящей ошибки  здесь  нет,  но проблемы могут возникнуть,
       когда вы будете считать, что модифицируете что-то, а на самом де-


       ле это не так.  Например,  переменная T в теле основной программы
       не изменяется,  хотя вы можете предполагать, что это не так. Этот
       результат, обратный описанным ранее "скрытым эффектам".
            Если бы вы использовали следующее описание записи, все стало
       бы еще более запутанным:
            type
               RecType = record
                       A,B : integer;
               end;
            var
               A,B : integer;
               Rec : RecType;
            В операторе  with  ссылка  на A или B привела бы к ссылке на
       fields, а не к ссылке на variables.
                 Неправильное использование точки с запятой
       -----------------------------------------------------------------
            Как и  язык  Си,  Паскаль  допускает использование "пустого"

       TDeb 3.0 #2-3               = 135 =
       оператора (оператора, состоящего только из точки с запятой). Раз-
       мещенная в неверном месте точка с запятой может вызвать различные
       проблемы. Рассмотрим следующую программу:
            program Test;
            var
                    I,J : integer;
            begin
                    for I := 1 to 20 do;
                    begin
                            J := I*I;
                            Writeln(I:2,' ',J:4)
                    end;
                    Writeln('Выполнено!')
            end.
            Выводом этой программы будет не список из  первых  20  целых
       чисел и их квадратов, а просто:
               20 400
               Выполнено!
            Это вызвано тем, что оператор for I := 1 to 20 заканчивается
       точкой с запятой. При этом 20 раз будет выполнен пустой оператор.
       После этого выполняется оператор в блоке begin...end  и, наконец,
       оператор Writeln. Чтобы исправить эту ошибку, нужно просто устра-
       нить точку с запятой за ключевым словом do.
                 Функция возвращает неопределенное значение


       -----------------------------------------------------------------
            Когда вы пишете функцию, нужно убедиться, что перед тем, как
       функция возвращает  управление,  ее имени присваивается некоторое
       значение. Рассмотрим следующий пример кода:
            const
                    NLMax = 100;
            type
                    NumList = array[1...NLMax] of integer;
                    ...
            function FindMax(List : Numlist; Count : integer) : integer;
            var
                    I,MAX : integer;
            begin
                   Max := List[1];
                    for I := 2 to Count do
                    if List[I] > Max then
                    begin
                            Max := List[I];
                            FindMax := Max
                    end
            end; { FindMax }

       TDeb 3.0 #2-3               = 136 =
            Эта функция будет прекрасно работать, если максимальным зна-
       чением в List не является List[1]. В этом случае никогда не будет
       присвоено  значение.  Правильный вариант функции должен выглядеть
       следующим образом:
            begin
                Max := List[1];
                for I := 2 to Count do
                if List[I] > Max then
                Max := List[I];
                FindMax := Max
            end; { FindMax }
          Уменьшение значения переменных размером в байт или слово
       -----------------------------------------------------------------
            Будьте внимательны  и  не  уменьшайте  беззнаковое скалярное
       значение (размером в слово или байт) при проверке на >= 0. Следу-
       ющий фрагмент программы образует бесконечный цикл:
            var
               w : word;
            begin
               w:= 5;
               while w >= 0 do
                       w := w - 1;
               end.
            После пятой  итерации  w равно 0.  При следующем проходе оно


       будет уменьшено до значения 65535 (так как переменная  размером в
       слово принимает значения в диапазоне от 0 до 65535), что также >=
       0.  В этих случаях следует использовать переменные не  типа  word
       или byte, а типа integer или longint.
                    Игнорирование границ и особые случаи
       -----------------------------------------------------------------
            Заметим, что в обеих версиях функции  FindMax  в  предыдущем
       разделе предполагалось, что Count >= 1. Однако в некоторых случа-
       ях значение Count может быть равно 0 (то есть список  пуст). Если
       вы  в такой ситуации вызовите функцию FindMax,  она возвратит то,
       что оказалось в List[1]. Аналогично, если Count > NLMax, выполне-
       ние  либо завершиться с ошибкой (если разрешена проверка границ),
       либо поиск максимального значения будет выполняться в ячейках па-
       мяти, не относящихся к List.
            Здесь можно предложить два решения. Одно из них состоит, ко-
       нечно,  в том,  чтобы никогда не вызывать функцию  FindMax,  если
       Count не находится в диапазоне 1..NLMax. Это не пустое замечание.
       В серьезном программном обеспечении всегда определяются  требова-
       ния, которые нужно выполнять при вызове определенной программы, а
       затем обеспечивается удовлетворение этих требований при вызове.

       TDeb 3.0 #2-3               = 137 =
            Другое решение состоит в проверке значения Count и, если оно
       не находится в диапазоне 1..NLMax,  возврате некоторого предопре-
       деленного значения.  Например,  вы можете переписать тело функции
       FindMax следующим образом:
            begin
               if (Count < 1) or (Count > NLMax) then
                       Max := -32768
               else
               begin
                  Max := List[1];
                  for I := 2 to Count do
                  if List[I] > Max then
                     Max := List[I];


               end;
               FindMax := Max
            end; { FindMax }
            Однако это приводит к следующему типу ошибок при  работе  на
       Паскале - ошибкам диапазона.
                              Ошибки диапазона
       -----------------------------------------------------------------
            По умолчанию в Турбо Паскале проверка  диапазона  выключена.
       При  этом  получается  более быстрый и компактный код,  но в тоже
       время при этом вы можете следует определенного типа  ошибки,  та-
       кие,  как присваивание переменным значения,  выходящего за их до-
       пустимый диапазон,  или обращение к несуществующему элементу мас-
       сива (как показано в приведенном выше примере).
            Первый шаг при обнаружении таких ошибок состоит во включении
       в программу директивы компилятора {$R+},  которая задает проверку
       диапазона,  компиляции программы и повторном ее запуске.  Если вы
       знаете (или догадываетесь),  где содержится ошибка,  можно помес-
       тить  указанную директиву перед данной частью программы,  а после
       нее указать директиву {$R-},  разрешив,  таким образом,  проверку
       диапазона только в той части программы, где содержится ошибка.
            Одна из  общих  ошибок выхода за границы диапазона возникает
       при использовании для индексации массива цикла while  или repeat.
       Предположим,  например,  что вы ищете элемент массива, содержащий
       определенное значение.  Вы хотите остановиться  после  того,  как
       найдете  его,  или  при достижении конца массива.  При нахождении
       элементе вы ходите возвратить его индекс,  а в противном случае -
       0. Ваш первый вариант может выглядеть так:
            function FindVal(List : NumList; Count,Val :
                         integer) : integer;
            var
                    I : integer;
            begin
                   FindVal := 0;

       TDeb 3.0 #2-3               = 138 =


                    I := 1;
                    while (I <= Count) and (List[I] <> Val) do
                            Inc(I);
                    if I <= Count then
                            FindVal := I
            end; { FindVal }
            Это прекрасно, но если Val не содержится в List и вы исполь-
       зуете обычное вычисление булевских выражений, здесь может возник-
       нуть ошибка этапа выполнения.  Почему? Потому что когда последний
       раз проверка выполняется в начале цикла while I будет равно Count
       + 1. Если Count = NLMax, вы выйдете за пределы List.
                    Ошибки, специфические для Ассемблера
       -----------------------------------------------------------------
            В каждом языке имеется свое множество ошибок, которые обычно
       очень  легко сделать, но не всегда просто обнаружить. Не является
       исключением и язык Ассемблера. Мы рассмотрим  некоторые  типичные
       ошибки, которые допускаются при программировании на Ассемблере, и
       дадим рекомендации, как можно их избежать.
                    Программист забывает о возврате в DOS
       -----------------------------------------------------------------
            В Паскале, Си и других языках программа завершается и  возв-
       ращается  в  операционную  систему  DOS  автоматически, когда нет
       больше выполняемого кода, даже если в программе отсутствует явная
       команда  ее  завершения. В языке Ассемблера это не так. Ассемблер
       выполняет только те действия, которые вы явно  указываете.  Когда
       вы запускаете программу, в которой отсутствует команда возврата в
       DOS, она просто продолжает работать до  конца  выполняемого  кода
       программы  и переходит в код, который находится в примыкающей па-
       мяти.

       TDeb 3.0 #2-3               = 139 =
                   Программист забывает об инструкции RET
       -----------------------------------------------------------------


            Заметим, что правильный вызов подпрограммы состоит из вызова
       подпрограммы  из  другой  части  кода,  выполнения подпрограммы и
       возврата из подпрограммы  в  вызывающую  программу.  Не  забудьте
       включать  в каждую подпрограмму инструкцию RET, по которой управ-
       ление будет передаваться в вызывающий код. При  наборе  программы
       эту директиву легко пропустить.  В этом случае ее выполнение  за-
       кончится ошибкой.
                      Генерация неверного типа возврата
       -----------------------------------------------------------------
            Директива PROC действует двояко. Во-первых,  она  определяет
       имя,  по  которому будет вызываться процедура. Во-вторых, она уп-
       равляет типом (ближним или дальним) процедуры.
            Тип процедуры используется Турбо Ассемблером для определения
       того,  какой  тип вызовов нужно генерировать при вызове процедуры
       из того же исходного файла. Тип процедуры также используется  для
       определения  типа инструкции RET, которая выполняется, когда про-
       цедура возвращает управление в вызывающий код.
            Идея здесь очевидна. Инструкции RET в процедуре должны соот-
       ветствовать ее типу, не правда ли?
            И да и нет. Проблема состоит в том, что возможно и часто же-
       лательно  группировать отдельные подпрограммы в единую процедуру;
       и поскольку эти подпрограммы не имеют  соответствующей  директивы
       PROC,  их команды RET соответствуют типу общей процедуры, который
       не обязательно соответствует типу каждой  отдельной подпрограммы.
                       Неправильный порядок операндов
       -----------------------------------------------------------------
            Многие программисты ошибаются и изменяют порядок операндов в
       инструкциях процессора 8086 на обратный. Это, вероятно, связано с
       тем, что строка:
               mov ax,bx
       которая означает "поместить AX в BX", читается слева  направо,  и


       многие  создатели микропроцессоров строят соответствующим образом
       свои ассемблеры. Однако в языке Ассемблера процессора 8086  фирма
       Intel  использовала другой подход, поэтому для нас эта строка оз-
       начает "поместить BX в AX", что иногда приводит к путанице.
         Программист забывает о стеке или резервирует маленький стек
       -----------------------------------------------------------------
            В большинстве случаев не выделять явно пространство для сте-
       ка,  это все равно, что ходить по тонкому льду. Иногда программы,

       TDeb 3.0 #2-3               = 140 =
       в которых не выделяется пространство для стека,  будут  работать,
       поскольку  может оказаться так, что назначенный по умолчанию стек
       попадет в неиспользуемую область памяти. Но нет никакой гарантии,
       что  такие  программы  будут  работать при любых обстоятельствах,
       поскольку нет гарантии, что для стека будет доступен  по  крайней
       мере  один байт. В большинстве программ для резервирования прост-
       ранства для стека должна присутствовать директива .STACK,  и  для
       любой  программы  эта  директива должна резервировать достаточное
       пространство, чтобы его хватило для максимальных  потребностей  в
       программе.
       Вызов подпрограммы, которая портит содержимое нужных регистров
       -----------------------------------------------------------------
            При разработке программы на Ассемблере регистры удобно расс-
       матривать, как локальные переменные, выделенные для использования
       в процедуре, с которой вы в данный момент работаете. В частности,
       нередко подразумевают,  что при обращении к другим процедурам ре-
       гистры остаются  неизмененными.  На самом деле это не всегда так.
       Регистры - это глобальные переменные,  и каждая  процедура  может
       сохранить или уничтожить содержимое любого из регистров.
                 Ошибки при использовании условных переходов


       -----------------------------------------------------------------
            Использование в языке Ассемблера инструкций условных перехо-
       дов  (JE,  JNE,  JC,  JNC, JA, JB, JG и т.д) обеспечивает большую
       гибкость в программировании, но при этом также очень просто  оши-
       биться,  выбрав  неверный  переход. Кроме того, поскольку в языке
       Ассемблера анализ условия и переход требуют по крайней меру  двух
       строк  исходного  кода  (а  сложных условных переходов нескольких
       строк), условные переходы в языке  Ассемблера  менее  очевидны  и
       больше способствуют ошибкам, чем соответствующие операторы Паска-
       ля и Си.
                   Неверное понимание работы префикса REP
       -----------------------------------------------------------------
            Команды обработки  строк  имеют  одну необычную особенность:
       после их выполнения используемые ими указатели  сдвигаются  таким
       образом,  что  указывают на адрес,  отличающийся на 1 байт (или 2
       байта,  если если длина команды равна одному слову) от последнего
       обработанного адреса. Это может привести к некоторой путанице при
       повторении команд обработки строк, особенно команд REP SCAS и REP
       CMPS.
              Нулевое содержимое CX и работа с целым сегментом
       -----------------------------------------------------------------
            Повторное выполнении любых команд обработки  строк  при  ра-
       венстве  нулю регистра CX не даст никакого результата.  Это может
       быть удобно в том смысле,  что нет необходимости проверять его на
       ноль перед повторным выполнением команд обработки строк. С другой

       TDeb 3.0 #2-3               = 141 =
       стороны,  невозможно получить доступ к каждому байту в сегменте с
       помощью байтовых команд обработки строк.
                  Неправильная установка флага направления
       -----------------------------------------------------------------


            При выполнении команды обработки строк связанные с ней  ука-
       затели (SI,  DI или оба) получают положительное или отрицательное
       приращение. Это зависит от состояния флага направления.
            С помощью команды CLD флаг направления может быть  сброшен в
       0.  В этом случае при выполнении команд обработки строк указатель
       получает положительное приращение (смещается  в  сторону  старших
       адресов).  С помощью команды STD флаг направления устанавливается
       в 1.  В этом случае указатель получает  отрицательное  приращение
       (сдвигается в сторону младших адресов). После того, как флаг нап-
       равления был установлен в определенное состояние,  он будет оста-
       ваться в нем до тех пор, пока не будет выполнена еще одна команда
       CLD или STD, или пока значения флагов не будут извлечены из стека
       с  помощью команды POPF или IRET.  С одной стороны,  удобно иметь
       возможность устанавливать флаг направления в определенное состоя-
       ние  только  один  раз,  а затем выполнять серию команд,  которые
       должны использовать заданное направление.  С другой стороны,  это
       может  привести  к  появлению неустойчивых и труднообнаруживаемых
       ошибок, в результате которых команды обработки строк работают по-
       разному  в  зависимости от работы команд,  которые были выполнены
       значительно раньше.
                Ошибки при повторении команд сравнения строк
       -----------------------------------------------------------------
            Команда CMPS  сравнивает содержимое двух областей памяти,  а
       команда SCAS сравнивает содержимое накапливающего регистра с  со-
       держимым  области памяти.  Когда перед одной из этих команд стоит
       префикс REPE, она выполняет сравнение, либо пока CX не становится
       равным  нулю,  либо  пока не обнаружится,  что операнды не равны.
       Когда перед командой стоит префикс REPNE,  она выполняет  сравне-


       ние, либо пока CX не становится равным нулю, либо пока не обнару-
       жится что операнды равны.  К несчастью, легко перепутать, где ка-
       кой префикс нужно использовать.
                    Ошибки при назначении сегмента строк
       -----------------------------------------------------------------
            Все строковые команды по  умолчанию  используют  в  качестве
       сегмента исходных данных (если он есть) сегмент DS,  а в качестве
       сегмента результирующих данных (если он есть) сегмент  ES.  Легко
       забыть об этом и попытаться,  скажем, выполнить команду STOSB над
       сегментом данных, поскольку все данные, обрабатываемые не строко-
       выми командами, обычно находятся именно в этом сегменте.
                Неправильное преобразование из байта в слово
       -----------------------------------------------------------------

       TDeb 3.0 #2-3               = 142 =
            В общем случае,  для команд обработки строк  желательно  ис-
       пользовать  максимально возможный размер данных (обычно слово,  а
       для процессора 80386 - двойное слово),  поскольку с данными боль-
       шего размера эти команды обычно работают быстрее.
            Однако здесь имеются две ловушки.  Во-первых, преобразование
       из количества байт в количество слов с помощью простой команды:
            shr cx,l
       приведет к потере байта,  если CX имеет нечетное  значение,  пос-
       кольку младший значащий бит будет сдвинут за пределы слова.
            Во-вторых, следует помнить, что команда SHR делит количество
       байт на два.  Использование,  скажем, команды STOSW с количеством
       байт,  а не слов,  может уничтожить другие данные и вызвать самые
       разнообразные ошибки.
                     Использование нескольких префиксов
       -----------------------------------------------------------------
            Команды обработки  строк  с  несколькими префиксами работают
       ненадежно, и их следует по возможности избегать.


             Необязательные операнды в командах обработки строк
       -----------------------------------------------------------------
            Необязательные операнды в командах обработки строк использу-
       ются только для задания размера данных и изменения сегмента  и не
       гарантируют фактический доступ к данной области памяти.
               Уничтожение содержимого регистра при умножении
       -----------------------------------------------------------------
            Умножение (8 на 8 бит,  16 на 16 бит,  либо 32 на  32  бита)
       всегда уничтожает содержимое как минимум одного регистра,  не яв-
       ляющегося накапливающим регистром, который используется в качест-
       ве исходного операнда.

       TDeb 3.0 #2-3               = 143 =
            Ошибки, связанные с изменением содержимого регистров
       -----------------------------------------------------------------
            Команды обработки строк,  такие как MOVS, STOS, LODS, CMPS и
       SCAS,  могут  влиять  на  состояние некоторых флагов и содержимое
       трех регистров при выполнении единственной команды. При использо-
       вании команд обработки строк следует помнить,  что содержимое од-
       ного из регистров SI или DI (или обоих  сразу)  получает  положи-
       тельное  или отрицательное приращение (в зависимости от состояния
       флага направления) при каждом выполнении команды обработки строк.
       Содержимое  регистра  CX  также получает отрицательное приращение
       как минимум один раз и,  возможно, уменьшается до нуля при каждом
       использовании команды обработки строк с префиксом REP.
                     Изменение состояния флага переноса
       -----------------------------------------------------------------
            В то время как одни команды неожиданно для программиста вли-
       яют на состояние регистров и флагов, другие команды не влияют да-
       же на те флаги, состояние которых было бы желательно изменить.


                    Программист долго не использует флаги
       -----------------------------------------------------------------
            Состояние флагов  сохраняется до тех пор,  пока не будет вы-
       полнена следующая команда,  которая его изменяет, что обычно про-
       исходит достаточно быстро.  Поэтому рекомендуется после установки
       флагов выполнять действия над ними как можно быстрее, чтобы избе-
       жать самых разнообразных ошибок,  связанных с неверной установкой
       флагов.
          Смешение операндов в памяти и непосредственных операндов
       -----------------------------------------------------------------
            Программа на языке Ассемблера может обращаться либо к смеще-
       нию области памяти,  в которой хранится переменная, либо к значе-
       нию этой переменной. К сожалению, в языке Ассемблера нет ни инту-
       итивных,  ни строгих способов, позволяющих различить эти два вида
       обращений,  и  в результате программисты часто путают обращения к
       смещению и обращения к значению.
               Ошибки, связанные с возвратом в начало сегмента
       -----------------------------------------------------------------
            Один из  самых  сложных моментов в программировании для мик-
       ропроцессора 8086 состоит в том,  что к памяти нельзя  обращаться
       как к  одному большому массиву байт.  Вместо этого память делится
       на части (сегменты) размером 64К (килобайт),  и доступ к ним осу-
       ществляется  через сегментные регистры.  Сегментация памяти может
       вызвать труднообнаруживаемые ошибки, поскольку если программа пы-
       тается  обратиться к адресу,  который находится за границами сег-
       мента, в действительности вместо этого происходит возврат в нача-
       ло того же сегмента.

       TDeb 3.0 #2-3               = 144 =
          Сохранение содержимого регистров при обработке прерываний
       -----------------------------------------------------------------


            Каждый обработчик прерываний  должен  обязательно  сохранять
       содержимое всех регистров.  Хотя и допускается сохранять содержи-
       мое только тех регистров,  которое изменяется данным обработчиком
       прерываний,  для  надежности работы все же рекомендуется заносить
       содержимое всех регистров в стек при входе в обработчик  прерыва-
       ний и извлекать его из стека при выходе.
              Игнорирование групп в таблицах операндов и данных
       -----------------------------------------------------------------
            Использование сегментных групп позволяет программисту  логи-
       чески  разбивать данные на несколько областей,  исключая при этом
       необходимость загружать сегментный регистр каждый раз,  когда не-
       обходимо  перейти  от одной из таких логических областей данных к
       другой.
            К сожалению,  тот способ, который используется для обработки
       сегментных  групп в макроассемблере фирмы Microsoft (MASM), может
       вызвать некоторые проблемы, и пока не появился язык Турбо Ассемб-
       лер, сегментные группы доставляли программистам много неприятнос-
       тей.  И хотя этих неприятностей практически невозможно было избе-
       жать, сегментные группы были нужны для связи ассемблерного кода с
       языками высокого уровня, такими как Си.
            В режиме Quirks языка MASM Турбо Ассемблер эмулирует MASM, и
       это  означает,  что в этом режиме он имеет те же проблемы,  что и
       MASM.Если вы не собираетесь использовать режим Quirks языка MASM,
       можете  больше ничего о нем не читать,  однако если вы планируете
       работать с этим режимом, вам следует обратиться за дополнительной
       информацией  к "Руководству пользователя по Турбо Ассемблеру".

       TDeb 3.0 #2-3               = 145 =
                                  Проверка
       -----------------------------------------------------------------
            Создание программы с допустимыми входными данными составляет


       только  часть функций проверки.  В следующих разделах обсуждаются
       некоторые важные случаи  проверки,  которым  должны  подвергаться
       каждая программа,  прежде чем можно будет сделать вывод о ее пра-
       вильной работе.
               Проверка граничных условий и случаи ограничения
       -----------------------------------------------------------------
            Если вы считаете,  что подпрограмма должна работать с данны-
       ми,  принимающими значение в определенном  диапазоне,  вы  должны
       подвергнуть эту подпрограмму проверке с данными, принимающим раз-
       личные значение в этом диапазоне.  Например,  если в вас  имеется
       подпрограмма, выводящая на экран список длиной от 1 до 20 элемен-
       тов,  вы должны убедиться,  что она ведет себя правильно и в  том
       случае,  когда в списке имеется ровно 1 элемент,  и в том случае,
       когда в списке 20 элементов  (здесь  могут  скрываться  различные
       ошибки,  в частности, ошибка типа "столбы и забор", описанная ра-
       нее).
                            Ввод ошибочных данных
       -----------------------------------------------------------------
            Когда вы убедитесь, что программа работает во всем диапазоне
       допустимых данных, следует убедиться, что она ведет себя коррект-
       но,  когда вы задаете недопустимые входные данные. Например, убе-
       дившись,  что предыдущая программа воспринимает значения в диапа-
       зоне от 1 до 20,  нужно также убедиться, что 0 или 21 значение ей
       отвергаются.
                          Отсутствие входных данных
       -----------------------------------------------------------------
            Этот момент  при проверке и создании программы часто упуска-
       ют.  Если вы пишете программу,  которая правильно себя ведет  при
       отсутствии входных данных, работа с ней значительно упростится.
               Отладка, как часть процесса создание программы


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

       TDeb 3.0 #2-3               = 146 =
       отлаживать,  поскольку до возникновения опасной ситуации подпрог-
       раммы сами сообщают вам о недопустимых входных данных.
            Можно также реализовать программу, в которой выполняется ма-
       ло проверок на допустимость входных и выходных данных  или  такие
       проверки  совсем  отсутствуют.  Такая  программа будет меньшей по
       объему и будет быстрее выполняться,  но неверные  входные  данные
       или  маленькая  ошибка  могут привести к аварийному завершению ее
       работы.  Такой тип программ обычно труднее всего отлаживать,  так
       как  небольшая  ошибка  может  проявиться  при выполнении намного
       позднее.  Это затрудняет выявление  того  места,  где  содержится
       ошибка.
            Большинство создаваемых  программ  сочетают  в себе оба этих
       метода.  Данные,  воспринимаемые из внешних источников (например,
       вводимые пользователем или считываемые из файла на диске) подвер-
       гаются обычно более тщательной проверке, чем данные, передаваемые
       при вызове от одной подпрограммы к другой.

       TDeb 3.0 #2-3               = 147 =
                            Пример сеанса отладки
       -----------------------------------------------------------------


            В примере сеанса отладки используются те методы,  о  которых
       мы  рассказывали  в  предыдущих разделах.  Отлаживаемая программа
       представляет собой вариант демонстрационной программы,  использо-
       ванной в Главе 3 (BCDEMO.C или TPDEMO.PAS),  только в нее предна-
       меренно внесены некоторые ошибки.
            Убедитесь, что  в вашем текущем каталоге содержатся два фай-
       ла,  необходимые для демонстрации отладки.  Если  вы  отлаживаете
       программу  на Турбо Паскале,  вам понадобятся файлы TPDEMOB.PAS и
       TPDEMOB.EXE. Если вы работаете на языке Си, вам потребуются файлы
       BCDEMOB.C и BCDEMOB.EXE.  (Буква B в конце имен файлов, означает,
       что в эту версию внесена ошибка.)
                     Сеанс отладки программы на языке Си
       -----------------------------------------------------------------
            В данном разделе в качестве примера  используется  программа
       на языке Си.  Если вы программируете на Паскале,  см. ниже пример
       сеанса отладки с использованием программы Турбо Паскаля.
                                Поиск ошибок
       -----------------------------------------------------------------
            До того,  как начать сеанс отладки, давайте запустим демонс-
       трационную программу с ошибкой и посмотрим, что она делает непра-
       вильно. Для запуска программы наберите:
               BCDEMOB
            Вам выведется подсказка для ввода строк текста. Введите  две
       строки текста:
               one two three
               four five six
            Последняя пустая строка  завершает  ваш  ввод.  После  этого
       программа  BCDEMOB  выводит  результаты  анализа  введенных  вами
       строк:
            Arguments:                                              (1)
            Enter a line (empty line to end): one two three         (2)
            Enter a line (empty line to end): fou five six
            Enter a line (empty line to end):


            Total number of letters = 7                             (3)
            Total number of lines = 6                               (4)
            Total word count = 2                                    (5)
            Average number of words per line = 0.3333333            (6)
            'E' orrurs 1 times, 0 times at start of a word          (7)
            'F' occurs 1 times, 1 times at start of a word
            'N' occurs 1 times, 0 times at start of a word

       TDeb 3.0 #2-3               = 148 =
            'O' occurs 2 times, 1 times at start of a word
            'R' occurs 1 times, 0 times at start of a word
            'U' occurs 1 times, 0 times at start of a word
            There is one word 3 characters long                     (8)
            There is one word 4 characters long                     (9)
            1 -  аргументы;  2 - введите строку (пустая строка завершает
       ввод);  3 - общее число букв;  4 - общее число строк;  5 -  общее
       число слов; 6 - среднее число слов на строке; 7 - 'E' встречается
       1 раз,  0 раз в начале слова; 8 - имеется одно слово длиной в три
       символа; 9 - имеется одно слово длиной в 4 символа.
            Заметим, что в общем числе слов и букв имеется ошибка. Позд-
       нее окажется, что таблицы частот букв и слов основываются на оши-
       бочном  значении  счетчика букв и слов.  Такая ситуация,  когда в
       программе сразу несколько неверных мест,  довольно  типична.  Это
       часто встречается на начальном этапе отладки.
                          Разработка плана действий
       -----------------------------------------------------------------
            Первая задача состоит в том,  чтобы решить,  с какой ошибкой
       нужно разобраться в первую очередь.  Хорошим правилом здесь явля-
       ется следующее правило:  начинайте с  ошибки,  которая  произошла
       "первой".  В  данной программе каждая вводимая строка разбивается
       на слова,  после чего анализируется, наконец, когда будут введены


       все строки выводятся таблицы. Так как счетчики букв и слов, как и
       таблицы, неверны, можно предположить, что что-то делается неверно
       при начальной разбивке и подсчете.
            Теперь, после того, как вы немного обдумали проблему и наме-
       тили  в  общих  чертах пути решения,  пора начать отладку.  Здесь
       стратегия будет состоять  в  том,  чтобы  проверить  подпрограмму
       makeintowords и посмотреть,  правильно ли она разбивает строку на
       завершающиеся нулевым символом слова,  а затем  посмотреть,  пра-
       вильно  ли подпрограмма analyzewords выполняет подсчет для анали-
       зируемой строки.
                           Запуск Турбо отладчика
       -----------------------------------------------------------------
            Чтобы запустить пример сеанса отладки, наберите:
               TD BCDEMOB
            При этом Турбо отладчик загрузит демонстрационную программу,
       в которой содержится ошибка,  и выведет начальный экран.  Если вы
       хотите выйти из сеанса отладки и вернуться в DOS, нажмите клавиши
       Alt-X  (это  можно  сделать  в любой момент).  Если вы безнадежно
       "заблудились", можно в любое время перезагрузить демонстрационную
       программу, нажав клавиши Ctrl-F2, и начать сначала (при этом точ-
       ки останова и выражения просмотра очищены не будут).

       TDeb 3.0 #2-3               = 149 =
            Поскольку первое,  что нам нужно сделать - это проверка пра-
       вильности работы   подпрограммы  makeintowords,  нужно  выполнить
       программу до выполнения этой подпрограммы, а затем проверить все,
       что требуется.  В этом случае можно использовать два подхода:  вы
       можете выполнить шаг программы,  выполнив makeintowords и убедив-
       шись,что она делает все правильно, или можно остановить программу
       после выполнения подпрограммы makeintowords,  и проверить ее  ре-
       зультаты.
            Убедиться в правильности работы  подпрограммы  makeintowords


       довольно просто.  Для этого можно проверить формируемый ей выход-
       ной буфер.  Давайте выберем второй подход. Чтобы сделать это, пе-
       реместите  курсор  на  строку  42 и нажмите клавишу F4,  выполнив
       программу до этой строки.  Появится экран программы,  после  чего
       вам нужно ввести:
               one two three
       и нажать клавишу Enter.
                                  Проверка
       -----------------------------------------------------------------
            Итак, вы остановились на строке исходного кода  после вызова
       функции makeintowords. Взгляните на содержимое буфера и посмотри-
       те,  все ли правильно.  Переместите курсор на одну строку вверх и
       поместите его под словом buffer. После этого нажмите Alt-F10 (для
       вывода окна Inspector (Проверка)).  В окне проверки выведется со-
       держимое буфера buffer.  Для просмотре элементов массива  исполь-
       зуйте   клавиши  стрелок.  Обратите  внимание,  что  подпрограмма
       makeintowords действительно поместила в конце каждого слова нуле-
       вой  символ (0).  Это означает,  что вам нужно просмотреть другую
       часть программы и проверить,  правильно ли работает  подпрограмма
       analyzewords. Для этого сначала удалите окно проверки, нажав кла-
       вишу Esc. Затем дважды нажмите клавишу F7 для выполнения програм-
       мы до начала работы analyzewords.
            Проверьте, что analyzewords была вызвана с корректным указа-
       телем  в буфере.  Для этого переместите курсор под bufp и нажмите
       Alt-F10 I. Вы увидите, что bufp действительно указывает на завер-
       шающуюся  нулевым  символом строку 'one'.  Для удаления окна про-
       верки нажмите клавишу Esc.  Поскольку ошибка возникает, очевидно,
       при  подсчете символов и слов,  давайте поместим точку останова в
       то место,  где подсчитываются слова и символы.
            1. Переместите  курсор  на  строку  93 и нажмите клавишу F2,


               чтобы установить точку останова.
            2. Переместитесь на строку 97 и установите другую точку  ос-
               танова.
            2. Наконец, установите точку останова на строке 99, благода-
               ря чему вы сможете увидеть  значение  счетчика  символов,

       TDeb 3.0 #2-3               = 150 =
               возвращаемое данной функцией.
            Задание нескольких  точек останова  (как в данном примере) -
       это типичный способ, позволяющий узнать, все ли в программе дела-
       ется правильно, и проверить значения важных данных при каждом ос-
       танове программы на очередной точке останова.

       TDeb 3.0 #2-3               = 151 =
                                 Окно Watch
       -----------------------------------------------------------------
            Запустите программу,  нажав клавишу F9. Программа остановит-
       ся, когда она достигнет точки останова на строке 93. Теперь можно
       просмотреть значение charcount (счетчик символов). Так как вы хо-
       тите проверять его каждый раз, когда встречается данная точка ос-
       танова,  удобно использовать команду Watch (Просмотр),  чтобы по-
       местить  charcount в окно Watches (Просмотр).  Переместите курсор
       под wordcounts (счетчик слов) и нажмите Alt-F10 W.  В окне  прос-
       мотра  в нижней части экрана выводится текущее значение 0.  Чтобы
       убедиться,  что символ подсчитывается правильно,  выполните  одну
       строку, нажав клавишу F7. В окне просмотра (Watches) действитель-
       но выводится, что значение charcount = 1.
                       Диалоговое окно Evaluate/Modify
       ------------------------------------------------------------------
            Снова запустите программу,  нажав клавишу F9. Теперь вы вер-
       нулись  на строку 93 для обработки другого символа.  Снова дважды
       нажмите F9 для считывания последней буквы  слова  и  завершающего
       нуля. Теперь charcount показывает корректное значение 3, а массив


       wordcounts будет обновлен для подсчета слов.  Далее все  отлично.
       Нажмите снова F9, чтобы начать обработку следующего слова в буфе-
       ре. Ага! Что-то не так.
            Вы ожидаете,  что программа остановится снова на  строке  93
       (на  точке останова) для обработки другого символа.  Но она этого
       не делает.  Она выполняется дальше  и  возвращается  из  функции.
       Единственным  путем оказаться на строке 99 является истинное зна-
       чение проверяемого в цикле  while  значения.  Это  означает,  что
       *bufp  !=  0  должно  при  вычислении  получать  ложное  значение
       (false).
            Чтобы проверить это,  переместитесь к строке 83  и  отметьте
       все  выражение *bufp != 0,  поместив курсор под *,  нажав клавишу
       Ins,  и переместив курсор на завершающий 0 перед ). Теперь вычис-
       лите это  выражение,  открыв диалоговое окно Data¦Evaluate/Modify
       (Данные¦Вычисление/Модификация) и нажав клавишу  Enter,  а  затем
       выбрав переключатель Eval (Вычисление),  чтобы отмеченное выраже-
       ние было воспринято. Значение в самом деле равно 0. Нажмите дваж-
       ды клавишу Esc для возврата в окно Module (Модуль).
                                   Эврика!
       -----------------------------------------------------------------
            Теперь, чтобы обнаружить ошибку,  нужно сделать некий анали-
       тический скачок. Причина того, что bufp указывает на 0, состоит в
       том, что внутренний цикл while, начинающийся на строке 86, остав-
       ляет его в конце слова.  Для продолжения на  следующем  слове  вы
       должны  увеличить  bufp  и переместить его с 0,  который завершал

       TDeb 3.0 #2-3               = 152 =
       предыдущее слово.  Для этого перед строкой 97 нужно добавить опе-
       ратор "bufp++". Вы можете перекомпилировать свою программу с этим
       оператором, однако Турбо отладчик позволяет вам "вставлять" выра-
       жения, используя для этого особый вид точек останова.


            Для этого нужно сначала перезагрузить программу,  нажав кла-
       виши Ctrl-F2 (после этого вы можете начать проверку, сбросив сос-
       тояние программы). Теперь удалите все точки останова, которые бы-
       ли вами установлены в предыдущем сеансе отладки, для чего нажмите
       клавиши Alt-B D.  Вернитесь к строке 97 и снова установите  точку
       останова, нажав  клавишу  F2.  Теперь  откройте  окно Breakpoints
       (Точки останова), нажав клавиши ALt-V B. Установите эту точку ос-
       танова,  чтобы  выполнять выражение bufp++ каждый раз,  когда оно
       встречается. Для этого сделайте следующее:
            1. Выберите команду View¦Breakpoint (Обзор¦Точка останова).
            2. Откройте окно Breakpoints (Точки останова), нажав клавиши
               Alt-F10.
            3. Выберите  команду  Set  Option (Установить параметры) для
               открытия диалогового окна Breakpoint  Options  (Параметры
               точки останова.
            4. Установите селективный переключатель Action  (Действие) в
               значение Execute (Выполнение).
            5. Для вывода подсказки Action Expression  (Выражение  дейс-
               твия) нажмите клавишу Tab.
            6. Введите bufp++ в ответ на подсказку.
            7. Нажмите  клавишу  Esc,  чтобы закрыть диалоговое окно,  и
               клавиши Alt-F3 для возврата в окно Module (Модуль).
            Теперь запустите программу,  нажав клавишу F9.  Введите  две
       входных строки:
               one two three
               four five six
            В ответ на третью подсказку нажмите клавишу Enter,  а  когда
       программа завершит работу,  нажмите клавиши Alt-F5, чтобы увидеть
       ее экран (экран пользователя).
            Вы можете заметить, что ситуация существенно улучшилась. Об-
       щее число строк и слов выглядит неверным,  но таблица  правильна.
       Остановитесь на начале подпрограммы printstatistics и посмотрите,
       передается ли ей для вывода корректное значение.


Для этого снача-
       ла  перезагрузите программу (чтобы начать проверку заново), нажав
       клавиши Ctrl-F2.  Затем  перейдите к строке 104 и нажмите клавишу
       F4,  чтобы выполнить программу до этой строки. Переместите курсор
       на  аргумент nlines и нажмите Alt-F10 I,  чтобы посмотреть на его

       TDeb 3.0 #2-3               = 153 =
       значение.  Вы видите значение 6, хотя должно быть значение 2.
            Теперь вернитесь назад,  туда,  где эта подпрограмма вызыва-
       лась из основной программы, и посмотрите на значение nlines (чис-
       ло строк) там.  Переместите курсор на строку 36 и  поместите  его
       под nlines.  Нажмите клавиши Alt-F10 I для вывода его значения. В
       основной программе значение nlines равно 2, а это правильно. Если
       вы перейдете в них к строке 46,  то увидите,  что два аргумента -
       nwords и nlines - переставлены местами. Компилятор здесь не может
       определить,  какой именно порядок вы имели в виду.  Он использует
       то, что указано.
            Если вы исправите эти две ошибки,  программа будет  работать
       правильно.  Если  вы достаточно любопытны,  то можете попробовать
       запустить исправленную версию программы BCDEMO.EXE.
             Сеанс отладки с использованием программы на Паскале
       -----------------------------------------------------------------
            Остальная часть  данной главы посвящена описанию примера се-
       анса отладки программы,  написанной на Турбо Паскале. Если вы ра-
       ботаете с Borland C++, то просмотрите предыдущие разделы, в кото-
       рых описывается сеанс отладки программы на языке Си.

       TDeb 3.0 #2-3               = 154 =
                                Поиск ошибок
       -----------------------------------------------------------------
            Перед началом сеанса отладки давайте запустим демонстрацион-
       ную программу на Паскале,  в которой содержится ошибка, и посмот-
       рим,  что она делает неверно.  Скомпилированная версия этой прог-


       раммы уже содержится на дистрибутивном диске.
            Для запуска  программы  наберите ее имя и передайте ей в ко-
       мандной строке три аргумента:
               TPDEMOB first second third
            Вам будет выведена подсказка для ввода строк текста. Введите
       две строки текста следующим образом:
               ABC DEF GHI
               abc def ghi
            Ввод завершает последняя пустая строка.  После этого TPDEMOB
       выводит анализ введенного текста:
        9 letter(s) in 3 words in 2 lines(s)                         (1)
        Average of 0.67 words per line                               (2)
        Word length:   1  2  3  4  5  6  7  8  9  10                 (3)
        Frequency:     0  0  3  0  0  0  0  0  0  0                  (4)
        Letter:        M                                             (5)
        Frequency:     1  1  1  1  1  1  1  1  1  1  1  0  0  0  0   (6)
        Word starts:   1  0  0  1  0  0  1  0  0  0  0  0  0  0  0   (7)
        Letter:        Z
        Frequency:     0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
        Word starts:   0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
        Program name: C:\td\tpdemob.exe                              (8)
        Command line parameters: firs# secon% third                  (9)
            1 - 9 букв в 3 словах;  2 - в среднем 0.67 слов на строке; 3
       - длина слова;  4 - частота; 5 - буква; 6 - частота; 7 - начинает
       слово; 8 - имя программы; 9 - параметры командной строки.
            В этой выходной информации содержится пять различных ошибок:
            1. Число слов сообщается неверно (3 вместо 6).
            2. Число слов на строку неверно (0.67 вместо 3).
            3. В заголовках второй и третьей таблиц выводится  только по
               одной букве (вместо A..M, N..Z).
            4. Вы ввели две строки,  каждая из которых содержит буквы от

       TDeb 3.0 #2-3               = 155 =
               A до I, но в таблицах частоты букв показан только счетчик


               со значение 1 для этих букв.
            5. Последний  символ  каждого параметра командной строки был
               потерян,  и на экран выводится случайный символ (хотя па-
               раметры введены правильно).
                        Выбор стратегии поиска ошибок
       -----------------------------------------------------------------
            Первая задача состоит в том,  чтобы решить с какой из ошибок
       разбираться в первую очередь. Здесь можно предложить хорошее пра-
       вило:  начинайте с той ошибки, которая появилась первой. В данной
       программе,  после  того,  как  данные инициализируются процедурой
       Init, ввод с клавиатуры считывается функцией GetLine, а затем об-
       рабатывается процедурой ProcessLine,  пока пользователь не введет
       пустую строку.  ProcessLine просматривает каждую строку  ввода  и
       обновляет глобальные счетчики. После этого процедурой ShowResults
       выводятся результаты.  Наконец, полностью независимая подпрограм-
       ма -  процедура  ParmsOnHeap - строит связанный список параметров
       командной строки в динамически распределяемой области  памяти,  а
       затем выводит этот список в конце программы.
            Среднее число   слов   на   строку   вычисляется  процедурой
       ShowResults на основе числа строки и слов. Так как значение счет-
       чика неверно, очевидно стоит взглянуть на процедуру ProcessLine и
       посмотреть,  как изменяется значение переменной  NumWords  (число
       слов).  Даже  если  значение  NumWords верно,  число 0.67 слов на
       строку не имеет смысла. Тогда ошибка возможно содержится в вычис-
       лениях процедуры ShowResults,  на что также стоит обратить внима-
       ние.
            Заголовки для всех таблиц выводятся в результате обращения к
       процедуре ShowResults. Перед отслеживанием второй и третьей ошиб-
       ки следует подождать завершения работы основного цикла.  Так  как
       счетчики слов и букв содержат неверные значения,  вероятно что-то


       упущено в процедуре ProcessLine (это относиться к первой  и  чет-
       вертой ошибке).
            Наконец, когда вы закончите исследовать части программы, от-
       носящиеся к работе со счетчиками слов и букв,  для поиска и  исп-
       равления    последней   (пятой)   ошибки   займитесь   процедурой
       ParmsOnHeap.
            Теперь, после того, как обдумали проблему и наметили план ее
       решения, пришло время непосредственно начать отладку.
                           Запуск Турбо отладчика
       -----------------------------------------------------------------
            Для того, чтобы начать отладку нашего примера, загрузите от-
       ладчик и укажите те же параметры командной строки:

       TDeb 3.0 #2-3               = 156 =
               TD TPDEMOB first second third
            Турбо отладчик  загрузит  версию демонстрационной программы,
       содержащую ошибку, и выведет начальный экран, меню и т.д. Если вы
       хотите выйти из сеанса отладки и вернуться в DOS, нажмите клавиши
       Alt-X (это можно сделать в  любой  момент).  Если  вы  безнадежно
       "заблудились", можно в любое время перезагрузить демонстрационную
       программу, нажав клавиши Ctrl-F2, и начать сначала (при этом точ-
       ки останова и выражения просмотра очищены не будут).
            Для отладки таких подпрограмм,  как ProcessLine, можно пред-
       ложить два подхода. Вы можете либо выполнять ее построчно (по ша-
       гам),  убедившись,  что она все делает правильно, либо остановить
       программу непосредственно после выполнения  процедуры ProcessLine
       и посмотреть,  верны ли результаты. Так как оба счетчика содержат
       неверные значения,  лучше внимательно проанализировать  процедуру
       ProcessLine и посмотреть, как обрабатываются символы.

       TDeb 3.0 #2-3               = 157 =
                          Перемещение по программе
       -----------------------------------------------------------------


            Итак, вы  собираетесь запустить программу и исследовать про-
       цедуру ProcessLine. Сделать это можно несколькими способами. Мож-
       но нажать четыре раза клавишу F8 (для пропуска вызовов процедур и
       функций),  затем  нажать  один  раз  F7  (для  трассировки вызова
       ProcessLine).  Можно переместить курсор на строку 231,  нажать F4
       (команда  Go  to Cursor - Выполнение до курсора),  а затем нажать
       один  раз  F7  для  того,  чтобы  начать   выполнение   процедуры
       ProcessLine (трассировка вглубь).
            Можно привести и другие способы,  однако используем  следую-
       щий. Нажмите клавиши Alt-F9.  При этом  вам  выведется  подсказка
       (диалоговое окно)  для  ввода адреса кода,  до которого вы хотите
       выполнить  программу.  Наберите  ProcessLine  и  нажмите  клавишу
       Enter.  Программа будет выполнена до того места, когда управление
       получает процедура ProcessLine. Когда вам выведется подсказка для
       ввода строки,  введите те же данные,  что и раньше (то есть,  ABC
       DEF GHI).
            Здесь есть несколько циклов. Во внешнем цикле просматривает-
       ся  вся  строка.  Внутри  данного цикла имеется цикл для пропуска
       символов,  отличных от букв,  а второй цикл обрабатывает слова  и
       буквы.  Переместите  курсор к циклу while на строке 133 и нажмите
       клавишу F4 (Выполнение до курсора).
            Данный цикл будет  выполняться,  пока он не достигнет  конца
       строки, или не будет найдена буква. Последнее условие проверяется
       с помощью вызова  булевской  функции  IsLetter.  Для  трассировки
       функции IsLetter нажмите клавишу F7.  IsLetter представляет собой
       вложенную функцию,  которая воспринимает значение символа и возв-
       ращает значение True (истинное значение),  если это буква, и зна-
       чение False в противном случае.  При поверхностном анализе оказы-
       вается,   что  она  проверяет  только  прописные  буквы  (верхний


       регистр).  А она должна проверять символы в диапазоне 'A'...'Z' и
       'a'...'z'  или перед выполнением проверки преобразовывать символы
       в верхний регистр.
            Еще один ключ к поиску ошибки дает  анализ  обеих  введенных
       строк.  Вы ввели буквы верхнего и нижнего регистра от 'A' до 'I',
       но в общем итоге выведена только половина  букв.  Теперь  вы  уже
       знаете, почему.
            Давайте вернемся   назад  к  строке,  в  которой  вызывается
       IsLetter, с помощью еще одного метода перемещения: нажмите клави-
       ши  Alt-F8,  по  которым  программа будет выполнена до последнего
       оператора процедуры или функции.  Так как вторая введенная строка
       содержит только буквы нижнего регистра, каждый символ обрабатыва-
       ется, как пробел, и пропускается. Это приводит к неверному значе-
       нию счетчиков слов и букв и выявляет причину ошибок 1 и 4.

       TDeb 3.0 #2-3               = 158 =
                       Диалоговое окно Evaluate/Modify
       -----------------------------------------------------------------
            Кстати, существует еще один прекрасный способ выявить непра-
       вильное поведение IsLetter.  Нажав клавиши Alt-D E, выведите диа-
       логовое окно Evaluate/Modify (Вычисление/Модификация)  и  введите
       следующее выражение:
               IsLetter('a') = IsLetter('A')
            И тот,  и  другой параметр (a и A) являются буквами,  но ре-
       зультат вычисления False подтверждает,  то  они  интерпретируются
       функцией IsLetter по-разному.  (Окна вычисления и просмотра можно
       использовать для вычисления выражений,  выполнения  присваиваний,
       или,  как в данном случае, вызовов процедур и функций. Более под-
       робно об этом рассказывается в Главе 6.)
                                  Проверка
       -----------------------------------------------------------------
            Итак, две  ошибки выявлены,  остались три.  Ошибку 2 гораздо


       проще  найти,  чем  предыдущие.  Нажмите  Alt-F8  для  вызова  из
       ProcessLine, затем переместите курсор к строке 234 и нажмите кла-
       вишу F4, чтобы выполнить программу до этой позиции курсора.
            Программа TPDEMOB выведет вам подсказку  для  ввода  строки.
       Наберите abc def ghi и нажмите Enter.  В ответ на повторный вывод
       подсказки просто нажмите клавишу Enter. Теперь нажмите клавишу F7
       для трассировки процедуры ShowResults.
            Вспомните, что  вы  хотите определить,  почему среднее число
       слов в  строке  имеет  некорректное  значение.  В  первой  строке
       ShowResults вычисляется число строк на слово,  а не число слов на
       строке. Ясно, что этот порядок следует изменить на обратный.
            Поскольку вы уже находитесь в данном месте, можно убедиться,
       что  NumLines (число строк) и NumWords (число слов) имеют те зна-
       чения,  которые вы ожидаете. NumLines должно быть равно 2 и, пос-
       кольку вы нашли ошибку в IsLetter,  но не исправили ее,  NumWords
       должно быть равно 3. Переместите курсор к NumLines и нажмите Alt-
       F10 I для проверки значения переменной. Окно Inspector (Проверка)
       показывает,  что значение NumLines действительно равно 2.  Теперь
       вы можете проанализировать NumWords.  Нажмите клавишу Esc,  чтобы
       закрыть  окно  Inspector,  затем  переместите  курсор  дальше  на
       NumWords и снова нажмите Alt-F10 I (можно использовать также сок-
       ращение - клавиши Ctrl-I). NumWords содержит ожидаемое некоррект-
       ное значение 3, поэтому можно следовать дальше.
            Однако стоит ли торопиться? В этих вычислениях есть еще одна
       ошибка,  отсутствующая в нашем списке.  Перед выполнением деления
       значение второй переменной не проверяется на 0. Если вы запустите
       программу сначала и совсем не введете данные (нажав от  ответ  на

       TDeb 3.0 #2-3               = 159 =
       подсказку Enter), то программа аварийно завершит работу (даже ес-


       ли вы поменяете местами делимое и делитель).
            Чтобы убедиться в этом,  нажмите  Esc,  чтобы  закрыть  окно
       Inspector, затем нажмите клавиши Alt-R P, чтобы завершить текущий
       сеанс отладки и F9, чтобы запустить программу сначала. В ответ на
       подсказку программу TPDEMOB нажмите клавишу Enter.  Программа за-
       вершит работу и на экран выведется окно ошибки.  Оператор следует
       изменить следующим образом:
               if NumLines <> 0 then
                  AvgWords := NumWords / NumLines
               else
                  AvgWords := 0;
            С ошибкой  2  покончено.  Поскольку  вы  работаете  с  окном
       Inspector  (Проверка),  попробуйте использовать его для просмотра
       структуры данных.  Переместите курсор выше к описанию LetterTable
       на  строке  50.  Поместите  курсор на слово LetterTable и нажмите
       клавиши Alt-F10 I. Вы увидите, что это массив записей длиной в 26
       элементов.  Для  просмотра  каждого  элемента массива используйте
       клавиши перемещения курсора, а для углубления в элемент массива -
       клавишу Enter.  Это очень мощный способ проверки структур данных,
       он будет особенно удобен для последующего исследования связанного
       списка в процедуре HeapOnParms.
                              Выражения просмотра
       -----------------------------------------------------------------
            Теперь давайте исследуем ошибку 3 в процедуре ShowResults (в
       выводе  заголовка таблиц).  Поскольку вы уже завершили программу,
       исследуя ошибку деления на 0,  подготовьте ее для другого сеанса,
       нажав клавиши Alt-P (сброс программы). Затем нажмите клавиши Alt-
       F9, наберите showresults и нажмите Enter. После этого введите уже
       знакомые вам данные ABC DEF GHI и нажмите клавишу Enter. Наконец,
       наберите abc def ghi и дважды нажмите Enter. Теперь нужно остано-
       вить Турбо отладчик на ShowResults.


            В ShowResults  для вывода таблиц букв используется вложенная
       процедура ShowLetterInfo Переметите курсор на строку 103, нажмите
       клавишу F4, затем F7 для перехода в ShowLetterInfo.
            Здесь имеется три цикла for.  В первом цикле выводится заго-
       ловок таблицы,  а во втором и третьем - значения частот.  Исполь-
       зуйте клавишу F7 для перехода в первый цикл на строке 63. Позици-
       онируйте курсор на переменных FromLet и ToLet и используйте  кла-
       виши  Alt-F10  I  для проверки их значений.  Они выглядят верными
       (первое равно 'A',  а второе - 'M').  Нажмите клавиши Alt-F5  для
       вывода  экрана пользователя.  Для возврата к окно Module (Модуль)
       используйте любую клавишу.
            При выполнении подобного цикла очень удобно использовать ок-

       TDeb 3.0 #2-3               = 160 =
       но  Watch  (Просмотр).  Позиционируйте  курсор  на  ch  и нажмите
       клавиши Ctrl-W.  Теперь для выполнения цикла по шагам используйте
       клавишу  F7.  Как и ожидалось,  мы переходим к оператору Write на
       строке 64.  Однако,  если вы посмотрите на окно Watch (Просмотр),
       то  увидите,  что  значение  ch  уже равно 'M' (уже выполнен весь
       цикл!).  После ключевого слова do имеется лишняя точка с запятой,
       поэтому данный цикл 13 раз выполняется вхолостую.  Когда управле-
       ние переходит к оператору Write на строке 64,  то выводится теку-
       щее значение ch ('M'). Устранение лишней точки с запятой позволя-
       ет избавится от ошибки 3.
                              Следующая ошибка
       -----------------------------------------------------------------
            Теперь настало  время отследить ошибку при выводе параметров
       командной строки.  Вспомним,  что последний символ в каждом пара-
       метре командной строке содержал неверное значение ("мусор"). Воз-
       можно,  неверен байт длины строки,  или строковые данные портятся


       при последующих присваиваниях.
            Для выявления этого используйте окно Watch (Просмотр).  Наж-
       мите клавиши Alt-F9,  наберите parmonheap,  затем нажмите  Enter.
       Оператор  for  обработает в цикле все параметры командной строки,
       формируя связанный список и копируя каждую строку при ее  поступ-
       лении в динамически распределяемую область памяти. Указатель Head
       указывает на начало списка,  Tale - на последний узел в списке, а
       Temp используется, как временная память для выделения и инициали-
       зации нового узла.  Так как строковые данные  запорчены,  нажмите
       клавиши Ctrl-F7 и добавьте в окно Watch следующее выражение:
               Tail^.Parm^
            Это позволяет  отслеживать  строковые  данные,  хранящиеся в
       последнем узле списка.  Конечно,  до инициализации на строке  207
       это значение будет содержать "мусор".
            Вместо того, чтобы выполнять программу по шагам, просто сле-
       дите за окном Watch в конце каждой итерации.  Переместите  курсор
       на  строку  208 и нажмите клавишу F2,  чтобы установить там точку
       останова.  Теперь,  чтобы выполнить программу до точки  останова,
       нажмите клавишу F9. Если вы используете DOS версии 3.х, то в окне
       просмотра вы увидите полный маршрут доступа  к  TPDEMOB.EXE  (при
       работе  под управлением DOS 2.x вы увидите пустую строку,  в этом
       случае просто нажмите клавишу F9 и работайте дальше). Строка дан-
       ных выглядит, как и требуется.
            Нажмите клавишу  F9,  чтобы  выполнить цикл еще раз.  Данные
       опять выглядят правильно. Теперь вы знаете, что строка копируется
       в динамически распределяемую область памяти правильно.  Можно ис-
       пользовать окно Inspector (Проверка) и посмотреть,  не повреждены
       ли  еще  данные.  Переместите  курсор  к  Head  и нажмите клавиши
       Atl-F10 I.

       TDeb 3.0 #2-3               = 161 =
            Нажав клавишу Enter, посмотрите на значение, на которое ссы-


       лается Parm.  Вы смотрите на первый элемент списка, и его строко-
       вые данные уже повреждены.  Если вы нажмете клавишу Esc,  стрелку
       вниз,  а затем снова клавишу Enter, то вы откроете окно Inspector
       (Проверка) для второго узла (элемента)  списка.  Нажмите  клавишу
       Enter, чтобы проверить строковые данные. Они не запорчены, факти-
       чески,  на тот же узел ссылается указатель Tail. Очевидно, что-то
       не так с концом строковых данных.
            Следите за окном Watch,  когда вы используете клавишу F7 для
       выполнения  цикла.  На  строке  199  содержится  вызов  процедуры
       GetMem, перед этим вызовом Tail^.Parm^ равно первому символу. Не-
       посредственно после вызова GetMem последний символ  в Tail^.Parm^
       уничтожается.
            Что происходит?  Для  каждого  параметра  командной строки в
       цикле for сначала выделяется запись,  затем строковые данные, за-
       тем следующая запись и т.д. При вызове GetMem на строке 198 долж-
       но выделяться достаточно памяти для строки, плюс байта длины, но,
       как можно заметить, к Length(s) не прибавляется 1. Хотя на строке
       199 строка успешно копируется,  для нее на самом деле выделено на
       1 байт меньше,  чем она использует.  Таким образом, первый символ
       строки перекрывается первым байтом следующей  записи,  выделенной
       при обращении к процедуре New(Temp).  Последний параметр остается
       незапорченным, так как на ним не следует другая ParmRec.
            Это все известные нам ошибки в программе.  Возможно  при  ее
       выполнении вы найдете какие-то еще. Вы можете исправить эти ошиб-
       ки, а затем перекомпилировать программу (для удобства они отмеча-
       ются  двумя звездочками (**)),  или запустить TPDEMO.EXE - версию
       программу, о которой рассказывалось в Главе 3 и в  которой ошибок
       нет.

       TDeb 3.0 #2-3               = 162 =
       Глава 15. Виртуальная отладка с использованием процессора 80386


       -----------------------------------------------------------------
            Турбо отладчик позволяет вам полностью использовать произво-
       дительность систем,  основанных на процессоре 80386.  Виртуальная
       отладка  позволяет отлаживаемым программам полностью использовать
       адресное пространство, превышающее 640К (как при отсутствии в па-
       мяти отладчика), поскольку Турбо отладчик загружается в расширен-
       ную память выше 1Мб..
            Отладка выполняется так же,  как при  обычном  использовании
       Турбо отладчика,  только когда загружается драйвер  TDH386,  ваша
       программа  загружается и выполняется с того же адреса,  как и при
       обычном выполнении (без отладчика). Это может оказаться очень по-
       лезным  как  при отладке больших программ,  так и при обнаружении
       ошибок,  которые исчезают,  если программа загружается в  старшие
       адреса памяти.
            Виртуальная отладка также позволяет вам наблюдать за чтением
       и записью в произвольные ячейки памяти или ввода-вывода, не утра-
       чивая  при этом (или почти не утрачивая) скорости выполнения. Это
       без  дополнительной  оплаты  позволяет  использовать  все  мощные
       средства аппаратной отладки.
            Если у вас имеется процессор 80286,  то с помощью отладчика,
       работающего в защищенном режиме (TD286) вы можете получить в свое
       распоряжение больше памяти,  чем при обычной работе с отладчиком.
       Более подробно об этом рассказывается в Главе 16.
          Аппаратные средства, необходимые для виртуальной отладки
       -----------------------------------------------------------------
            Чтобы можно было использовать виртуальный отладчик,  в вашем
       компьютере должен применяться процессор 80386. Вы должны распола-
       гать также расширенной (extended) памятью объемом не  менее 640К.
       Если  вы используете расширенную память для псевдодисков, буферов
       и т.д., то может потребоваться создание специальных версий файлов


       CONFIG.SYS или AUTOEXEC.BAT, которые нужно будет использовать при
       виртуальной отладке.
          Установка драйвера устройства для виртуального отладчика
       -----------------------------------------------------------------
            Перед запуском  виртуального отладчика нужно убедиться,  что
       вашем файле CONFIG.SYS установлен драйвер  устройства. Установить
       его можно, включив в данный файл следующую строку:
               DEVICE = TDH386.SYS
            Если драйвер TDH386.SYS содержится у вас не в корневом ката-
       логе, а в другом месте, то нужно указать маршрут доступа.
            Обычно виртуальный отладчик позволяет  вам  использовать  до

       TDeb 3.0 #2-3               = 163 =
       256 байт строк,  задающих параметры операционной среды DOS.  Если
       этого недостаточно,  или вам не нужен такой объем и вы хотите сэ-
       кономить возможно больше памяти,  используйте в файле  CONFIG.SYS
       параметр -e, который задает число байт операционной среды. Напри-
       мер:
               DEVICE = TDH386.SYS -e2000
       резервирует 2000 байт для переменных операционной среды DOS.
                        Запуск виртуального отладчика
       -----------------------------------------------------------------
            Запускается виртуальный отладчик точно  также,  как  обычный
       сеанс работы с Турбо отладчиком командой:
               TD386 [параметры] [программа [параметры_программы]]
            Другими словами,  вместо  TD  указывается просто TD386.  При
       этом будет выполняться поиск выполняемой программы Турбо отладчи-
       ка и загрузка ее в расширенную память.
            Если у вас есть другие программы или драйверы устройств, ис-
       пользующие расширенную память (псевдодиски,  буферы  и  др.),  вы
       должны указать TD386,  сколько памяти занимают эти программы. Это
       можно сделать с помощью параметра командной строки -e, за которым
       указывается объем (в килобайтах) расширенной памяти, используемой


       другими программами, например:
               TD386 -e512 myprog
            Эта командная строка сообщает TD386,  что вы хотите зарезер-
       вировать для других программ первые 512К расширенной памяти.
            Обычно, если в вашей системе  поддерживается  стандарт  XMS,
       вовсе не  обязательно сообщать TD386,  сколько памяти нужно оста-
       вить для программ в расширенной памяти - программы  уже  передали
       эту информацию  TD386.  Параметр  -e  нужно использовать только с
       программами (такими,  как VDISK),  которые не взаимодействуют  со
       стандартом XMS.
            Поскольку вы,  вероятно,  всегда  резервируете один и тот же
       объем расширенной памяти, TD386 дает вам способ постоянного зада-
       ния  объема резервируемой памяти.  Чтобы сообщить,  что вы хотите
       постоянно установить значение параметра -e  в  выполняемом  файле
       TD386, используйте параметр -w.
            Вам будет выведена подсказка, в ответ на которую нужно ввес-
       ти имя выполняемой программы.  Если вы работаете в DOS версии 3.0
       или старше, в подсказке будет указываться маршрут доступа к ката-
       логу и имя файла,  из которого запущен TD386. Вы можете использо-
       вать это имя, нажав клавишу Enter, или ввести имя нового выполня-
       емого  файла.  Файл  с  этим   именем   должен   существовать   и

       TDeb 3.0 #2-3               = 164 =
       представлять собой копию программы TD386.
            Если вы работаете под управлением DOS версии 2.х,  вам  при-
       дется  указать  полное имя выполняемой программы TD386 (с маршру-
       том).
            Перечислим параметры командной строки TD386.EXE:
       -----------------------------------------------------------------
       -?, -h  Выводит справочную информацию по TD386.
       -b      Позволяет вам прерывать  выполнение  программы с  помощью
               клавиш Ctrl-Break, даже когда запрещены прерывания.
       -e####  Задает, сколько  килобайт расширенной  памяти используют-


               ся  другими  программами или отлаживаемой вами программой
               ( данный параметр указывать не требуется, если ваша систе-
               ма поддерживает стандарт XMS).
       -w      Модифицирует TD386.EXE  новым  используемым  по умолчанию
               значением -e или -f.
       -f####  Разрешает эмуляцию EMS с помощью  страничного  обмена  (в
               расширенной памяти) и устанавливает сегмент границы стра-
               ницы в значение #### (шестнадцатиричное).  Последние  три
               цифры  должны  быть равны 000 (например,  E000 или C000).
               Заметим, что данный параметр применяется только к вызовам
               EMS Турбо отладчика.  Если вы не можете загрузить таблицу
               идентификаторов,  попробуйте  использовать  параметр  -f,
               чтобы вынудить TD386 заимствовать из расширенной памяти.
                      Нет EMS:                            -fD000
                      EMS по адресу D000:                 -fE000
                      EMS по адресу E000:                 -fD000
       -f-     Запрещает эмуляцию EMS (отменяет действие предыдущего па-
               раметра командной строки).
       -w      Модифицирует TD386.EXE новым  используемым  по  умолчанию
               значением параметра -e или -f. Вы можете ввести имя ново-
               го выполняемого файла, который  еще  не  существует.  При
               этом TD386 создаст новый выполняемый файл.
       -----------------------------------------------------------------
            Заметим, что  параметры TD386 должны указываться в командной
       строке перед другими параметрами Турбо отладчика или именем прог-
       раммы, например:
               TD386 -e1024 -fD000 -w
       резервирует 1024К  расширенной памяти,  разрешает эмуляцию EMS со
       страничной рамкой D000, и модифицирует TD386.EXE данными значени-
       ями.

       TDeb 3.0 #2-3               = 165 =
            Для вывода  списка  всех командных строк,  которые можно ис-


       пользовать для TD386, наберите просто TD386 ? или TD386 -h и наж-
       мите клавишу Enter.
                  Примечание: Если  вы работаете на компьютере с процес-
             сором 386 и хотите  прочитать  параметры  командной  строки
             TD386.EXE, нужно перезагрузить TDH386.SYS.

       TDeb 3.0 #2-3               = 166 =
                    Отличия обычной и виртуальной отладки
       -----------------------------------------------------------------
            В основном  при  обычной отладке и при виртуальной отладке с
       использованием возможностей процессора 80386 все работает  одина-
       ково. Различия состоят в следующем:
            1. При использовании команды File¦DOS  Shell (Файл¦Командный
               процессор операционной системы DOS) отлаживаемая програм-
               ма никогда не сбрасывается на  диск.  Это  означает,  что
               иногда  вам  может  не  хватить памяти для запуска других
               программ в ответ на подсказку DOS.
            2. Ваша  программа  может  использовать почти все инструкции
               процессора 80386,  за исключением инструкций  защищенного
               режима: CLTS, LMSW, LTR, LGDT, LIDT, LLDT.
            3. Хотя  при  виртуальной отладке вы можете использовать все
               режимы расширенной адресации процессора 80386  и  32-раз-
               рядные регистры, вы не можете обращаться к памяти свыше 1
               Мб. При попытке сделать это будет генерироваться прерыва-
               ние, и управление будет передано отладчику.
            4. Нельзя использовать виртуальную отладку,  если вы уже за-
               пустили программу или  драйвер  устройства,  использующие
               виртуальный и защищенный режимы процессора 80386. Это та-
               кие программы, как:
                       - операционная среда DesqView;
                       - операционная среда Windows-386;
                       - драйвер эмуляции EMS CEMM.SYS Compaq;


                       - драйвер эмуляции EMS QEMM.SYS QuarterDeck;
                       - 386^MAX.
               Если вы  используете  обычно  одну из этих программ,  вам
               придется остановить их или разгрузить перед использовани-
               ем TD386.
            5. Если вы используете виртуальную отладку,  TD386 может пе-
               рехватывать генерируемые вашей программой прерывания. Ес-
               ли  происходит  прерывание,  программа  останавливается и
               TD386 сообщает о том, что произошло прерывание. Выводимое
               сообщение описывает характер прерывания,  а стрелка в об-
               ласти кода окно CPU (ЦП) или в окне Module (Модуль) отме-
               чает инструкцию, которая вызвала прерывание.
            6. Непредвиденных  прерываний возникать не должно.  В случае
               их возникновения обратитесь к следующему разделу  и  про-
               верьте,  упоминаются ли они там.  Если нет, проконсульти-
               руйтесь с представителями фирмы Borland.
                  Замечания относительно возможных проблем
       -----------------------------------------------------------------

       TDeb 3.0 #2-3               = 167 =
            Если вы используете TDH386 и получаете сообщение "Not enouhg
       memory to load symbol table" ("Не  хватает  памяти  для  загрузки
       таблицы идентификаторов"),  то  вам  нужно  разрешить  для TDH386
       эмуляцию EMS.
            Например, чтобы установить для TDH386 EMS в  сегмент 0D000h,
       используйте для запуска TDH386 следующую команду:
            TDH386 -FD000
            Если вы используете HP Vestra и получаете при запуске TDH386
       непредвиденное прерывание 06,  нужно задать параметр в  установке
       CMOS. По  умолчанию  серия Vestra использует в части HP-HILL инс-
       трукцию защищенного режима.  Чтобы обойти это, свяжитесь с фирмой
       Hewlett Packard и узнайте, как обойти данную инструкцию.


            Если исключительная ситуация 06 возникает после того, как вы
       некоторое время поработаете в TDH386,  то ваш исходный код будет,
       возможно, модифицирован.  Обычно исключительная ситуация 06 гене-
       рируется процессором 80386,  когда встречается  недопустимый  код
       операции. Типичной  причиной  этой  ошибки является использование
       неинициализированных указателей.
            Исключительные ситуации 06,  13 и 0D могут  возникать,  если
       вы используете старый драйвер "мыши",  сетевой драйвер или другой
       аппаратный драйвер.  Если в TD386 вы получаете данные ошибки, по-
       пытайтесь удалить по очереди аппаратные драйверы, начиная с драй-
       вера "мыши", сетевого драйвера, и так далее, пока не  идентифици-
       руете драйвер, приводящий к такой ситуации. Если для этого  драй-
       вера имеются модификации, то посмотрите,  устранит ли проблему их
       установка. Последняя  возможная  мера  состоит  в полном удалении
       драйвера.
            Если вы  получаете  во  время  загрузки   TDH386   сообщения
       "Processor already in protected mode" ("Процессор уже в  защищен-
       ном режиме"), это означает, что выполняется программа, использую-
       щая виртуальный режим процессора 80386 (например,QEMM). Использо-
       вать одновременно эти программы и TDH386 нельзя.  Если вам  необ-
       ходимо  использовать данные подсистемы управления памятью,  попы-
       тайтесь вместо TDH386 использовать TD286.
                         Сообщения об ошибках TD386
       -----------------------------------------------------------------
            При невозможности начать работу  TD386  генерирует  одно  из
       следующих  сообщений  и  возвращает вас на уровень подсказки DOS.
       Перед тем, как запустить TD386, нужно исправить ситуацию.
            TD386 error: 80386 device driver missing or wrong version
            (нет драйвера 80386 или неправильная версия)


            Перед вызовом TD386 с помощью командной строки DOS нужно ус-

       TDeb 3.0 #2-3               = 168 =
       тановить в файле CONFIG.SYS драйвер TDH386.SYS.
            TD386 error: Can't enable the A20 adress line
            (не могу разрешить адресацию строки A20)
            TDH386 не  может  обратиться  к памяти свыше 1Мб.  Это может
       происходить в том случае, если вы работаете в системе, которая не
       полностью совместима с IBM.
            TD386 error: Can't find TD.EXE
            (невозможно найти TD.EXE)
            TD386 не может найти файл TD.EXE.
            TD386 error: Couldn't execute TD.EXE
            (невозможно выполнить TD.EXE)
            TD386 не может выполнить TD.EXE.
            TD386 error:  Enviroment  too  long;  use -e#### switch with
            TDH386.SYS
            (слишком длинная   строка  операционной  среды,  используйте
            TDH386.SYS с параметром -e####)
            Нужно изменить  параметр  -e,  как было указано в предыдущих
       разделах.
            TD386 error: Not enough Extended Memory avaliable
            (объем доступной расширенной памяти недостаточен)
            TD386 превысил границы памяти.  Нужно использовать машину  с
       памятью  большего объема или освободить память (уменьшив,  напри-
       мер, объем псевдодиска).
            TD386 error: Wrong CPU type (not an 80386)
            (неправильный тип центрального процессора: не 80386)
            Вы работаете на системе,  где используется процессор, отлич-
       ный от 80386.
            Следующие ошибки  могут  произойти,  если  вы модифицировали
       TD386 с помощью параметра -w:
            TD386 error: Cannot open program file
            (невозможно открыть файл программы)
            TD386 error: Cannot read program file
            (невозможно прочитать файл программы)
            TD386 error: Cannot write program file
            (невозможно записать файл программы)
            TD386 error: Program file corrupted or wrong version



       TDeb 3.0 #2-3               = 169 =
            ( программный файл поврежден или неверна версия)
                       Сообщения об ошибках TDH386.SYS
       -----------------------------------------------------------------
            Может возникнуть  только  две ошибки,  связанных с драйвером
       TDH386.SYS:
            Wrong CPU type: TDH driver not installed
            (неверный тип ЦП: драйвер TDH не установлен)
            Invalid command line: TDH driver not installed
            (недопустимая командная строка: драйвер TDH не установлен)

       TDeb 3.0 #2-3               = 170 =
       Глава 16. Отладка в защищенном режиме с использованием TD386
       -----------------------------------------------------------------
            Отладчик для защищенного режиме TD386 использует преимущест-
       ва процессора 80286 и позволяет освободить больше памяти для  от-
       лаживаемых вами программ. TD386 помещает программу Турбо отладчи-
       ка в расширенную память выше 1Мбайта и оставляет  в  нижних  640К
       памяти сравнительно небольшой загрузчик. Это дает вам больше мес-
       та для программ,  которые вы отлаживаете, и их таблиц идентифика-
       торов.
            Используйте в этом случае Турбо отладчик, как обычно. Единс-
       твенным отличием будет то,  что вашей программа  получит  больший
       объем памяти.
                 Замечание: Если вы работаете на компьютере с  процессо-
            ром  80386 и еще не используете программу защищенного режима
            типа 386^MAX,  то еще большие возможности и экономию  памяти
            вам даст отладчик TD386.  Более подробно об этом рассказыва-
            ется в Главе 15.
          Аппаратура, необходимая для использования отладчика TD286
       -----------------------------------------------------------------
            Чтобы использовать  отладчик  защищенного  режима TD286,  вы
       должны иметь компьютер с процессором 80286 или старше и  не менее


       640К доступной расширенной памяти.
                 Установка отладчика для защищенного режима
       -----------------------------------------------------------------
            Перед тем,  как в первый раз использовать TD286,  вы  должны
       запустить программу конфигурации TD286INS. Это позволит TD286 оп-
       ределить некоторые характеристики аппаратуры, на которой вы рабо-
       таете. Для   настройки  конфигурации  TD286  запустите  программу
       TD286INS в ответ на подсказку DOS.
            Программа TD286INS после того, как она определит характерис-
       тики аппаратных средств, попросит вас нажать несколько раз клави-
       шу пробела. Если в какой-либо момент ваша система "зависнет" и не
       будет дальше  работать,  то  перезагрузитесь и повторно запустите
       программу конфигурации.  Программа конфигурации знает о том,  что
       возникла проблема, и продолжает выполнять следующую фазу тестиро-
       вания.
            Когда программа TD286INS завершит  выполнение,  можно  будет
       использовать TD286.

       TDeb 3.0 #2-3               = 171 =
                   Запуск отладчика для защищенного режима
       -----------------------------------------------------------------
            Запустить отладчик для защищенного режима  можно  с  помощью
       командной строки со следующим синтаксисом:
               TD286 [параметры] [программа [параметры программы]]
            Параметры TD286  совпадают с параметрами обычного отладчика.
       за исключением параметров -r, -rn, -rp, -rs, -sm, -w, -y, -ye.
       (TD286 не работает с оверлеями, удаленной отладкой и Windows).
         Отличия Турбо отладчика и отладчика для защищенного режима
       -----------------------------------------------------------------
            Есть несколько функций,  которые вы можете выполнять в Турбо
       отладчике, но не можете использовать в отладчике TD286:
            - когда вы используете команду File¦Dos Shell  (Файл¦Команд-


               ный процессора DOS) для выполнения команды DOS, программа,
              которую вы отлаживаете, не сбрасывается на диск. Это озна-
              чает, что вам может не хватить памяти для выполнения прог-
              рамм в ответ на подсказку DOS.
            - вы не можете использовать отладчик TD286 для отладки прог-
              рамм, работающих  в  защищенном  режиме,  или использовать
              расширитель DOS, который приводит к конфликту с TD286.
            Отладка программ, использующих дополнительную память
       -----------------------------------------------------------------
            По умолчанию TD286 будет использовать всю  доступную  расши-
       ренную  память.  Если вы отлаживаете программу,  которая сама ис-
       пользует этот вид памяти (extended memory),  то для использования
       TD286 нужно создать файл конфигурации CONFIG.286 в корневом ката-
       логе текущего дисковода. В этом файле должна быть строка:
            MEGS=#
       где # - это объем расширенной памяти,  которую может использовать
       отладчик.
                     Выполнение TD286 на разных машинах
       -----------------------------------------------------------------
            Отладчику TD286  известны аппаратные характеристики десятков
       машин. Когда вы запускаете  TD286INS,  и  она  сообщает  "Machine
       already in file's database" (машина уже описана в файле базы дан-
       ных), то TD286 уже знает о вашем  компьютере,  и  модификация  не
       требуется.
            Если TD286INS выполнит свои проверки (тестирование),  то ап-
       паратные характеристики вашей машины будут записаны  в  TD286,  и

       TDeb 3.0 #2-3               = 172 =
       будет создан файл с расширением .DB.  Этот файл  следует  послать
       фирме Borland  или  на одну из конференций Compuserve,  благодаря
       чему следующие версии TD286 смогут автоматически поддерживать ха-
       рактеристика вашего компьютера.  TD286 может хранить  характерис-
       тики до 10 компьютеров, отличных от того, на котором он начал ра-
       ботать.


Содержание раздела