 |
Tail^.Parm^
Это позволяет отслеживать строковые данные, хранящиеся в
последнем узле списка. Конечно, до инициализации на строке 207
это значение будет содержать "мусор".
Вместо того, чтобы выполнять программу по шагам, просто сле-
дите за окном Watch в конце каждой итерации. Переместите курсор
на строку 208 и нажмите клавишу F2, чтобы установить там точку
останова. Теперь, чтобы выполнить программу до точки останова,
нажмите клавишу F9. Если вы используете DOS версии 3.х, то в окне
просмотра вы увидите полный маршрут доступа к TPDEMOB.EXE (при
работе под управлением DOS 2.x вы увидите пустую строку, в этом
случае просто нажмите клавишу F9 и работайте дальше). Строка дан-
ных выглядит, как и требуется.
Нажмите клавишу F9, чтобы выполнить цикл еще раз. Данные
опять выглядят правильно. Теперь вы знаете, что строка копируется
в динамически распределяемую область памяти правильно. Можно ис-
пользовать окно Inspector (Проверка) и посмотреть, не повреждены
ли еще данные. Переместите курсор к Head и нажмите клавиши
Atl-F10 I.
TDeb 3.0 #2-3 = 161 =
Нажав клавишу Enter, посмотрите на значение, на которое ссы-
лается Parm. Вы смотрите на первый элемент списка, и его строко-
вые данные уже повреждены. Если вы нажмете клавишу Esc, стрелку
вниз, а затем снова клавишу Enter, то вы откроете окно Inspector
(Проверка) для второго узла (элемента) списка. Нажмите клавишу
Enter, чтобы проверить строковые данные. Они не запорчены, факти-
чески, на тот же узел ссылается указатель Tail. Очевидно, что-то
не так с концом строковых данных.
Следите за окном Watch, когда вы используете клавишу F7 для
выполнения цикла. На строке 199 содержится вызов процедуры
GetMem, перед этим вызовом Tail^.Parm^ равно первому символу. Не-
посредственно после вызова GetMem последний символ в Tail^.Parm^
уничтожается.
Что происходит? Для каждого параметра командной строки в
цикле for сначала выделяется запись, затем строковые данные, за-
тем следующая запись и т.д. При вызове GetMem на строке 198 долж-
но выделяться достаточно памяти для строки, плюс байта длины, но,
как можно заметить, к Length(s) не прибавляется 1. Хотя на строке
199 строка успешно копируется, для нее на самом деле выделено на
1 байт меньше, чем она использует. Таким образом, первый символ
строки перекрывается первым байтом следующей записи, выделенной
при обращении к процедуре New(Temp). Последний параметр остается
незапорченным, так как на ним не следует другая ParmRec.
Это все известные нам ошибки в программе. Возможно при ее
выполнении вы найдете какие-то еще. Вы можете исправить эти ошиб-
ки, а затем перекомпилировать программу (для удобства они отмеча-
ются двумя звездочками (**)), или запустить TPDEMO.EXE - версию
программу, о которой рассказывалось в Главе 3 и в которой ошибок
нет.
TDeb 3.0 #2-3 = 162 =
Глава 15. Виртуальная отладка с использованием процессора 80386
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Турбо отладчик позволяет вам полностью использовать произво-
дительность систем, основанных на процессоре 80386. Виртуальная
отладка позволяет отлаживаемым программам полностью использовать
адресное пространство, превышающее 640К (как при отсутствии в па-
мяти отладчика), поскольку Турбо отладчик загружается в расширен-
ную память выше 1Мб..
Отладка выполняется так же, как при обычном использовании
Турбо отладчика, только когда загружается драйвер TDH386, ваша
программа загружается и выполняется с того же адреса, как и при
обычном выполнении (без отладчика). Это может оказаться очень по-
лезным как при отладке больших программ, так и при обнаружении
ошибок, которые исчезают, если программа загружается в старшие
адреса памяти.
Виртуальная отладка также позволяет вам наблюдать за чтением
и записью в произвольные ячейки памяти или ввода-вывода, не утра-
чивая при этом (или почти не утрачивая) скорости выполнения. Это
без дополнительной оплаты позволяет использовать все мощные
средства аппаратной отладки.
Если у вас имеется процессор 80286, то с помощью отладчика,
работающего в защищенном режиме (TD286) вы можете получить в свое
распоряжение больше памяти, чем при обычной работе с отладчиком.
Более подробно об этом рассказывается в Главе 16.
Аппаратные средства, необходимые для виртуальной отладки
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Чтобы можно было использовать виртуальный отладчик, в вашем
компьютере должен применяться процессор 80386. Вы должны распола-
гать также расширенной (extended) памятью объемом не менее 640К.
Если вы используете расширенную память для псевдодисков, буферов
и т.д., то может потребоваться создание специальных версий файлов
CONFIG.SYS или AUTOEXEC.BAT, которые нужно будет использовать при
виртуальной отладке.
Установка драйвера устройства для виртуального отладчика
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Перед запуском виртуального отладчика нужно убедиться, что
вашем файле CONFIG.SYS установлен драйвер устройства. Установить
его можно, включив в данный файл следующую строку:
DEVICE = TDH386.SYS
Если драйвер TDH386.SYS содержится у вас не в корневом ката-
логе, а в другом месте, то нужно указать маршрут доступа.
Обычно виртуальный отладчик позволяет вам использовать до
TDeb 3.0 #2-3 = 163 =
256 байт строк, задающих параметры операционной среды DOS. Если
этого недостаточно, или вам не нужен такой объем и вы хотите сэ-
кономить возможно больше памяти, используйте в файле CONFIG.SYS
параметр -e, который задает число байт операционной среды. Напри-
мер:
DEVICE = TDH386.SYS -e2000
резервирует 2000 байт для переменных операционной среды DOS.
Запуск виртуального отладчика
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Запускается виртуальный отладчик точно также, как обычный
сеанс работы с Турбо отладчиком командой:
TD386 [параметры] [программа [параметры_программы]]
Другими словами, вместо TD указывается просто TD386. При
этом будет выполняться поиск выполняемой программы Турбо отладчи-
ка и загрузка ее в расширенную память.
Если у вас есть другие программы или драйверы устройств, ис-
пользующие расширенную память (псевдодиски, буферы и др.), вы
должны указать TD386, сколько памяти занимают эти программы. Это
можно сделать с помощью параметра командной строки -e, за которым
указывается объем (в килобайтах) расширенной памяти, используемой
другими программами, например:
TD386 -e512 myprog
Эта командная строка сообщает TD386, что вы хотите зарезер-
вировать для других программ первые 512К расширенной памяти.
Обычно, если в вашей системе поддерживается стандарт XMS,
вовсе не обязательно сообщать TD386, сколько памяти нужно оста-
вить для программ в расширенной памяти - программы уже передали
эту информацию TD386. Параметр -e нужно использовать только с
программами (такими, как VDISK), которые не взаимодействуют со
стандартом XMS.
Поскольку вы, вероятно, всегда резервируете один и тот же
объем расширенной памяти, TD386 дает вам способ постоянного зада-
ния объема резервируемой памяти. Чтобы сообщить, что вы хотите
постоянно установить значение параметра -e в выполняемом файле
TD386, используйте параметр -w.
Вам будет выведена подсказка, в ответ на которую нужно ввес-
ти имя выполняемой программы. Если вы работаете в DOS версии 3.0
или старше, в подсказке будет указываться маршрут доступа к ката-
логу и имя файла, из которого запущен TD386. Вы можете использо-
вать это имя, нажав клавишу Enter, или ввести имя нового выполня-
емого файла. Файл с этим именем должен существовать и
TDeb 3.0 #2-3 = 164 =
представлять собой копию программы TD386.
Если вы работаете под управлением DOS версии 2.х, вам при-
дется указать полное имя выполняемой программы TD386 (с маршру-
том).
Перечислим параметры командной строки TD386.EXE:
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
-?, -h Выводит справочную информацию по TD386.
-b Позволяет вам прерывать выполнение программы с помощью
клавиш Ctrl-Break, даже когда запрещены прерывания.
-e#### Задает, сколько килобайт расширенной памяти используют-
ся другими программами или отлаживаемой вами программой
(данный параметр указывать не требуется, если ваша систе-
ма поддерживает стандарт XMS).
-w Модифицирует TD386.EXE новым используемым по умолчанию
значением -e или -f.
-f#### Разрешает эмуляцию EMS с помощью страничного обмена (в
расширенной памяти) и устанавливает сегмент границы стра-
ницы в значение #### (шестнадцатиричное). Последние три
|