 |
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
(ФайліРезидент) также очень полезна.
|