ГЛАВА 6  ПРОВЕРКА И МОДИФИКАЦИЯ ДАННЫХ


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

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

     - Кроме  того,  поместив  некоторые переменные и выражения в
окно слежения (Watches),  вы  можете  следить  за  изменением  их
значений по ходу выполнения программы.

     - Блок  диалога  Evaluate/Modify показывает содержимое любых
переменных и позволяет присваивать им новые значения.

     В данной главе предполагается, что вы имеете представление о
различных   типах   данных,  которые  используются  в  том  языке
программирования,  на котором  вы  работаете  (Си,  Паскаль,  или
ассемблер).  Если  вы  только начинаете программировать на данном
языке и недостаточно хорошо знакомы со всеми его типами данных, в
этой главе вы сможете найти полезную информацию об основных типах
данных (char,  int,  integer,  boolean,  real и т.д.).  Когда  вы
познакомитесь  с  более сложными типами данных (pointer,  record,
struct,  union и т.д.),  вернитесь к этой главе,  чтобы научиться
просматривать их с помощью отладчика Turbo Debugger.

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

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

Меню Data
-----------------------------------------------------------------

     ---------------------------
     Inspect...
     Evaluate/modify...  Ctrl-F4
     Add watch...        Ctrl-F7
     Function return
     ---------------------------

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

Команда Inspect...

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

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

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

     (Подробное описание работы с окнами проверки  приведено ниже
в разделе "Окна проверки".)

Команда Evaluate/Modify...

     Открывает блок    диалога    Evaluate/Modify   (рис.6.1)   и
запрашивает у  пользователя  выражение,  значение  которого  надо
вычислить,  точно  так  же,  как это делает компилятор при выборе
команды Eval. Этот вопрос подробно рассматривается в главе 9.

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

     Не забудьте,  что после  выражения,  за  которым  необходимо
проследить,  может  стоять  строка управления форматом.  Вопросы,
связанные с управлением форматом,  рассмотрены в главе  9.  Turbo
Debugger  отображает результат вычисления в формате,  удобном для
просмотра  значения  данного  типа.  Если  требуется   отображать
результат  в  другом  формате,  надо  поставить  после  выражения
запятую,  а затем ввести строку управления форматом.  Это  бывает
полезно  в тех случаях,  когда требуется проследить за каким-либо
выражением,  представленным  в  формате,  который  отличается  от
формата,   выбираемого   отладчиком  для  этого  типа  данных  по
умолчанию.

     Блок диалога имеет три поля.  В верхнее подокно  вы  вводите
выражение,  значение которого необходимо вычислить.  Это подокно,
как и другие окна запроса, имеет "исторический" список. В среднем
подокне  отображается  вычисленное  значение выражения.  В нижнее
подокно можно ввести  новое  значение  выражения.  Если  значение
выражения  не  может  быть  изменено,  в  этом подокне появляется
сообщение "Not Available",  и вы не можете переместить  курсор  в
это подокно.

     Ввод в блок ввода New Value действует,  когда выбрана кнопка
Modify.  Так же, как и в других окнах, имеющих несколько подокон,
для  перемещения  курсора из одного подокна в другое используются
клавиши Tab и Shift-Tab. Нажатие клавиши Esc при вводе в любое из
подокон или нажатие кнопки мыши Cancel закрывает блок ввода.

     Строки данных,  слишком  длинные  для  вывода  в блоке ввода
Result, имеют в  конце  символ  (>).  Для  дальнейшего  просмотра
строки можно выполнить скроллинг по этой строке.

     При отладке   программ   С++   или  объекто-ориентированного
Паскаля блок диалога Evaluate/Modify также позволяет вам выводить
на дисплей  поля  конкретных  вхождений  объектов или компонентов
класса. Вы можете воспользоваться спецификатором формата, который
может быть использован при расчете записи.

     При трассировке   правила  или  компонентной  функции  Turbo
Debugger узнает об области определения  и  приоритетах  параметра
Self/this. Вы   можете  вычислить  Self/this  и  сопроводить  его
спецификаторами формата и квалификаторами.

     Turbo Debugger  позволяет   также   вызывать   правило   или
компонентную функцию из блока диалога Evaluate/Modify.  Для этого
нужно ввести  имя  вхождения  функции,  точку,  имя  правили  или
компонентной функции  и список фактических параметров (или пустые
круглые скобки, если параметры отсутствуют). В случае объявлений

     type
        Point = object
           X, Y   : Integer;
           Visible: Boolean;
           constructor Init(InitX, InitY : Integer);
           destructor  Done; virtual;
           procedure   Show; virtual;
           procedure   Hide; virtual;
           procedure   MoveTo(NewX, NewY : Integer);
     end;

     var
        APoint : Point;

     вы можете ввести в окно Turbo  Debugger  Evaluate  любые  из
следующих выражений:

-----------------------------------------------------------------
Выражение                          Результат
-----------------------------------------------------------------
APoint.X                           5($5):Integer
APoint                             (5,23,FALSE):Point
APoint.MoveTo                      @6F4F:00BE
APoint.MoveTo(10,10)               вызывает правило MoveTo
APoint.Show()                      вызывает правило Show
-----------------------------------------------------------------

Замечание для программистов, работающих на Си
---------------------------------------------

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

     При вычислении  значения  выражения  с  побочными  эффектами
изменяются значения переменных или областей памяти.  Такой эффект
имеют,  например,  операторы  приращения   (++),   отрицательного
приращения  (--)  и  присваивания  (=,  +=  и т.д.).  Если внутри
выражения вызывается какая-либо  функция  (например,  myfunc(2)),
необходимо  помнить  о  том,  что  она  может  иметь  неожиданные
побочные эффекты.

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

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

Команда Add Watch

     Запрашивает у   пользователя   выражение,  за  которым  надо
проследить,  а затем  заносит  данное  выражение  или  переменную
программы в  список переменных,  отображаемых в окне слежения при
нажатии Enter или при выборе кнопки OK.

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

Команда Function Return

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

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

     Благодаря этой команде отпадает необходимость открывать окно
процессора,  чтобы проверить возвращаемое значение,  помещенное в
регистры процессора. А поскольку тип и формат возвращаемых данных
известны, то    использование    данной    команды   проще,   чем
использование шестнадцатиричного дампа.

Выбор элементов данных в исходном тексте
-----------------------------------------------------------------

     Turbo Debugger  имеет  мощный  механизм,  который  исключает
необходимость  ввода  с  клавиатуры  имен   переменных,   которые
требуется   проверить.   Находясь  в  любом  окне  модуля,  можно
установить курсор на имя любой  переменной  и  выполнить  команду
Inspect локального меню,  чтобы открыть окно проверки,  в котором
будет отображаться значение  выбранной  переменной.  Можно  также
выбрать  выражение  для проверки.  Для этого прежде чем выполнять
команду Inspect,  надо позиционировать курсор на  это  выражение,
нажать  клавишу  Ins  и  с  помощью  клавиш  управления  курсором
выделить выражение.  Работа с окном  модуля  подробно  описана  в
главе 8.

Окно слежения
-----------------------------------------------------------------

     В окно  слежения  (Watches)  можно  заносить  переменные   и
выражения   программы,  за  которыми  необходимо  следить.  Можно
следить как за значениями простых  переменных  (например,  целого
типа),  так  и за содержимым сложных элементов данных,  таких как
массивы.  Кроме того,  можно  отслеживать  значение  вычисляемого
выражения,  в  котором  нет  прямых  обращений к областям памяти,
например, x * y + 4.

     Для того чтобы открыть окно слежения,  надо выбрать  команду
View/Watches.  В  этом  окно  отображается  список  переменных  и
выражений,  за которыми необходимо следить. Слева указывается имя
переменной  или  выражение,  а  справа  тип  данных  и  значение.
Значения  сложных  типов,  таких   как   массивы   и   структуры,
заключаются  либо  в  фигурные (для си-программ),  либо в круглые
(для паскаль-программ) скобки. Если в строке не хватает места для
отображения всего выражения,  часть выражения отсекается.

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

     Это означает,  что  если  имя  какой-либо переменной введено
неправильно,  эта ошибка не  будет  обнаружена,  поскольку  Turbo
Debugger  будет  рассматривать  его  как имя переменной,  которое
станет допустимым в процессе выполнения  программы.  Если  вы  не
используете  механизм  изменения  области  действия,  описанный в
главе 9, Turbo Debugger будет вычислять значение выражения в окне
слежения,  используя  область  действия  в текущей точке останова
программы.  Следовательно,  выражения в окне слежения будут иметь
такие же значения,  как если бы они находились в тексте программы
в той точке,  в которой она была остановлена.  Если отслеживаемое
выражение содержит имя переменной, которая не доступна из текущей
области действия (например,  если она описана в  другом  модуле),
значение  этого выражения неопределено и вместо него отображается
четыре знака вопроса (????).

     При выполнении трассировки внутри объектного правила  к окну
Watches можно добавить параметр Self/this.

Локальное меню окна слежения

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

     -------------------
     Watch...
     Edit...
     Remove
     Delete All
     -------------------
     Inspect
     Change
     -------------------

Команда Watch
----------------

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

Команда Edit
---------------

     Позволяет пользователю отредактировать выражение, занесенное
в окно слежения.  Можно корректировать введенное ранее  выражение
или ввести новое.

     Эту команду также можно вызвать, установив выделяющий курсор
на нужное выражение в окне слежения и нажав  клавишу  Enter.  Для
помещения отредактированного  выражения  в  окно  Watches нажмите
Enter или выберите OK.

Команда Remove
--------------

     Удаляет выбранное выражение из окна слежения.

Команда Delete All
------------------

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

Команда Inspect
---------------

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

Команда Change
--------------

     Заменяет значение  выбранного  элемента  из  окна   слежения
значением,  которое  вводится  с  клавиатуры  в  ответ  на запрос
отладчика.  Если это позволяет язык программирования,  на котором
написана   отлаживаемая   программа,   Turbo  Debugger  выполняет
необходимое преобразование типов точно так же,  как если  бы  для
изменения значения переменной использовался оператор присваивания
(= или :=).  В главе 9 приведена более  подробная  информация  об
операторе присваивания и преобразовании типов.

Окна проверки данных
-----------------------------------------------------------------

     В окне   проверки   (Inspector)   данные   отображаются    в
соответствии с их типом.  Все типы - скалярные (например,  char и
int),  указатели (char* в Си и ^ в Паскале),  массивы (long x[4],
array [1..10] of word), функции, структуры, записи, объединения и
множества - отображаются по-разному.

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

     Первым элементом  в  окне  проверки  всегда  является  адрес
области    памяти,   содержащей   проверяемые   данные,   который
записывается в формате <сегмент:смещение> (если  данные  хранятся
не в регистре и не равны константе, например 3).

     Для того  чтобы  просмотреть содержимое окна проверки в виде
строк байтов данных,  надо, находясь в этом окне, выбрать команду
View/Dump.  На  экране появится окно процессора,  в подокне данных
которого будут отображаться  данные,  соответствующие  выбранному
элементу в окне проверки.  Чтобы вернуться к окну проверки,  надо
закрыть окно  процессора  с  помощью  команды  Window/Close  (или
клавиши Alt-F3), либо нажав кнопку мыши на блоке закрытия.

     В следующих   разделах   описаны  различные  окна  проверки,
используемые для каждого  из  языков,  поддерживаемых  отладчиком
Turbo  Debugger:  Си,  Паскаль  и  ассемблер.  Для  каждого языка
используется свой формат представления данных в  окнах  проверки.
Элементы  данных  и  их  значения  всегда  отображаются  в том же
формате, в котором они описаны в исходном тексте программы.

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

Окна проверки данных си-программы

Скалярные типы
--------------

     В окнах  проверки  скалярных  типов   отображаются   простые
элементы данных, например,

     char x = 4;
     unsigned long y = 123456L;

     В этих окнах проверки кроме верхней строки, содержащей адрес
переменной, имеется еще одна строка информации. Слева указывается
тип скалярной переменной (char, unsigned long и т.д.), а справа -
ее  значение.  Значение  может  быть  представлено в десятичном и
шестнадцатиричном форматах  или  в  обоих  одновременно.  Вначале
значение   обычно  представляется  в  десятичном  формате,  после
которого в круглых скобках указывается шестнадцатиричное значение
(с   обычным   префиксом   0x,   используемым   в  языке  Си  для
шестнадцатиричного формата).  Для изменения способа представления
значений можно использовать утилиту TDINST.

     Если проверяемая   переменная   относится   к   типу   char,
отображается также ее символьный эквивалент.  Если представленное
значение  не  имеет  печатаемого символьного эквивалента,  то для
отображения символьного значения можно использовать обратный слеш
(\),   за   которым   следует   шестнадцатиричное  значение.  Это
символьное  значение  будет  отображаться  перед  десятичным  или
шестнадцатиричным значением.


Указатели
---------

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

     char *p = "abc";
     int *ip = 0;
     int **ipp = @ip;

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

     Если ссылочная  переменная  указывает  на  строку  символов,
заканчивающуюся  символом  0,  в   окне   проверки   отображается
дополнительная  информация,  показывающая значения всех элементов
массива символов.  Слева в каждой строке указан  индекс  элемента
массива ([1],  [2] и т.д.), а справа - значение элемента в том же
формате,  который используется в окне проверки скалярных типов. В
этом случае вся строка целиком отображается в верхней строке окна
вместе с  адресом  ссылочной  переменной  и  адресом  строки,  на
которую она указывает.

     Вы также  получаете  несколько  строк,  если открываете окно
Inspector и используете команду локального меню Range. Этот метод
важен для программистов Си,  использующих указатели для ссылки на
массивы элементов как на единый элемент.  Например,  если  у  вас
есть код

     int array[10];
     int *arrayp = array;

     и вы хотите помотреть,  куда указывает  arrayp,  используйте
локальную команду   Range  для  arrayp,  задав  начальный  индекс
массива 0 и диапазон,  равный 10.  Если вы не сделаете этого,  то
получите только первый элемент массива.

     Рис.6.4  Окно Inspector для указателя Си

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

Массивы
-------

     В окне  проверки  массивов  отображаются  значения элементов
массива, например,

     long threed[3][4][5];
     char message[] = "eat these words";

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

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

Структуры и объединения
-----------------------

     В окнах   проверки   структур   и  объединений  отображаются
значения элементов структур и объединений, например,

     struct date {
        int year;
        char month;
        char day;
     } today;

     union {
        int small;
        long large;
     } holder;

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

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

Функции
-------

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

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


Окна проверки данных паскаль-программы


Скалярные типы
--------------

     В окнах  проверки  скалярных  типов   отображаются   простые
элементы данных, например,

     var
       X : integer;
       Y : longint;

     В этих окнах проверки кроме верхней строки, содержащей адрес
переменной, имеется еще одна строка информации. Слева указывается
тип скалярной переменной (byte, word, integer, longint и т.д.), а
справа  -  ее  значение.  Значение  может  быть  представлено   в
десятичном и шестнадцатиричном форматах или в обоих одновременно.
Вначале значение  обычно  представляется  в  десятичном  формате,
после  которого  в  круглых скобках указывается шестнадцатиричное
значение (с обычным  префиксом  $,  используемым  в  языке  Turbo
Pascal  для  шестнадцатиричного  формата).  Для изменения способа
представления значений можно использовать утилиту TDINST.

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


Указатели
---------

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

     var
       IP : ^integer;
       LP :^^pointer;

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

     Несколько строк   информации   также  можно  получить,  если
открыть окно проверки,  выполнить команду Range локального меню и
указать количество, большее чем 1.


Массивы
-------

     В окне  проверки  массивов  паскаль-программы   отображаются
значения элементов массива, например,

     var
       A : array[1..10,1..20] of integer;
       B : array[1..50] of boolean;

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

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



Записи
------

     В окнах  проверки  записей  паскаль-программы   отображаются
значения полей записей, например,

     record
       year : integer;
       month : 1..12;
       day : 1..31;
     end


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

     Рис.6.11 Окна проверки записей паскаль-программы

Процедуры и функции
-------------------

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



Окна проверки данных ассемблерных программ

Скалярные типы
--------------

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

     VAR1      DW  99
     MAGIC     DT  4.608
     BIGNUM    D0  123456

     В этих окнах проверки кроме верхней строки, содержащей адрес
переменной, имеется еще одна строка информации. Слева указывается
тип скалярной переменной (byte,  word,  dword,  qword и т.д.),  а
справа  -  ее  значение.  Значение  может  быть  представлено   в
десятичном и шестнадцатиричном форматах или в обоих одновременно.
Вначале значение  обычно  представляется  в  десятичном  формате,
после  которого  в  круглых скобках указывается шестнадцатиричное
значение (с обычным префиксом h,  используемым в языке ассемблера
для    шестнадцатиричного   формата).   Для   изменения   способа
представления значений можно использовать утилиту TDINST.


Указатели
---------

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

     X         DW  0
     XPTR      DW  X
     FARPTR    DD  X


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

     Если ссылочная  переменная относится к типу byte и указывает
на строку символов,  заканчивающуюся символом 0,  в окне проверки
отображается  дополнительная  информация,  показывающая  значения
всех элементов массива символов.  Слева в  каждой  строке  указан
индекс  элемента массива ([1],  [2] и т.д.),  а справа - значение
элемента в том же формате,  который используется в окне  проверки
скалярных типов.  В этом случае вся строка целиком отображается в
верхней строке окна  вместе  с  адресом  ссылочной  переменной  и
адресом строки, на которую она указывает.

     Несколько строк  в  окне  проверки  указателей  также  можно
получить, открыв это экно, выполнив команду Range локального меню
и задав значение, больше 1.


Массивы
-------

     В окне проверки массивов ассемблерной программы отображаются
значения элементов массива, например,

     WARRAY  DW 10 DUP (0)
     MSG     DB "Greetings",0

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

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


Структуры и объединения
-----------------------

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

     X    STRUCT
     MEM1       DB  ?
     MEM2       DD  ?
     X    ENDS
     ANX  X         <1,ANX>

     Y    UNION
     ASBYTES    DB  10 DUP (?)
     ASFLT      DT  ?
     Y    ENDS
     AY   Y         <?,1.0>


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



Локальное меню окна проверки
-----------------------------------------------------------------

     --------------------
     Range...
     Change...
     --------------------
     Inspect
     Descend
     New expression...
     Type cast...
     --------------------

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

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


Команда Range

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

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

     Эта команда особенно удобна для проверки массивов в  Си, где
часто  описываются  указатели  на элемент данных (например,  char
*p),  который в действительности является массивом символов, а не
одиночным символом.

Команда Change

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

Команда Inspect

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

     Если в текущем окне проверки проверяется функция, по команде
Inspect будет показан ее исходный текст.

     Эту команду также можно вызвать,  выбрав  нужный  элемент  в
окне проверки и нажав клавишу Enter.

     Для того  чтобы  вернуться в предыдущее окно проверки,  надо
нажать клавишу Esc,  которая закроет новое окно  проверки.  Когда
проверка  структуры данных закончена и необходимо убрать с экрана
все окна  проверки,  можно  выполнить  команду  Window/Close  или
нажать клавишу Alt-F3, либо нажать кнопку мыши на блоке закрытия.

Команда Descend

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

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

Команда New Expression

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

     Окна проверки для объектов Паскаля и классов  С++  несколько
отличаются от  обычных окон Inspector.  Описание этих окон см.  в
главе 10.

Команда Type Cast

     Позволяет задавать проверяемому элементу данных  другой  тип
(Byte, Word,   Int,  Char,  pointer).  Это  полезно,  когда  окно
Inspector содержит символическое имя, для которого нет информации
о типе,   а   также   для   явного  задания  типа  нетипированным
указателям.
