ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 3

       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:

        ЪДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
        і-?, -р    і  Обращение  за  подсказкой  о параметрах команднойі
        і          і  строки TDW.                                      і
        і          і                                                   і
        і-c<файл>  і  Использование файла конфигурации <файл>.         і
        і          і                                                   і
        і-do       і  Запуск TDW на вторичном дисплее.                 і
        і          і                                                   і
        і-ds       і  Обновление   экранов  путем  свопинга  (подкачки)і
        і          і  страниц.                                         і
        і          і                                                   і
        і-l        і  Запуск в режиме Ассемблера. Отладка  кода началь-і
        і          і  ной загрузки библиотеки DLL.                     і

       TDeb 3.0 #3-3                = 11 =

        і          і                                                   і
        і-p        і  Использование "мыши".                            і
        і          і                                                   і
        і-sc       і  Игнорировать регистр в именах идентификаторов.   і
        і          і                                                   і
        і-sdкаталогі  Установить в качестве каталога с исходными файла-і
        і          і  ми указанный каталог.                            і
        і          і                                                   і
        і-tкаталог і  Установить в качестве начального каталога  запус-і
        і          і  ка указанный каталог.                            і
        АДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

            Один из этих параметров командной строки, параметр 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 є
           ИНННННННННННННННННННННННННННННННННННННННННННННННННННННННЅ

             Рис. 17.1 Окно Windows Messages



       TDeb 3.0 #3-3                = 16 =

                                 Выбор окна
       ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

            ЪДДДДДДДДДДДДДДї
            і Add...       і         Добавить
            і Remove       і         Удалить
            і Delete All   і         Удалить все
            АДДДДДДДДДДДДДДЩ

            Прежде чем вы сможете регистрировать  сообщения,  вы  должны
       сначала указать, для которого окна будут регистрироваться сообще-
       ния. Это выполняется в верхней левой области, области выбора окна
       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                   ±±±±±±  є
                  є                                        є
                  ИННННННННННННННННННННННННННННННННННННННННј

            Рис. 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 є
           є                                                       є
           є                                                       є
           є                                                       є
           ИНННННННННННННННННННННННННННННННННННННННННННННННННННННННЅ

            Рис. 11.1 Окно Windows  Messages  с  разрешенной  поддержкой
       ObjectWindows

                   ЪДДДДДДДДДДДДДї
                   і Add...      і      Добавить
                   і Remove      і      Отменить
                   і Delete All  і      Удалить все
                   АДДДДДДДДДДДДДЩ

            Перед тем,  как  вы сможете регистрировать сообщения,  нужно
       сначала указать,  для какого окна регистрируются  сообщения.  Это
       можно сделать в левой верхней области - области выбора окна.  Ло-
       кальное меню области (которое активизируются с помощью клавиш 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   є
                  є                                 ±±±±±±± є
                  є                                         є
                  ИНННННННННННННННННННННННННННННННННННННННННЅ

            Рис. 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  і           Удалить все
                  АДДДДДДДДДДДДДЩ

            Перед тем,  как добавить в данной области класс сообщений, в
       области выбора окна нужно задать процедуру окна или описатель.

            Если вы  не  задаете  конкретный  класс  сообщений или класс
       просматриваемых сообщений, то 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                    є
                   є  ±±±±±±±±±±±±±±±±±±±±±±                 є
                   ИНННННННННННННННННННННННННННННННННННННННННЅ

            Рис. 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
        ЪДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
        і  Класс сообщения     і  Описание                            і
        ГДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
        і 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_, которое вы      і
        і                      і  хотите зарегистрировать или         і
        і                      і  прервать программу по сообщению     і
        АДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

            Для отслеживания  отдельного   сообщения   выберите   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              і       Стереть регистрацию
            АДДДДДДДДДДДДДДДДДДДДДДДДЩ

            Оконные сообщения  выводятся  в  нижней области окна 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                   є
                     є                    є
                     є                                   є
                     ИНННННННННННННННННННННННННННННННННННј

            Рис. 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і
       ГДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
       іПоле          і Описание                                       і
       ГДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
       і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-килобайтовых страниц объекта.              і
       АДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

       Листинг содержимого локальной динамически распределяемой области
       ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

            Локальная динамически  распределяемая  область  памяти - это
       частная область памяти для прикладной программы. Для других прик-
       ладных  программ  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)                                 і
       ГДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
       і Поле        і Описание                                        і
       ГДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
       і OEC5        і Смещение объекта в локальном сегменте данных.   і
       і             і                                                 і
       і 0024        і Длина объекта в байтах.                         і
       і             і                                                 і
       і BUSY        і Размещение объекта памяти:                      і
       і             і  FREE - нераспределенный блок памяти;           і
       і             і  BUSY - распределенный объект.                  і
       і             і                                                 і
       і (10AF)      і Описатель локальной памяти для объекта.         і
       АДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                          Получение списка модулей
       ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

            Чтобы увидеть список модулей задачи или 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                           і
       ГДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
       іПоле              і               Описание                     і
       ГДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
       і0EFD              іЛогический номер сегмента памяти, выраженныйі
       і                  і4-значным шестнадцатиричным значением.      і
       і                  і                                            і
       іTASK              іТип модуля. Модуль может быть либо задачей, і
       і                  ілибо DLL.                                   і
       і                  і                                            і
       іGENERIC           іИмя модуля.                                 і
       і                  і                                            і
       іC:\TD\GENERIC.EXE іМаршрут к выполняемому файлу модуля.        і
       АДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

               Отладка динамически компонуемых библиотек (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      є
            є ±±±±±±±±±±±±±±±±          ±±±±±±±±±±±±±±±±  °°°°°°°°°°°  є
            є                                                          є
            ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј

            Рис. 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
       ЪДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
       і Кнопка            і                 Описание                  і
       ГДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
       і 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.           і
       АДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                   Добавление 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 [параметры] [имя_программы [аргументы_программы] ]

            Элементы, заключенные в квадратные скобки, являются необяза-
       тельными. Если за параметром указывается минус (-), то данный па-
       раметр запрещается (если он разрешен в файле конфигурации).

       ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
       і   Параметр                 Функция                            і
       ГДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
       і-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 килобайт).                    і
       АДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ




       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              і
       АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

           Отладчик 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і
       АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

       Мнемонические обозначения команд процессора 80486   Таблица C.3
       ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
       і              BSWAP               INVLPG                       і
       і              CMPXCHG             WBPINVD                      і
       і              INVD                XADD                         і
       АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                         Регистры процессора 80386         Таблица C.4
       ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
       і              EAX                 EDI                          і
       і              EBX                 EBP                          і
       і              ECX                 ESP                          і
       і              EDX                 FS                           і
       і              ESI                 GS                           і
       АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                     Регистры центрального процессора      Таблица 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)        і
       АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                    Специальные зарезервированные слова    Таблица C.6
       ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
       і                   WORD PTR            TBYTE PTR               і
       і                   BYTE PTR            NEAR                    і
       і                   DWORD PTR           FAR                     і
       і                   QWORD PTR           SHORT                   і
       АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ



       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.      і
       АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

       Мнемонические обозначения команд сопроцессора 80387 Таблица C.8
       ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
       і                   FCOS                FUCOM                   і
       і                   FSIN                FUCOMP                  і
       і                   FPREM1              FUCOMPP                 і
       і                   FSINCOS                                     і
       АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ




       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                    і
                                      АДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                     Параметры командной строки 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           І°і
       іАі і±Windows±±±>іset і°°°°°°°°°°°°°°іBreakpoint              І°і
       і°АДі ЪДДДДДДДДДДДДДДДДї°°°°°°°°°°°°°і                        v°і
       і°°°АДі±Text±±±±±±±±±±>і°°°°°°°°°°°°°А<ІІІІІІІІІІІІІІІІІІІІІІ>Щ°і
       і°°°°°і ЪДДДДДДДДДДДДДДДДДДДДДДДДДДї°ЪДДДAnother WindowДДДДДДДї°і
       і°°°°°і і±Window±Background±±±±±±±±і°і                        і°і
       і°°°°°АДі Selected text background і°і                        і°і
       і°°°°°° і Breakpoint               і°і                        і°і
       і°°°°°° ГДДДДДДДДДДДДДДДДДДДДДДДДДДґ°і                        і°і
       і°°°°°° і Standord foreground      і°і                        і°і
       і°°°°°° і Selected text foreground і°АДДДДДДДДДДДДДДДДДДДДДДДДЩ°і
       і°°°°°° і Current window border    і°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і°°°°°° і Non-current border       і°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і°°°°°° і Button                   і°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і°°°°°° і Scroll bar               і°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і°°°°°° АДДДДДДДДДДДДДДДДДДДДДДДДДДЩ°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і Alt: X - exit±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±і
       АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

            Рис. 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іі
       іАі і±Windows±±±>іset і°°°°°°°°°°°°°°іHistory item  Higlight   іі
       і°АДі ЪДДДДДДДДДДДДДДДДї°°°°°°°°°°°°°іCurrent item Current itemіі
       і°°°АДі±Text±±±±±±±±±±>і°°°°°°°°°°°°°і              List item 2іі
       і°°°°°і ЪДДДДДДДДДДДДДДДДДДДДДДДДДДї°і [ ] Check box           іі
       і°°°°°і і±Window±Background±±±±±±±±і°і [ ] Current item        іі
       і°°°°°АДі List and group backgroundі°і ( ) Radio button        іі
       і°°°°°° і Text and entry backgroundі°і                         іі
       і°°°°°° і Highlight background     і°і Information text        іі
       і°°°°°° і Button background        і°і                         іі
       і°°°°°° ГДДДДДДДДДДДДДДДДДДДДДДДДДДґ°і Button  Default  Active іі
       і°°°°°° і Window border            і°і ±±±±±±  ±±±±±±±  ±±±±±± іі
       і°°°°°° і Standard text            і°АДДДДДДДДДДДДДДДДДДДДДДДДДЩі
       і°°°°°° і Information text         і°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і°°°°°° і Active item              і°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і°°°°°° і Default item             і°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і°°°°°° і Current list item        і°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і°°°°°° і List item                і°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і°°°°°° і Hot Letter               і°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і°°°°°° і Scroll bar               і°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і°°°°°° і Close button             і°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і°°°°°° АДДДДДДДДДДДДДДДДДДДДДДДДДДЩ°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°і
       і Alt: X - exit±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±і
       АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

            Рис. 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          і
            Фоновый цвет строки          АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
             состояния

                                    Экран
       ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

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

                                           ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДї
            Образец фонового цвета         і Pattern for background  > і
                                           ГДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
            Образец фона                   і Pattern background        і
            Образец основного цвета        і Pattern foreground        і
            Перемещение окна               і Window move               і
                                           АДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ



       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  є
          є                                             ±±±±± ±±±±±±  є
          ИНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј

            Рис. 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...          і    Разное
             АДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                           Параметр 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                           є
          є                                                           є
          ИНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј

            Рис. 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         є
                   є  ±±±±±±                  ±±±±±±         є
                   є                                         є
                   ИНННННННННННННННННННННННННННННННННННННННННј

            Рис. 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        є
          є                                            є
          є Remote type                                               є
          є  (*) None                       Network remote name       є
          є  ( ) Serial                                є
          є  ( ) Network                                              є
          є                                    OK        Cancel       є
          є                                  ±±±±±±      ±±±±±±       є
          ИНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј

             Рис. 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                    і
                                         АДДДДДДДДДДДДДДДДДДДДДДДДЩ

            Выбор команды 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, которые позволяют
       сделать значения этих параметров постоянными.

       ЪДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
       іПараметр  і  Команда меню 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      і
       АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

       TDeb 3.0 #3-3               = 131 =


            Полный список  всех  параметров  командной  строки   утилиты
       TDINST можно получить, если вызвать ее с параметром -h.

                              В процессе работы
       ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

                                           ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДї
             Сохранить файл конфигурации   і Save configuration file...і
             Модифицировать TD.EXE         і Modify TD.EXE             і
                                           АДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

            После того,  как вы установите все параметры Турбо отладчика
       так,  как хотите, выберите из основного меню команду 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. Перед параметром
       должен стоять либо знак переноса (-), либо косая черта (/).

        ЪДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
        і  Параметр    і  Что он делает                                і
        ГДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
        і  -? или -h   і  Отображает текст подсказки                   і
        і              і                                               і
        і  -rp1        і  Порт 1 (COM1); это умолчание                 і
        і  -rp2        і  Порт 2 (COM2)                                і
        і              і                                               і
        і  -rs1        і  Самая низкая скорость, 9600 бод              і
        і  -rs2        і  Низкая скорость, 19200 бод                   і
        і  -rs3        і  Средняя скорость, 38400 бод                  і
        і  -rs4        і  Высокая скорость, 115000 бод (по умолчанию)  і
        і              і                                               і
        і  -w          і  Записать значения параметров в исполняемый   і
        і              і  программный файл                             і
        АДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

            Чтобы получить  список  всех  имеющихся параметров 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±±±±±±±±±±±±±±±±±і
           АДДДДДґ                                                     і
                 і Ъї                   °°°°°°OK°°°°°° °°°°Cancel°°°°  і
                 і АЩ  Disable clock interrupts                        і
                 і ±±  Quit when TD quits             ЪBaud rateДї     і
                 і                                    і o 9600   і     і
                 і Starting directory:                і * 19200  і     і
                 і ЪДДДДДДДДДДДДДДДДДДДДДДДДї         і o 38400  і     і
                 і АДДДДДДДДДДДДДДДДДДДДДДДДЩ         і o 115000 і     і
                 і                                    АДДДДДДДДДДЩ     і
                 і  ЪRemote typeДДДї                                   і
                 і  і * Serial     і                                   і
                 і  і o Network    і                                   і
                 і  АДДДДДДДДДДДДДДЩ                                   і
                 і                                    ЪComm portДї     і
                 і Network remote name:               і * COM1   і     і
                 і ЪДДДДДДДДДДДДДДДДДДДДДДДДї         і o COM2   і     і
                 і АДДДДДДДДДДДДДДДДДДДДДДДДЩ         АДДДДДДДДДДЩ     і
                 АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

            Рис. 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. Перед параметром
       должен стоять либо знак дефиса (-), либо косая черта (/).

       ЪДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
       і Параметр      і  Что он делает                                і
       ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
       і               і                                               і
       і -c<имя_файла> і Использовать <имя_файла> как файл конфигурацииі
       і               і (файл .INI)                                   і
       і               і                                               і
       і -d<каталог>   і Использовать  <каталог>  в качестве начальногоі
       і               і                                               і
       і -rc0          і Разрешает прерывания от системных часов       і
       і -rc1          і Запрещает прерывания от системных часов       і
       і               і                                               і
       і -rp1          і Порт 1 (COM1); это умолчание                  і
       і -rp2          і Порт 2 (COM2)                                 і
       і               і                                               і
       і -rq0          і Не выполнять выход при выходе из TD           і
       і -rq1          і Выполнять выход при выходе из TD              і
       і               і                                               і
       і -rs1          і Самая низкая скорость, 9600 бод               і
       і -rs2          і Низкая скорость, 19200 бод                    і
       і -rs3          і Средняя скорость, 38400 бод                   і
       і -rs4          і Высокая скорость, 115000 бод (по умолчанию)   і
       АДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ


                     Запуск удаленного драйвера 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.





Яндекс цитирования