Класс ScribbleWindow определяет определяет объект
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.
Теперь, если вы рисуете с помощью пера, то линия рисуется
назначенным по умолчанию цветом - черным.Попробуйте рисовать раз-
личными цветами, выбирая из меню цвет пера. Красный, зеленый и
голубой будут работать прекрасно, но когда вы попытаетесь изме-
нить цвет обратно на черный, то цвет пера не изменится. Похоже,
который создает цвет пера SelectBlackPen.
вы нашли другую ошибку.
Поиск ошибки назначения цвета пера
-----------------------------------------------------------------
Наиболее вероятным местом этой ошибки является функция
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, затем нажмите клавиши
для вывода диалогового окна Windows
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, то
ния по сообщению окна в 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.
Значение 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. Единственным параметром
на вызове 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, плюс
определен с помощью утилиты 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 знает, что
дисковод C, DOS знает, что нужно вызвать драйвер третьего блочно-
ориентированного устройства.
Связанный список двух заголовков драйвера содержит смещение
двух компонентов самого драйвера устройства: подпрограмму функции
и подпрограмму обработки прерывания.
Когда DOS определяет, что требуется вызвать данный драйвер
устройства, она вызывает драйвер дважды. При первом вызове драй-
вера DOS общается с подпрограммой функции и передает ей указатель
на буфер в памяти, который называется заголовком запроса. Этот
заголовок запроса содержит информацию о том, какие функции требу-
ет выполнить DOS от драйвера устройства. Подпрограмма функции
просто просто сохраняет данный указатель для последующего исполь-
зования. При втором вызове драйвера устройства DOS вызывает подп-
рограмму обработки прерывания, которая выполняет реальные функ-
ции, заданные DOS в заголовке запроса, например, пересылку
символов с диска.
В заголовке запроса с помощью байта, который называется ко-
дом команды, определяется, что должен делать драйвер устройства.
Код команды определяет одну из предопределенных операций из набо-
ра операций, которые должны выполнять все драйверы устройств. На-
бор кодов команд (операций) для драйверов символьно-ориентирован-
ных и блочно-ориентированных устройств различен.
Проблема при отладке драйверов устройств состоит в том, что
файл .EXE отсутствует, так как для выполнения соответствующих
функций драйвер должен быть загружен во время загрузки системы с
помощью команды DEVICE = DRIVER.EXT, где EXT - это расширение
.SYS, .COM или .BIN. Это означает, что отлаживаемый драйвер уст-
ройства уже резидентен в памяти до начала отладки. Следовательно,
функции по выполнению загрузки и перемещения таблицы идентифика-
торов весьма полезны, поскольку они
торов весьма полезны, поскольку они могут восстановить информацию
об идентификаторах для дизассемблированного сегмента памяти (ког-
да драйвер загружен). Как мы увидим далее, команда File¦Resident
(Файл¦Резидент) также очень полезна.
TDeb 3.0 #3-3 = 90 =
Отладка драйвера устройства
-----------------------------------------------------------------
Опишем теперь, как можно отладить драйвер устройства с по-
мощью утилиты TDREMOTE:
1. При компиляции или ассемблировании драйвера устройства
убедитесь, что вы включаете в него отладочную информацию
(информацию об идентификаторах). Используйте для этого
команды типа TASM /ZI или BCC -v, либо TPC /V.
2. Чтобы включить в него отладочную информацию, скомпонуйте
драйвер устройства с параметром /v.
3. Для перемещения отладочной информации из файла .EXE в
файл .TDS и для преобразования файла .EXE в файл .COM ис-
пользуйте утилиту TDSTRIP:
TDSTRIP -s -c имя_файла
где "имя_файла" - имя отлаживаемого вами драйвера.
4. Скопируйте файл .COM на удаленную систему.
5. Измените файл CONFIG.SYS на удаленной системе, включив в
него строку:
device = имя_файла.COM
6. Убедитесь, что в имени файла указан корректный маршрут.
7. Перезагрузите систему для загрузки драйвера устройства.
8. Запустите утилиту TDDEV, которая сообщит вам об адреса в
памяти на удаленной системе, по которому DOS загрузила
драйвер устройства. Запомните этот адрес. Сегмент, ука-
занный в данном адресе, мы будем обозначать, как Seg.
9. Далее нужно определить объем таблицы идентификаторов в
памяти, которую требуется выделить Турбо отладчику при
Данный размер представляет собой минимальный
его вызове. Для этого запомните размер вашей таблицы
идентификаторов (то есть размер файла .TDS), воспользо-
вавшись командой DOS DIR.
Данный размер представляет собой минимальный объем опера-
тивной памяти, которую нужно выделить при запуске Турбо
отладчика, поскольку, кроме хранящейся там информации,
Турбо отладчик при загрузке таблицы идентификаторов сам
создает несколько таблиц (рабочих и других). Обычно нужно
выделять примерно в 1.5 раза больше памяти, чем занимает
на диске файл .TDS. Турбо отладчик сообщает вам, когда вы
выделяете слишком мало памяти для таблицы идентификато-
TDeb 3.0 #3-3 = 91 =
ров, выводя сообщение: "Not enough memory to load symbol
table" ("Для загрузки таблицы идентификаторов недостаточ-
но памяти"). Обычно это происходит при выполнении команды
File¦Symbol Load (Файл¦Загрузка таблицы идентификаторов).
10. Загрузите на удаленной системе утилиту TDREMOTE.
11. Загрузите Турбо отладчик (используя в случае необходимос-
ти параметры -r, -rp или -rs), не задавая имя файла и вы-
делив память для таблицы идентификаторов с помощью пара-
метра командной строки -sm. В этом параметр указывается
аргумент, определяющий объем (в килобайтах) памяти, кото-
рая будет выделяться для таблицы идентификаторов. Напри-
мер, если вы хотите зарезервировать для таблицы идентифи-
каторов 3К, введите в ответ на подсказку DOS команду:
TD -sm3
Когда вы загружаете Турбо отладчик, не задавайте имени
файла, так как вы отлаживаете то, что уже находится в па-
мяти. В используемом по умолчанию каталоге у вас должны
которым отладчик может обращаться для
присутствовать файла резидентной программы и файл .TDS, к
которым отладчик может обращаться для получения информа-
ции об идентификаторах.
12. Теперь вы можете начать отладку вашего драйвера устройс-
тва, задав точки останова, сделав Турбо отладчик рези-
дентным и выполнив некоторые действия на уровне команд
DOS, которые приведут к срабатыванию точки останова. Это
переводит Турбо отладчик в соответствующее место вашего
исходного кода. Однако, задача отладки может для вас уп-
роститься, если вы сначала вызовите информацию об иденти-
фикаторах, которая имеется в таблице идентификаторов, и
исходный файл.
13. Когда появляется экран Турбо отладчика, очистите индика-
ционное сообщение, нажав клавишу Esc, и загрузите с по-
мощью команды File¦Symbol Load (Файл¦Загрузка таблицы
идентификаторов) таблицу идентификаторов. Если вы получи-
те сообщение, в котором говорится, что для загрузки таб-
лицы идентификаторов не хватает памяти, выйдите из Турбо
отладчика и запустите его снова из командной строки DOS
задав в качестве аргумента параметра -sm большее значе-
ние.
14. Таблица идентификаторов содержит набор идентификаторов,
связанный с ячейками памяти в вашем коде. В качестве пре-
фикса идентификаторов в таблице указывается #имя_файла#,
где "имя_файла" - это имя файла резидентной программы.
Например, если ваш драйвер устройства называется
DRIVER.ASM (исходный файл) и содержит метку Intr, то
ячейку в памяти отмечает идентификатор #DRIVER#INTR.
TDeb 3.0 #3-3 = 92 =
Идентификаторы в таблице идентификаторов представляют со-
один от другого) на корректное
бой смещения ( один от другого) на корректное число байт,
но абсолютный адрес первого идентификатора не определен,
так как DOS может загрузить ваш драйвер устройства в дру-
гое место памяти (а не по тому адресу, как он ассемблиро-
вался). По этой причине вы должны использовать команду,
чтобы явным образом найти первый идентификатор в памяти.
15. Используйте команду File¦Table Relocate (Файл¦Перемещение
таблицы идентификаторов) для помещения первого идентифи-
катора из таблицы идентификаторов в соответствующую ячей-
ку памяти. Таким образом, имеющаяся информация об иденти-
фикаторах будет соответствовать вашему коду (программе).
Для этого в ответ на подсказку Турбо отладчика задайте
адрес сегмента Seg вашей резидентной программы, который
определен на шаге 6.
16. Диcассемблированные из памяти операторы синхронизированы
с информацией из таблицы идентификаторов. В случае нали-
чия исходного файла исходные операторы выводятся на той
же строке, что и информация из таблицы идентификаторов.
17. Задайте в вашем исходной файле точку останова.
18. Выберите команду File¦Resident (Файл¦Резидент), чтобы
сделать резидентным сам отладчик. Это не имеет ничего об-
щего и не нарушит резидентности вашего драйвера: когда он
будет выполняться в Турбо отладчике, он сам станет рези-
дентным при загрузке удаленной системы в результате вы-
полнения файла CONFIG.SYS. Единственная причина того, что
отладчик делается резидентным, заключается в том, что вы
можете перейти обратно в DOS и вызвать ваш драйвер уст-
ройства.
19. Когда вы вернетесь снова к командной строке DOS на уда-
драйвера устройства. Например, выведите информацию
ленной системе, сделайте что-либо для активизации вашего
драйвера устройства. Например, выведите информацию на со-
ответствующее устройство.
20. Когда в вашей программе-драйвере встретится точка остано-
ва, инициализируется Турбо отладчик, а код вашей програм-
мы выведется в соответствующей точке. Теперь вы можете
начать отладку вашей программы. (Кроме того, вы можете
повторно войти в отладчик из DOS, дважды нажав клавиши
Ctrl-Break.)
Завершение сеанса отладки
-----------------------------------------------------------------
Для завершения сеанса отладки выйдите обычным путем из Турбо
отладчика, выбрав команду File¦Quit (Файл¦Выход или нажав клавиши
Alt-X. Если вы отлаживаете резидентную программу, ее можно завер-
шить следующим образом:
TDeb 3.0 #3-3 = 93 =
- Если вы отлаживаете резидентную программу, загруженную
Турбо отладчиком, она будет разгружена автоматически.
- Если вы отлаживаете программу, загруженную непосредственно
из DOS, запустите ее, пока Турбо отладчик не станет снова
резидентным. После того, как Турбо отладчик станет рези-
дентным, дважды нажмите клавиши Ctrl-Break для вывода Тур-
бо отладчика, затем используйте клавиши Alt-X, чтобы выйти
из Турбо отладчика, но оставить программу резидентной.
Причиной выполнения всех этих шагов является то, что выход
из Турбо отладчика во время отладки резидентной программы, кото-
рая не загружалась Турбо отладчиком, оставляет вашу систему в не-
устойчивом состоянии.
TDeb 3.0 #3-3 = 94 =
Приложение A. Параметры командной строки
-----------------------------------------------------------------
Когда вы запускаете Турбо отладчик
Когда вы запускаете Турбо отладчик с помощью командной стро-
ки DOS, его можно одновременно настроить, используя для этого
различные параметры. Общий формат командной строки имеет вид:
TD [параметры] [имя_программы [аргументы_программы] ]
Элементы, заключенные в квадратные скобки, являются необяза-
тельными. Если за параметром указывается минус (-), то данный па-
раметр запрещается (если он разрешен в файле конфигурации).
----------------------------------------------------------------¬
¦ Параметр Функция ¦
+------------T--------------------------------------------------+
¦-cимя_файла ¦ Файл конфигурации, активизирующийся при загрузке.¦
¦ ¦ ¦
¦-do ¦ Другой дисплей. ¦
¦ ¦ ¦
¦-dp ¦ Переключение страниц. ¦
¦ ¦ ¦
¦-ds ¦ Переключение на содержимое экрана пользователя. ¦
¦ ¦ ¦
¦-h ¦ Вывод справочного экрана. ¦
¦ ¦ ¦
¦-? ¦ Вывод справочного экрана. ¦
¦ ¦ ¦
¦-i ¦ Обработка переключения идентификатора процесса. ¦
¦ ¦ ¦
¦-k ¦ Разрешает запись нажатий клавиш. ¦
¦ ¦ ¦
¦-l ¦ Запуск кода инициализации Ассемблера. ¦
¦ ¦ ¦
Отладка на удаленных системах, COM1
¦-mN ¦ Размер динамически распределяемой области памяти.¦
¦ ¦ ¦
¦-p ¦ Разрешает работать с "мышью". ¦
¦ ¦ ¦
¦-r ¦ Отладка на удаленных системах, COM1 (быстр.). ¦
¦ ¦ ¦
¦-rnлок;удал ¦ Разрешает сетевую отладку. ¦
¦ ¦ ¦
¦-rpN ¦ Порт COM для удаленной связи. ¦
¦ ¦ ¦
¦-rsN ¦ Скорость связи: 1 - медленная, 2 - средняя, 3 - ¦
¦ ¦ быстрая. ¦
¦ ¦ ¦
¦-sdкаталог ¦ Каталог исходного файла. ¦
¦ ¦ ¦
¦-sc ¦ Отмена проверки на строчные/прописные буквы. ¦
¦ ¦ ¦
¦-smN ¦ Задает объем памяти для таблицы идентификаторов ¦
¦ ¦ (в килобайтах). ¦
TDeb 3.0 #3-3 = 95 =
¦ ¦ ¦
¦-vn ¦ Запрещение режима 43/50 строк. ¦
¦ ¦ ¦
¦-vg ¦ Полное сохранение графики. ¦
¦ ¦ ¦
¦-vp ¦ Сохранение палитры EGA. ¦
¦ ¦ ¦
¦-yN ¦ Задает размер оверлейного буфера. ¦
Данное приложение предназначено для опытных
¦ ¦ ¦
¦-yeN ¦ Устанавливает оверлейную область EMS в значение ¦
¦ ¦ N (N страниц по 16 килобайт). ¦
L------------+---------------------------------------------------
TDeb 3.0 #3-3 = 96 =
Приложение B. Технические замечания
-----------------------------------------------------------------
Данное приложение предназначено для опытных пользователей,
которые хотят понять некоторые технические детали, лежащие в ос-
нове операций Турбо отладчика. Не отчаивайтесь, если изложенный
здесь материал сначала покажется вам совершенно непонятным. Чтобы
успешно пользоваться отладчиком, разбираться во всем этом не обя-
зательно.
Часть тем, которые освещаются в данном приложении, позволят
вам понять, каким образом отладчик взаимодействует с операционной
системой DOS, аппаратным обеспечением, и вашей программой. Это
поможет вам определить, как может различаться поведение вашей
программы во время отладки и во время выполнения.
Вы узнаете также, как легко можно вызвать сбой системы и как
можно этого избежать.
Измененный адрес загрузки и свободная память
-----------------------------------------------------------------
Когда Турбо отладчик загружает вашу программу, она размеща-
ется в памяти после отладчика. Из этого вытекает два важных ре-
зультата: ваша программа загружается в сегмент с более старшим
адресом, и у нее будет меньше свободной памяти. Учитывая измене-
ния объема свободной памяти, может оказаться трудно воспроизвести
ошибки из-за ее распределения.
Если вы используете компьютер, основанный на процессоре 386,
то для устранения этих проблем можно использовать программу вир-
Так как Турбо отладчик может
туальной отладки TD386 (об этом рассказывается в Главе 15).
Сбой системы
-----------------------------------------------------------------
Так как Турбо отладчик может может выполнять в вашей системе
чтение и запись в память по любому адресу, непреднамеренно моди-
фицировав определенные ячейки памяти (например, внутренние облас-
ти DOS или таблицу прерываний, которая начинается с ячейки с ну-
левым адресом), вы можете вызвать сбой системы.
Например, изменение аппаратного вектора прерывания от тайме-
ра в ячейке 0000h:0020h почти всегда приводит к проблемам.
TDeb 3.0 #3-3 = 97 =
Трассировка в DOS и переключение идентификатора процесса
-----------------------------------------------------------------
Турбо отладчик отслеживает выполняющийся процесс (это может
быть сам отладчик или ваша программа), поэтому он может открывать
и закрывать файлы, не взаимодействуя с описателями файлов вашей
программы. Такое переключение осуществляется с помощью функцио-
нального вызова DOS. Переключение выполняется каждый раз, когда
ваша программа запускается из отладчика, или когда управление из
нее опять передается отладчику. Поскольку операционная система
DOS не реентерабельна, то при задании точек останова или трасси-
ровке внутри DOS вы можете столкнуться с проблемами.
Если вы хотите углубиться в DOS, то для запрещения переклю-
чения идентификатора процесса используйте параметр командной
строки -i-. Однако при этом ваша программа будет использовать
описатели файлов совместно с Турбо отладчиком, что может привести
к тому, что программа или отладчик исчерпают их число.
Использование сопроцессора 8087/80287 и эмулятора
-----------------------------------------------------------------
Отладчик не использует ни арифметический
Отладчик не использует ни арифметический сопроцессор, ни
программный эмулятор, предоставляя возможность их свободного ис-
пользования вашей программе. Вы должны учитывать различия между
автономным выполнением программы, использующей арифметические
операции с плавающей точкой, и выполнением ее под управлением от-
ладчика.
Прерывания, используемые Турбо отладчиком
-----------------------------------------------------------------
Чтобы обеспечить возможность отладки вашей программы, Турбо
отладчик перехватывает некоторые векторы прерываний. Следующие
описания позволят определить, возможны ли взаимодействия между
вашей программой и Турбо отладчиком.
Прерывание 1/Прерывание3
-----------------------------------------------------------------
Отладчик использует эти прерывания (INT1/INT2) для обработки
точек останова и пошагового выполнения инструкций. Если данные
прерывания модифицируются вашей программой, то отладчик может не
получить управления на следующей точке останова. Обычно приклад-
ные программы не используют эти прерывания, так как они резерви-
руются для других программ (таких, как отладчики), которые должны
управлять их выполнением.
Прерывание 2
-----------------------------------------------------------------
Многие аппаратные отладчики используют данное прерывание
(INT2) для сообщения о том, что удовлетворено указанное условие.
TDeb 3.0 #3-3 = 98 =
Если ваша программа работает с этим прерыванием, то такие аппа-
ратные платы и соответствующие аппаратные драйверы не смогут пра-
вильно работать. Если вам необходимо использовать это прерывание,
и вы не хотите его обслуживать, нужно организовать цепочку с пре-
Это аппаратное прерывание от клавиатуры
дыдущим его пользователем.
Прерывание 9
-----------------------------------------------------------------
Это аппаратное прерывание от клавиатуры (INT9), которое ис-
пользуется для отслеживания кодов нажатий и освобождений клавиш.
При выполнении программы пользователя отладчик ведет список (це-
почку) этих прерываний, поэтому от может получить управление, ес-
ли программа входит в цикл. При каждом запуске вашей программы
отладчик вновь устанавливает этот вектор, что позволяет программе
для продолжения правильной работы модифицировать данное прерыва-
ние.
Отладка при использовании прерываний INT3 и INT1
-----------------------------------------------------------------
Если вы хотите отладить программу, которая использует эти
прерывания, версия отлаживаемой вами программы должна загружать
эти векторы прерываний только в случае абсолютной необходимости и
восстанавливать их содержимое, как только она закончит работу с
ними. Этот метод позволяет минимизировать объем кода, который
нельзя отлаживать. Когда ваша программа загрузит данные векторы
прерываний, то для выполнения ее кода отладчик использовать нель-
зя.
Сохранение содержимого и переключение режима экрана
-----------------------------------------------------------------
Обычно отладчик пытается при выполнении участка вашей прог-
раммы сохранять и восстанавливать режим экрана программы. Если
для изменения режима экрана вы используете только стандартные об-
ращения к базовой системе ввода-вывода, то все будет нормально.
Если вы работаете с регистрами контроллера дисплея непосредствен-
но, то отладчик может нарушить установленные вами значения.
TDeb 3.0 #3-3 = 99 =
Потребности в памяти
При первоначальном запуске отладчика DOS
-----------------------------------------------------------------
При первоначальном запуске отладчика DOS загружает его в
первую свободную область памяти, расположенную выше DOS и всеми
резидентными программами. После этого отладчик над программным
стоком выделяет рабочий стек и динамически распределяемую область
памяти. Далее в памяти следует таблица идентификаторов вашей
программы, а за ней - сама отлаживаемая отлаживаемая программа.
Когда вы возвращаетесь в DOS, отладчик освобождает память,
используемую для таблицы идентификаторов и отлаживаемой програм-
мы. Если ваша программа с помощью функции выделения памяти 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
¦ 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 ¦
Отладчик TDW поддерживает все мнемоники
¦ N LGDT** RCL XLAT ¦
¦ XOR ¦
¦ ¦
¦** - доступны только при работе с процессорами 186 и 286 ¦
¦ ¦
¦ * - доступны только при работе с процессором 286 ¦
L----------------------------------------------------------------
Отладчик TDW поддерживает все мнемоники инструкций и регистры
процессора 80386 и сопроцессора 80387:
TDeb 3.0 #3-3 = 102 =
Мнемонические обозначения команд процессора 80386
Таблица C.2
----------------------------------------------------------------¬
¦ BSF LSS SETG SETS ¦
¦ BSR MOVSX SETL SHLD ¦
¦ BT MOVZX SETLE SHRD ¦
¦ BTC POPAD SETNB CMPSD¦
¦ BTR POPFD SETNE STOSD¦
¦ BTS PUSHAD SETNL LODSD¦
¦ CDQ PUSHFD SETNO MOVSD¦
¦ CWDE SETA SETNP SCASD¦
¦ IRETD SETB SETNS INSD ¦
¦ LFS SETBE SETO OUTSD¦
¦ LGS SETE SETP JECXZ¦
L----------------------------------------------------------------
Мнемонические обозначения команд процессора 80486 Таблица C.3
----------------------------------------------------------------¬
¦ BSWAP INVLPG ¦
Мнемонические обозначения команд сопроцессора
¦ CMPXCHG WBPINVD ¦
¦ INVD XADD ¦
L----------------------------------------------------------------
Регистры процессора 80386 Таблица C.4
----------------------------------------------------------------¬
¦ EAX EDI ¦
¦ EBX EBP ¦
¦ ECX ESP ¦
¦ EDX FS ¦
¦ ESI GS ¦
L----------------------------------------------------------------
Регистры центрального процессора Таблица C.5
----------------------------------------------------------------¬
¦Байтовые регистры AH, AL, BH, BL, CH, CL, DH, DL ¦
¦Регистры размером в слово AX, BX, CX, DX, SI, DI, SP, BP ¦
¦Сегментные регистры CS, DS, ES, SS ¦
¦Регистры с плавающей ST, ST(0), ST(1), ST(2), ST(3), ¦
¦точкой ST(4), ST(5), ST(6), ST(7) ¦
L----------------------------------------------------------------
Специальные зарезервированные слова Таблица C.6
----------------------------------------------------------------¬
¦ WORD PTR TBYTE PTR ¦
¦ BYTE PTR NEAR ¦
¦ DWORD PTR FAR ¦
¦ QWORD PTR SHORT ¦
L----------------------------------------------------------------
TDeb 3.0 #3-3 = 103 =
Мнемонические обозначения команд сопроцессора 8087/80287
в качестве операнда может использоваться
Таблица C.7
----------------------------------------------------------------¬
¦ FABS FIADD FLDL2E FST ¦
¦ FADD FICOM FLDL2T FSTCW ¦
¦ FADDP FICOMP FLDPI FSTENV ¦
¦ FBLD FIDIV FLDZ FSTP ¦
¦ FBSTP FIDIVR FLD1 FSTSW* ¦
¦ FCHS FILD FMUL FSUB ¦
¦ FCLEX FIMUL FMULP FSUBP ¦
¦ FCOM FINCSTP FNOP FSUBR ¦
¦ FCOMP FINIT FNSTS** FSUBRP ¦
¦ FDECSTP FISTP FPREM FWAIT ¦
¦ FDISI FISUB FPTAN FXAM ¦
¦ FDIV FISUBR FRNDINT FXCH ¦
¦ FDIVP FLD FRSTOR FXTRACT ¦
¦ FDIVR FLDCW FSAVE FYL2X ¦
¦ FDIVRP FLDENV FSCALE FYL2XP1 ¦
¦ FENI FLDLG2 FSETPM* F2XM1 ¦
¦ FFREE FLDLN2 FSQRT ¦
¦ ¦
¦* - доступны только при работе с числовым сопроцессором 287 ¦
¦ ¦
¦** - при работе с сопроцессором 80287 в командах fstsw и ¦
¦ fnstsw кроме обычных операндов, расположенных в памяти, ¦
¦ в качестве операнда может использоваться регистр AX. ¦
L----------------------------------------------------------------
Мнемонические обозначения команд сопроцессора 80387 Таблица C.8
----------------------------------------------------------------¬
нять также при запуске Турбо
¦ FCOS FUCOM ¦
¦ FSIN FUCOMP ¦
¦ FPREM1 FUCOMPP ¦
¦ FSINCOS ¦
L----------------------------------------------------------------
TDeb 3.0 #3-3 = 104 =
Приложение D. Настройка Турбо отладчика
-----------------------------------------------------------------
Турбо отладчик будет готов к работе, как только вы получите
рабочую копию дистрибутивного диска. Однако, вы можете изменить
многие используемые по умолчанию параметры, запустив программу
(утилиту) установки TDINST.EXE. Некоторые параметры можно изме-
нять также при запуске Турбо отладчика из командной строки DOS (с
помощью параметров командной строки). При частом использовании
для работы с Турбо отладчиком одних и тех же параметров вы можете
зафиксировать их с помощью программы установки.
Программа установки позволяет вам устанавливать следующие
элементы:
- цвета окон, диалоговых окон и меню;
- параметры вывода: начальный экран, режим переключения эк-
ранов, формат вывода целых чисел, длину списка регистра-
ции, размер табуляции, максимальный размер окна Watches
(Просмотр), контроль за возникновением помех на экране
("снег"), режим 45/50 строк и сохранение графики, обновле-
ние экрана пользователя и длину списка регистрации;
- команду запуска редактора и каталоги для поиска исходных
файлов, а также справочных файлов Турбо отладчика и файлов
конфигурации;
- параметры клавиатуры: клавишу прерывания программы и сок-
ращения для клавиши Ctrl;
при подсказке, необходимость нажатия клавиши
- параметры ввода пользователя подсказки: звуковой сигнал
при подсказке, необходимость нажатия клавиши Esc для сбро-
са ошибки и длину протокола команд, возможность использо-
вания "мыши" и сокращений с клавишей Ctrl;
- параметры отладки на уровне исходного кода: параметры язы-
ка, различимость регистра символов и (для отладки в
Windopws) поддержку для отладки программ ObjectWindows
Windows Message (Сообщения Windows);
- прочие параметры: использование расширенной памяти (EMS)
для таблицы идентификаторов, перехвата прерываний NMI, об-
работку DOS переключения идентификатора, удаленной отлад-
ки, область свопинга командного процессора DOC, размер па-
мяти для таблицы идентификаторов, порядок сортировки в со-
ответствии с различными национальными алфавитами.
Запуск программы TDINST
-----------------------------------------------------------------
Для запуска программы установки TDINST введите TDINST в от-
вет на подсказку DOS. После этого программа установки выводит ос-
TDeb 3.0 #3-3 = 105 =
новное меню. Вы можете нажать подсвеченную первую букву элемента
меню или использовать для перемещения к нужному элементу клавиши
управления курсором (стрелки) и нажать клавишу Enter. Например,
для изменения параметров экрана нажмите D. Элементы других меню
программы установки выбираются точно также. Для возврата в преды-
дущее меню нажмите клавишу Esc. Чтобы вернуться в основное меню
вам может потребоваться нажать Esc несколько раз.
--------------------------¬
Цвета ¦ Colors > ¦
Дисплей ¦ Display... ¦
В TDINST для задания файла
Параметры ¦ Options > ¦
Режим дисплея ¦ Mode for display > ¦
Сохранение ¦ Save > ¦
Выход ¦ Quit ¦
L--------------------------
Параметры командной строки TDWINST
-----------------------------------------------------------------
В TDINST для задания файла конфигурации, настройки конфигу-
рации TDW, включения или выключения поддержки "мыши" вы можете
использовать параметры командной строки. Можно также задавать,
настройку конфигурации какого выполняемого файла вы хотите выпол-
нять.
Команда вызова программы TDINST имеет следующий синтаксис:
tdinst [параметры] [выполняемый_файл]
Например для настройки конфигурации TD286.EXE из каталога
программы можно ввести:
tdinst td286.exe
Параметр -C
-----------------------------------------------------------------
Чтобы задать при запуске TDINST файл конфигурации, исполь-
зуйте параметр -c. При этом используется следующий синтаксис:
tdinst -cимя_файла
С помощью данного параметра вы можете модифицировать текущий
существующий файл конфигурации или создать новый. Если параметр
-c не указывается, то вы можете задать имя файла конфигурации при
его сохранении. По умолчанию файл конфигурации Турбо отладчика
называется TDCONFIG.TD. Файл конфигурации TDW называется
TDCONFIG.TDW. (Для создания файла конфигурации, совместимого с
отладчиком TDW, нужно запускать программу TDINST с параметрами -c
и -w.)
TDeb 3.0 #3-3 = 106 =
Параметр -W
-----------------------------------------------------------------
Для настройки конфигурации TDW или
Для настройки конфигурации TDW или файла конфигурации TDW
запустите TDINST с параметром -w. В этой версии TDINST имеется
меньше параметров, так как TDW не поддерживает всех средство TD
(например, клавиатурные макрокоманды). Если параметр недоступен,
вы не сможете его выбирать.
Параметр -P
-----------------------------------------------------------------
Этот параметр вы можете использовать для разрешения или зап-
рещения поддержки "мыши". Чтобы запретить поддержку "мыши", ис-
пользуйте после параметра дефис:
TDINST -P-
Установка цветов экрана
-----------------------------------------------------------------
Для вывода меню выбора цвета выберите команду Colors (Цвета)
основного меню. После этого вам будет предоставлена возможность
выбора из 2 наборов цветов: настраиваемый и используемый по умол-
чанию набор номер 2.
Настройка цветов экрана
-----------------------------------------------------------------
Если вы выбираете команду Customize (Настроить), то выводит-
ся третье меню, параметры которого позволяют настраивать окна,
диалоговые окна, меню и экраны.
TDeb 3.0 #3-3 = 107 =
Окна
-----------------------------------------------------------------
Для настройки окон выберите команду меню Windows (Окна). При
этом будет открыто четвертое меню, из которого вы сможете выбрать
тип настраиваемого окна: Text (текстовое), Data (окно данных),
Low Level (нижний уровень, например, окно CPU), и Other (прочие,
например, окно Breakpoints). Выбор одного из этих параметров при-
водит к выводу еще одного меню со списком элементов окон, а также
с парой окон-примеров (активным и неактивным), по которым вы мо-
Настройка цветов окон
жете проверить сочетание цветов. Экран выглядит следующим обра-
зом:
----------------------------------------------------------------¬
¦Turbo Debugger Installation V3.0 1991 Borland Int. Corp. MENU¦
¦---------------¬-----------------------------------------------+
¦¦-Colors------>¦-----------------------------------------------¦
¦¦--------------------¬---------------[*]-----Text Window-----¬-¦
¦¦¦-Customize-------->¦--------------¦Normal text ^-¦
¦¦¦ -------------¬set ¦--------------¦Selected text --¦
¦L¦ ¦-Windows--->¦set ¦--------------¦Breakpoint --¦
¦-L-¦ -----------------¬-------------¦ v-¦
¦---L-¦-Text---------->¦-------------L<---------------------->--¦
¦-----¦ ---------------------------¬-----Another Window-------¬-¦
¦-----¦ ¦-Window-Background--------¦-¦ ¦-¦
¦-----L-¦ Selected text background ¦-¦ ¦-¦
¦------ ¦ Breakpoint ¦-¦ ¦-¦
¦------ +--------------------------+-¦ ¦-¦
¦------ ¦ Standord foreground ¦-¦ ¦-¦
¦------ ¦ Selected text foreground ¦-L--------------------------¦
¦------ ¦ Current window border ¦----------------------------¦
¦------ ¦ Non-current border ¦----------------------------¦
¦------ ¦ Button ¦----------------------------¦
¦------ ¦ Scroll bar ¦----------------------------¦
¦------ L-------------------------------------------------------¦
¦---------------------------------------------------------------¦
¦ Alt: X - exit-------------------------------------------------¦
L----------------------------------------------------------------
Рис. D.1. Настройка цветов окон