скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Руководство по Soft-ICE (DOS) - 5


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

Нажмите: ALT D

Окно Soft-ICE вернулось. Переместите окно (с использованием CTRL и клавиш стрелок), пока не будет виден экран регистров DEBUG. Настало время установить нашу первую точку останова.

Введите:


BPR сег. кода:0 сег. кода:25 W

Сег. кода - значение в регистре CS, показываемое при помощи команды R в DEBUG.

Команда BPR устанавливает точку останова на диапазон памяти. Длина сегмента кода Jed'а - 25H байт, так что указанный диапазон памяти продолжается от начала его кода до конца. W сообщает Soft-ICE останавливаться при записи в этот диапазон. Мы хотим перехватить любую неожиданную запись в код Jed'а.

Введите:


BL

Команда BL покажет все точки останова. Вывод после команды BL выглядит следующим образом:


0) BPR сег. кода:0000 сег. кода:0025 W C = 01

0 - идентификатор этой точки останова. Диапазон и W показаны, так как были введены, а счетчик (так как он не был определен) по умолчанию равен 1.

Теперь настал момент истины. Нажмите ALT D.

Окно снова исчезает. Чтобы запустить SAMPLE из DEBUG, введите:


G

Нажмите "пробел". Пока все Ok. Теперь нажмите непробельную клавишу.

Наша точка останова только что пробудила DEBUG. Выведены регистры и одна дизассемблированная инструкция.

Введите:


U cs:адрес

Адрес - значение регистра IP минус 10 (шестнадцатеричное). Так как DEBUG довольно примитивен, значение регистра IP минус 10 должно быть рассчитано вручную. Указатель инструкции указывает на инструкцию, следующую за той, которая активизировала точку останова. Возвратом на десять (шестнадцатеричных) байт мы синхронизируем DEBUG с нужной нам инструкцией.

Инструкция по смещению 3BH:


CS:
MOV BYTE PTR [13],0

Jed говорит, "Вот оно! Я так и знал, что проблема была во вспомогательных подпрограммах Jake'а! Инструкция выходящая за его сегмент кода записывает нулевой байт прямо в мой код! Кто мог об этом знать!"

Введите:


U 0

Местоположение 13H должно являться смещением инструкции условного перехода. Относительное смещение условного перехода устанавливается в ноль. Если вы являетесь гуру в 8086, вы, очевидно, знаете, что JE НИКОГДА не сработает, если относительное смещение - ноль. Какая тонкая ОШИБКА!

Теперь давайте разберемся, как эта проблема была бы решена при использовании Soft-ICE как автономного отладчика. Но сначала мы должны выйти из DEBUG.

Перед выходом из отладчика будет неплохо дезактивировать все точки останова, если ACTION не установлена на HERE. Если вы это не сделаете, то когда выполнится останов и ACTION попробует вернуться к отладчику, который не загружен, результаты будут непредсказуемы. Мы изменили ACTION на INT3, следовательно, мы должны отменить точку останова.

Для вызова окна введите:


ALT D

Просмотрите список точек останова, введя:


BL

Обратите внимание, что строка описания точки останова выделена. Выделенная точка останова - последняя выполненная точки останова.

Заметьте, что номер точки останова - 0. Для дезактивации точки останова с номером ноль, введите:


BD 0

Снова просмотрите список точек останова, введя:


BL

Звездочка (*) после номера точки останова покажет, что точка останова неактивна.

Чтобы удалить точку останова, введите:


BC 0

Снова введите BL.

Обратите внимание, что не выведено ни одной строки с точками останова.

Выйдите из Soft-ICE, а потом из отладчика, введя:


X
Q

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

Для подготовки Soft-ICE производить отладку на уровне исходного текста, он должен быть установлен в вашем файле CONFIG.SYS и часть расширенной памяти должна быть занята для символов и файлов с исходными текстами. Soft-ICE может использоваться как отладчик на уровне исходного текста, только если в вашей системе есть расширенная память. Если у вас нет

расширенной памяти вы все равно можете прочитать остаток обучающей части, чтобы увидеть возможности Soft-ICE с расширенной памятью. Если вы не загрузили S-ICE.EXE в ваш файл CONFIG.SYS с памятью, зарезервированной для символов, сделайте это сейчас.

Для отладки программы-примера Soft-ICE как автономным отладчиком мы должны использовать загрузчик программ Soft-ICE (LDR.EXE). Чтобы загрузить пример программы (SAMPLE.EXE), файл символов (SAMPLE.SYM) и файл с исходным текстом (SAMPLE.ASM), введите:


LDR SAMPLE

Теперь вы - в Soft-ICE с SAMPLE.EXE, загруженным в память. Заметьте что Soft-ICE занимает весь экран. Soft-ICE переключается в полноэкранный режим всякий раз, когда загружается программа. Исходный текст из SAMPLE.ASM должен быть виден в окне кода. Кроме того, видимы окно регистров и окно данных.

Выполните одну инструкцию, нажав F10.

Обратите внимание, что видео курсор перемещается на следующую инструкцию, которая будет выполнена на следующем шаге программы.

Нажмите F6.

Это переместит курсор в окно кода. Теперь поэкспериментируйте с клавишами , , PageUp и PageDn, для перемещения курсора и прокрутки исходного файла. Переместите курсор до 42 строки с клавишей .

Нажмите F9.

Мы только что установили точку останова при выполнении на строку 42. Строка должна выделиться, показывая, что точка останова установлена.

Введите:


BL

Это покажет точку останова, которую мы только что установили. Теперь нажмите ALT D.

Произойдет выход из Soft-ICE, выполнение программы-примера, пока не произойдет останов в строке 42. Soft-ICE должен немедленно восстановиться, с выделенным видео курсором на строке 42.

Снова нажмите F6.

Это вернет курсор в командное окно. Теперь введите:


BC *

Это уничтожит все точки останова (хотя должна быть установлена только одна). Теперь выйдете из Soft-ICE, нажав ALT D.

Вы вернулись к программе-примеру. Нажмите несколько клавиш, чтобы удостовериться, что она все еще не работает. Теперь вызовите Soft-ICE при помощи ALT D.

Так как ошибка уже произошла, мы хотим повторно начать программу. Введите:


EXIT RD

Эта команда принудительно завершает программу-пример. R сообщает Soft-ICE о необходимости восстановить векторы прерываний в состояние, в котором они были когда была загружена LDR'ом программа-пример. D сообщает Soft-ICE о необходимости удалять все активные точки останова. R и D необязательны в этом случае, но неплохо будет выработать привычку к их указанию при выходе из программы, загруженной LDR.EXE.

Теперь вы вернулись к командной строке DOS. Загрузите программу, снова введя:


LDR SAMPLE.EXE

Заметьте, что сейчас было введено расширение .EXE. Когда указано расширение, Soft-ICE не пытается загружать файл символов или файл с исходным текстом. В нашем случае файлы символов и исходного текста уже - в памяти.

Введите:


SYM

Будут выведены все публичные символы программы-примера. Нажмите Esc, чтобы вернуться к командной строке.

Теперь установим точку останова на диапазон, такую же, как мы устанавливали когда использовали Soft-ICE как дополнение к отладчику. На этот раз мы будем использовать символы, чтобы установить точку останова. Введите:


BPR START .82 W

Это установит точку останова на диапазон на наш сегмент кода от символа START до 82 строки исходного файла.

Введите:


BL

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

Нажмите ALT D.

Нажмите непробельную клавишу.

Мы вернулись в Soft-ICE. Заметьте что текущая инструкция (строка с инвертированным видео курсором) - инструкция, идущая после той, что вызвала останов.

Чтобы увидеть фактический код нажмите клавишу F3.

Это переводит Soft-ICE в смешанный режим. Заметьте, что видео курсор покрывает 2 строки. Это - фактическая строка кода и строка кода из исходного файла с текущей инструкцией.

Еще раз нажмите клавишу F3.

Сейчас мы - в режиме кода. Никакие исходные строки не видны. Инструкция, находящаяся выше инвертированного видео курсора - инструкция, вызвавшая останов на диапазон.

Нажмите клавишу F3 еще раз, чтобы вернуться к режиму исходного текста.

Теперь исправим ошибку в программе-примере. Выйдите из программы и вернитесь в командную строку DOS, введя:


EXIT RD

Загрузите программу снова, введя:


LDR SAMPLE.EXE

Установите окно кода в режим кода, дважды нажав клавишу F3. дизассемблируйте неправильную подпрограмму, введя:


U not_space






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook