Глава 10
Отладка программ на С++ и объекто-ориентированном Паскале
-----------------------------------------------------------------

     Для того,   чтобы   соответствовать   требованиям   С++    и
объекто-ориентированного Паскаля,      Turbo     Debugger     был
усовершенствован, и теперь  поддерживает  объекто-ориентированное
программирование. Для  использования этих новых средств требуетсф
Turbo Pascal версии 5.5 или Turbo С++,  а  также  Turbo  Debugger
версии 2.0.

     Помимо расширений,  позволяющих трассировку объектных правил
или компонентных функций класса,  а также  исследование  объектов
или классов  в блоке диалога Evaluate/Modify и окне Watch,  Turbo
Debugger 2.0 имеет  специальный  набор  окон  и  локальных  меню,
специально разработанных для работы с объектами и классами.

Окно Hierarchy
-----------------------------------------------------------------

     Turbo Debugger  имеет  специальное  окно  для   исследования
иерархической структуры  объектов  или классов.  В это окно можно
войти, выбрав View|Hierarchy.

     Рис.10.1  Окно Hierarchy

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

Подокно Object Type List (списот типов объектов)  ---------------

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

     Для открытия    окна   Inspector   для   высвеченного   типа
объекта/класса нажмите  Enter.  Эти  окна  описаны  на  стр.  158
оригинала.

Локальное меню подокна Object Type/Class   ----------------------

     ---------
     Inspect
     Tree
     ---------

     Для вывода  на  дисплей  локального  меню  данного   подокна
нажмите Alt-F10. Если при помощи DINST вы разрешили использование
активных клавиш,  то можно ими  воспользоваться.  Локальное  меню
содержит два пункта: Inspect и Tree.

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

     Выводит для высвеченного типа объекта/класса окно Inspector.

Команда Tree
------------

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

Подокно Hierarchy Tree   ----------------------------------------

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

     Для нахождения  отдельного объекта или типа класса в сложном
иерархическом дереве перейдите в левое подокно  и  воспользуйтесь
средством инкрементного  поиска;  затем выберите в локальном меню
пункт Tree  для  возврата  в  подокно  с  иерархическим  деревом.
Соответствующий тип появится под высвеченной линейкой.

     При нажатии   Enter  для  высвеченного  типа  появится  окно
Inspector для типов объект/класс.

     Если вы загрузили программу на  С++,  использущую  классы  с
множественным наследованием,  то появится третье подокно,  Parent
Tree, располагающееся  ниже  подокна  Hierarchy   Tree   в   окне
Hierarchy. Если исследуемый класс имеет несколько предков, и если
команда Parent локального меню подокна Hierarchy Tree установлена
в состояние    Yes,   то   в   подокне   Parent   Tree   появится
реверсированное дерево и сообщение Parents  of  Class  ("Родители
класса") в левой части подокна и "предки",  расположенные вниз  и
вправо относительно этого сообщения,  причем линиями обозначаются
взаимосвязи между предками и потомками.

     Вы можете   открыть   окно   Inspector   для   любого   типа
объект/класс, находящегося в подокне Parent Tree, как для подокна
Hierarchy Tree.

Локальное (локальные) меню подокна Hierarchy Tree
-------------------------------------------------

     -------------
     Inspect
     -------------

     -------------
     Inspect
     Parents   Yes
     -------------

     Локальное меню  (Alt-F10 в правом подокне) подокна Hierarchy
Tree имеет только один пункт Inspect. При выборе этого пункта для
высвеченного типа    появляется    окно    Inspector   для   типа
объекта/класса.

     Если вы загрузили программу на С++,  исполшьзующую классы  с
множественным наследованием,  то локальное меню подокна Hierarchy
Tree содержит и вторую команду, Parents. Эта команда работает как
переключатель ,  при  помощи  которого  вы  можете управлять тем,
показывать ли предков данного класса в подокне Parent  Tree.  Это
полезно, когда   исследуемый   вами   класс  имеет  множественное
наследование. По умолчанию команда Parents имеет значение Yes.

Локальное меню подокна Parent Tree
----------------------------------

     ------------
     Inspect
     ------------

     Turbo Debugger   имеет   специальный   тип  окна  Inspector,
позволяющий проверять детали объекта: окно Inspector типа объект/
класс. В  этом  окне  сведена  информация  о данном типе,  а не о
конкретных вхождениях этого типа в переменные.

     Рис.10.2  Окно Inspector типа объект/класс

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

     Если высвеченное  поле  данных  является  объектом или типом
класса, либо указателем  объекта  или  типа  класса,  то  нажатие
Enter откроет   для   этого   поля  другое  окно  Inspector  типа
объект/класс. (Это идентично выбору команды Inspect  в  локальном
меню данного подокна). Таким образом, сложные вложенные структуры
объектов или классов  можно  просматривать  быстро,  с  минимумом
нажатий клавиш.

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

     Нажатие Enter    в    любой   точке   окна   Inspector   для
правил/компонентных функций вызывает на передний план окно Module
с курсором,   установленным   на  коде,  реализующем  проверяемые
правило или компонентную функцию.

     Как и при стандартной проверке,  Esc закрывает текущее  окно
Inspector, а Alt-F3 закрывает все эти окна.

Локальное меню окна Inspector типа объект/класс   ---------------

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

     --------------------
     Inspect
     Hierarchy
     Show inherited   Yes
     --------------------

     Локальное меню подокна Object Data Field имеет три элемента:

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

     Если высвеченное  поле  является  объектом или типом класса,
либо указателем на них,  то  для  высвеченного  поля  открывается
новое окно Inspector типа объект/класс.

Команда Hierarchy
-----------------

     Открывает окно Hierarchy  для  инспектируемого  объекта  или
типа. Окно Hierarchy описано на стр. 155 оригинала.

Команда Show Inherited
----------------------

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

     -------------------
     Inspect
     Hierarchy
     Show inherited  Yes
     -------------------

     Локальное меню  нижнего  подокна Object Method имеет команды
Inspect, Hierarchy и Show Inherited.

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

     Для высвеченного элемента открывается окно Inspector правил/
компонентных функций.   При   нажатии    Ctrl-I    с    курсором,
установленном на адресе, показанном в этом окне, на передний план
вызывается окно  Module  с  курсором,  установленном   на   коде,
реализующем инспектируемое правило/функцию.

Команда Hierarchy
-----------------

     Открывает окно Hierarchy  для  инспектируемого  объекта  или
типа класса. Окно Hierarchy рассматривается на стр.155 оригинала.

Команда Show Inherited
----------------------

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

Окна Inspector вхождений объекта
-----------------------------------------------------------------

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

     Для перехода  в  это  окно  поместите  курсор  на  вхождение
объекта или класса в окне Module и нажмите Ctrl-I.

     Рис.10.3  Окно Inspector для вхожнений объектов/классов

     Большинство окон Inspector для записей данных Turbo Debugger
имеет два   подокна:   в   верхнем    находятся    имена    полей
записей/компоненты и  их текущие значения,  а в нижнем - тип поля
или компонента,  высвеченного в верхнем подокне.  Окно  Inspector
вхождений объектов/классов  также имеет оба эти подокна,  а между
ними - третье подокно.  В нем сведены  правила  или  компонентные
функции данного  вхождения,  а также адрес кода,  соответствующий
каждому вхождению.  (адрес кода учитывает полиморфные  объекты  и
VMT).

Локальные меню окна Inspector вхождений объекта/класса   --------

     Каждое подокно  данного  окна  имеет  собственнон  локальное
меню, выводимое при нажатии Alt-F10  в  соответствующем  подокне.
Если в   TDINST   разрешены   активные   клавиши,  то  можно  ими
пользоваться.

     ---------------------
     Range...
     Change...
     Methods           Yes
     Show inherited    Yes
     ---------------------
     Inspect
     Descend
     New expression...
     Type cast
     Hierarchy
     ---------------------

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

Команда Range...
----------------

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

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

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

Команда Methods
---------------

     Данная команда работает как переключатель Yes/No, причем Yes
устанавливается по умолчанию.  При этом правила или  компонентные
функции перечисляются  в среднем подокне.  При установке значения
No средняя панель не появляется.  Значение данного  переключателя
запоминается и   используется   при   открытии   следующего  окна
Inspector.

Команда Show inherited
----------------------

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

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

     Как и в предыдущих  версиях  Turbo  Debugger,  выбор  данной
команды открывает   окно  Inspector  для  высвеченного  поля  или
компонента. Нажатие Enter  на  высвеченном  поле  или  компоненте
делает то же самое.

Команда Descend
---------------

     Данная команда  не  изменилась  по  сравнению   с   прошлыми
версиями Turbo   Debugger.  Высвеченный  элемент  занимает  место
элемента текущего  окна  Inspector.  Новые  окна   Inspector   не
открываются. Однако,    вы    не   можете   вернуться   к   полю,
инспектированному перед этим,  как  это  позволяет  делать  опция
Inspector.

     Descend используется  для  инспектирования  сложных структур
данных, если вы не желаете открывать специальное  окно  Inspector
для каждого элемента.

New Expression...
-----------------

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

Команда Type Cast...
--------------------

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

Команда Hierarchy
-----------------

     При выборе данной команды открывается окно Hierarchy. Полное
описание данного окна см. на стр.155 оригинала.

Среднее и нижнее подокна   --------------------------------------

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

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

