ГЛАВА 8  ПРОВЕРКА И МОДИФИКАЦИЯ ФАЙЛОВ

     Turbo Debugger рассматривает дисковые файлы как естественное
дополнение к отлаживаемой программе.  Программист может проверять
и модифицировать любой дисковый файл, просматривая его содержимое
либо в текстовом (ASCII), либо в шестнадцатиричном формате. Кроме
того,  программист  может  вносить  изменения  в текстовые файлы,
используя свой любимый текстовый процессор или  редактор, вызывая
его из отладчика.

     В этой  главе  показано,  как проверять и модифицировать два
вида дисковых файлов: файлы, содержащие исходный текст программы,
и другие дисковые файлы.

Проверка исходных файлов программы
-----------------------------------------------------------------

     Исходные файлы программы - это  файлы,  содержащие  исходный
текст  программы,  из  которого  был сформирован объектный модуль
(файл типа EXE).  Обычно эти  файлы  бывают  нужны  при  проверке
работы  или разработке какого-либо фрагмента программы.  Во время
отладки часто  требуется  просматривать  исходный  текст  функции
чтобы  проверить  правильность ее параметров или возвращаемого ею
значения.

     По ходу выполнения программы  Turbo  Debugger  автоматически
отображает исходный текст текущего фрагмента программы.

     Файлы, включаемые  в  исходный  текст  программы специальной
директивой компилятора (директивой #include  в  Си  и  директивой
INCLUDE  в  ассемблере)  также рассматриваются как исходные файлы
программы (т.е.,  при выборе View|Module они появляются в подокне
списка  Pick  a module).  Для просмотра исходных файлов программы
всегда следует использовать окно модуля,  поскольку это указывает
отладчику,  что  данный  файл  является исходным модулем.  В этом
случае он позволяет выполнять различные действия, необходимые для
отладки,  например,  устанавливать  точки  останова или проверять
переменные программы, позиционируя курсор в соответствующее место
программы. Эти и другие приемы описаны в следующем разделе.

Окно модуля

     Окно модуля  (Module)  открывается  путем выбора из главного
меню команды View/Module (или нажатием клавиши F3).

     Отладчик отображает на  экране  список,  из  которого  можно
выбрать для просмотра интересующий модуль.

     Затем Turbo  Debugger  загружает  исходный  файл  выбранного
модуля. Отладчик ищет исходный файл в следующих местах:

     -  в директории, куда компилятор помещает файл типа EXE;

     - в  директориях,  заданных  командой       Options/Path  for
Source или параметром -sd командной строки;

     -  в текущей директории;

     -  в директории, содержащей отлаживаемую программу.


     В  окне   модуля  отображается   содержимое   исходного   файла
выбранного  модуля.   В  заголовке   окна  модуля   указыается   имя
просматриваемого модуля, а также имя исходного файла и номер строки,
на  которой   находится  курсор.   Указатель  в  виде  стрелки  (>),
находящийся  в   первом  столбце   окна,  показывает  текущую  точку
программы (CS:IP).

     Заметим, что при запуске отладчика Turbo Debugger требуется,
чтобы отладчику были доступны как файл типа EXE,  так и  исходный
файл программы.  Turbo Debugger ищет исходные файлы сначала в той
же  директории,  где  находил  их   компилятор   при   компиляции
программы, затем в директории, заданной командой Options/Path for
Source,  затем в текущей директории,  а затем в  директории,  где
находится файл типа EXE.

     Если после   имени   файла,  указанного  в  заголовке  окна,
появляется слово modified (модифицирован),  это означает,  что  в
текст   программы  были  внесены  изменения  после  компиляции  и
компоновки программы,  в  результате  которых  была  сформирована
отлаживаемая  программа.  В  результате  этой  модификации номера
строк подпрограмм в измененном исходном  файле  могут  больше  не
соответствовать  номерам  строк  в  той  версии  исходного файла,
которая использовалась  для  построения  отлаживаемой  программы.
Вследствии   этого,   указатель,   показывающий   текущую  строку
программы (CS:IP), будет установлен не на той строке.

Локальное меню окна модуля

     ------------------
     Inspect
     Watch
     ------------------
     Module...
     File...
     ------------------
     Previous
     Line...
     Search...
     Next
     Origin
     Goto...
     Exit
     ------------------

     В локальном меню окна модуля имеется ряд команд, позволяющих
перемещаться  по отображаемому в окне модулю,  указывать элементы
данных и проверять их,  загружать в окно новый файл  или  модуль.

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

     Для вызова локального меню окна модуля  используйте  клавиши
AltF10. Если разрешено использование активных клавиш в комбинации
с клавишей Ctrl,  для вызова команды можно нажать клавишу Ctrl  в
сочетании с  первой  буквой ее названия (например,  Ctrl-S вместо
Search).


Команда Inspect
 (проверить)
---------------------------

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

     С помощью  клавиши Ins можно выбрать для проверки (выделить)
целое выражение.  Это исключает необходимость ввода с  клавиатуры
выражения, которое в явном виде имеется в тексте программы.

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

Команда Watch
 (следить)
-----------------------

     Заносит  переменную,   на  которой  установлен  курсор  в  окно
слежения. Эту  команду удобно  использовать  в  тех  случаях,  когда
требуется  непрерывно  следить  за  значением  переменной  во  время
выполнения программы.  Прежде чем  выполнять эту команду, необходимо
позиционировать курсор на одну из переменных программы в ее исходном
тексте, либо ввести ее в блоке ввода блока диалога, который будет
вам выдан.

     С помощью  клавиши  Ins  можно  выбрать  для  слежения целое
выражение.  Это  исключает  необходимость  ввода   с   клавиатуры
выражения, которое в явном виде имеется в исходном модуле.

Команда Module
 (модуль)
-----------------------

     Позволяет просмотреть другой  модуль  путем  его  выбора  из
отображаемого  списка модулей.  Эту команду удобно использовать в
том случае, если текущий модуль больше не представляет интереса и
нежелательно открывать на экране еще одно окно модуля.

Команда File
 (файл)
-------------------

     Позволяет выбрать для просмотра один из  нескольких исходных
файлов,    составляющих    просматриваемый    модуль.    Отладчик
представляет на экране список,  из которого можно выбрать  нужный
файл.  В  большинстве  случаев  модуль  состоит  только из одного
исходного  файла,  который  содержит  исходный  текст  программы.
Другие   файлы,   включенные  в  модуль  обычно  содержат  только
определения констант и структур данных. Используйте эту команду в
том  случае,  если  исходный текст модуля содержится в нескольких
файлах.

     Для просмотра  первого  файла  используйте  View|File.  Если
требуется  просматривать  одновременно  более одного файла,  надо
использовать View/Another/File для открытия последующихокон File.
Module главного  меню,

Команда Previos
 (предыдущий)
----------------------------

     Возвращает курсор  в  то  место  исходного  модуля,  которое
просматривалось  ранее.  Эту команду можно также использовать для
возврата в предыдущее место программы после  выполнения  команды,
которая изменила положение курсора в исходном модуле.

Команда Line
 (строка)
---------------------

     Позиционирует курсор на другую строку исходного  текста. Для
этого  надо  ввести  номер строки,  на которую требуется перейти.
Если  введенный  номер  превышает  количество  строк  в  исходном
тексте, курсор будет позиционирован на последнюю строку файла.

Команда Search
 (найти)
----------------------

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

     Для поиска  можно  использовать   простые   метасимволы:   ?
соответствует  любому  одному  символу,  а * соответствует нулю и
более   символов.   При   достижении   конца   файла   поиск   не
возобновляется   автоматически  с  его  начала.  Для  того  чтобы
выполнить поиск во всем файле, надо сначала перейти на его первую
строку, нажав клавиши Ctrl-PgUp.

Команда Next
 (следующий)
------------------------

     Ищет следующий  экземпляр  строки  символов,  которая   была
задана  в  команде Search.  Эту команду можно использовать только
после выполнения команды Search.

     Иногда бывает так,  что команда Search сначала находит не ту
строку,  которую  в  действительности требовалось найти.  Команда
Next позволяет повторять поиск, исключая необходимость повторного
ввода с клавиатуры искомой строки.

Команда Origin
 (исходный)
-------------------------

     Позиционирует курсор на  ту  строку,  которая  соответствует
текущей  точке  программы  (содержимому  регистров  CS:IP).  Если
текущая точка программы находится не  в  просматриваемом  модуле,
этот  модуль  загружается  в  окно  модуля.  Эту  команду  удобно
использовать  после  просмотра  различных  фрагментов   исходного
текста,   когда   необходимо  вернуться  в  то  место,  где  была
остановлена программа.

Команда Goto
 (перейти)
----------------------

     Позиционирует курсор в указанное место программы.  Для этого
надо ввести адрес той строки,  к которой требуется перейти. Можно
ввести  номер  строки,  имя  функции или шестнадцатиричный адрес.
Задание адреса строки подробно рассматривается в главе 9.

     Эту команду можно также вызвать, просто начав вводить метку,
к  которой требуется перейти.  При этом на экране появляется поле
запроса, точно  такое  же,  как  если  бы  была  выбрана  команда
Run|Execute To.  Это  удобная  форма  выбора  часто  используемой
команды.

Команда Edit
 (редактировать)
----------------------------

     Вызывает текстовый   редактор,   с  помощью  которого  можно
вносить  изменения  в  исходный  файл  просматриваемого   модуля.
Команду,  которая будет вызывать нужный редактор,  можно задать с
помощью программы настройки TDINST.

Проверка других дисковых файлов
-----------------------------------------------------------------

     Используя окно файла, можно проверять и модифицировать любой
дисковый  файл.  С  помощью  команд  Ascii  и  Hex,  описанных  в
следующих  разделах  главы,  содержимое файла можно просматривать
как в в виде  текста,  так  и  в  виде  шестнадцатиричных  байтов
данных.

Окно файла

     Окно файла  (File)  открывается  с помощью команды View/File
главного меню.  Используя  метасимволы  DOS,  можно  получить  на
экране  список файлов и выбрать из него нужный файл.  Можно также
ввести имя конкретного файла с клавиатуры.

     В окне файла отображается содержимое выбранного  файла.  Имя
просматриваемого файла отображается в верхней части окна вместе с
номером  строки,  на  которой   находится   курсор   (если   файл
просматривается в текстовом формате).

     Когда окно файла открывается в первый раз, файл отображается
в нем либо в  текстовом,  либо  в  шестнадцатиричном  формате,  в
зависимости от того, какая информация в нем содержится: текст или
двоичные данные.  С помощью команды Display As,  описанной  ниже,
можно   в   любой   момент   перейти   из  текстового  формата  в
шестнадцатиричный и наоборот.

     Рис.8.3 Окно  файла,  в  котором   данные   отображаются   в
шестнадцатиричном формате

Локальное меню окна файла

     ---------------------
     Goto
     Search
     Next
     ---------------------
     Display as      Ascii
     File...
     Edit
     ---------------------

     В локальном   меню  окна  файла  имееются  команды,  которые
позволяют переходить в другое  место  дискового  файла,  изменять
формат отображения данных на экране и вносить изменения в файл.

     Для того чтобы вызвать локальное меню окна File, надо нажать
клавиши Alt-F10.  Если разрешено использование активных клавиш  в
комбинации  с  клавишей  Ctrl,  для  вызова  команды можно нажать
клавишу Ctrl в сочетании с первой буквой ее названия.


Команда Goto
 (перейти)
----------------------

     Выполняет переход  на  строку  с   указанным   номером   или
смещением.  Если  файл просматривается в текстовом формате,  надо
ввести номер строки,  на которую  требуется  перейти.  Если  файл
просматривается в шестнадцатиричном формате, надо ввести смещение
относительно начала  файла  той  позиции,  с  которого  требуется
начать отображение.  При вводе смещения можно использовать полный
синтаксический анализатор.  Если введенный номер строки превышает
количество строк в файле,  или если введенное смещение выходит за
границу файла, выполняется переход на конец файла.

Команда Search
 (найти)
----------------------

     Выполняет поиск  строки символов,  начиная с текущей позиции
курсора.  В ответ на запрос отладчика надо ввести строку, которую
требуется найти. Если при выполнении команды курсор установлен на
слове,  которое может являться символическим  именем,  это  слово
автоматически  заносится  в  поле  запроса.  Кроме  того,  если с
помощью клавиши Ins отметить  какой-либо  фрагмент  текста,  этот
фрагмент  также  будет  занесен  в  поле  запроса.  Это исключает
необходимость ввода с клавиатуры, если искомая строка уже имеется
в просматриваемом исходном тексте.  Формат искомой строки зависит
от формата, в котором просматривается содержимое файла.

     Если файл отображается в текстовом формате для  поиска можно
использовать простые метасимволы:  ?  соответствует любому одному
символу, а * соответствует нулю и более символов.

     Если файл отображается в  шестнадцатиричном  формате,  можно
вводить список байтов,  состоящий из последовательностей байтовых
значений или заключенных в кавычки строк символов,  используя тот
же синтаксис языка,  который применяется для выражений. Подробная
информация о последовательностях байтов приведена в главе 9.

     При достижении   конца   файла   поиск   не   возобновляется
автоматически  с  его  начала.  Для того чтобы выполнить поиск во
всем файле,  надо сначала перейти на  его  первую  строку,  нажав
клавиши Ctrl-PgUp.

     Эту команду  можно  также  вызвать,  просто  начав вводить с
клавиатуры строку,  которую требуется найти.  При этом на  экране
появится поле запроса,  точно такое же,  как и при выборе команды
Search.

Команда Next
 (следующий)
------------------------

     Ищет следующий   экземпляр  строки  символов,  которая  была
задана в команде Search.  Эту команду можно  использовать  только
после выполнения команды Search.

     Эту команду  полезно использовать в том случае,  если нужная
строка не была найдена командой Search.  Команда  Next  позволяет
повторять поиск до тех пор,  пока не будет найдена нужная строка.

Команда Display As
 (формат отображения)
---------------------------------------

     Переключает режим   отображения   содержимого    файла    из
текстового  (ASCII) формата в шестнадцатиричный и наоборот.  Если
выбрать текстовый формат,  файл будет отображаться  на  экране  в
таком  же  виде,  как  и  при  просмотре  его с помощью текствого
редактора.  Если  выбрать  шестнадцатиричный  формат,  то  каждая
строка  файла  будет  начинаться  с  шестнадцатиричного  смещения
байтов этой строки относительно начала  файла.  В  каждой  строке
отображается 8 или 16 байтов в зависимости от ширины окна. Справа
от шестнадцатиричных данных отображаются символы, соответствующие
отображаемым байтам. При этом отображается полный набор символов,
то есть для байтовых  значений  меньше  32  и  больше  127  будут
отображаться соответствующие им символы.

Команда File
 (файл)
-------------------

     Позволяет выбрать  для  просмотра  другой  файл.   Используя
метасимволы  DOS,  можно  получить  на экране список и выбрать из
него нужный файл.  Можно также ввести  с  клавиатуры  точное  имя
файла,   который   требуется  загрузить.  Эта  команда  позволяет
просматривать другой файл,  не открывая еще  одного  окна  файла.
Если  требуется  просматривать  одновременно два разных файла или
две разных части одного файла, надо воспользоваться командой View
/Another/File, которая откроет новое окно файла.

Команда Edit
 (редактировать)
----------------------------

     Если файл просматривается в текстовом формате,  эта  команда
позвляет   вносить  изменения  в  просматриваемый  файл,  вызывая
текстовый редактор,  который был указан при настройке отладчика с
помощью программы TDINST.

     Если файл   просматривается   в  шестнадцатиричном  формате,
отладчик не будет вызывать текстовый редактор.  Вместо  этого  он
попросит   ввести  байтовые  значения,  которые  должны  заменить
значения, находящие в текущей позиции курсора. Последовательность
байтов  надо вводить точно в таком же виде,  как и при выполнении
команды Search.  Последовательности  байтов  подробно  описаны  в
главе 9.
