Borland Pascal. Руководство пользователя

         

Что такое отладка?


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



Что такое шаг?


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

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



Что такое выражение?


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

Элементы выражений отладчика Таблица 6.1 +--------------------------+------------------------------------+ | Элемент выражения | Допустимые значения | +--------------------------+------------------------------------| | Константы | Все допустимые типы: Boolean, Byte,| | | Char, перечислимый тип, Integer,| | | Longint, Real, Shortint, Word и| | | строковый тип. | +--------------------------+------------------------------------| | Переменные | Все типы, включая типы, определен-| | | ные пользователям. | | | | | целочисленный тип | Любое целочисленное выражение с пе-| | | ременными границами диапазона. | | | | | тип с плавающей точкой| Любые выражения с плавающей точкой| | | или целочисленные выражения; лишние| | | значащие цифры отбрасываются. | | | | | символьный тип | Любое символьное выражение, включая| | | печатаемые символы в одинарных ка-| | | вычках, целочисленные выражения,| | | тип которых приведен к типу Char, и| | | контанты ASCII (#xx). | | | | | булевский тип | True, False и все булевские выраже-| | | ния. | | | | | перечислимый тип | Любые совместимые перечислимые кон-| | | станты или целочисленные выражения| | | в рамках диапазона, тип которых| | | приведен к совместимому перечисли-| | | мому типу. | | | | | указатель | Любые совместимые указатели или вы-| | | ражения с приведенными к ним типа-| | | ми; функция Ptr с соответствующим| | | параметрами. | | | | | строковый тип | Любая строковая константа (текст в| | | одинарных кавычках); строковые пе-| | | ременные; строковые выражения, сос-| | | тоящие из конкатенированных строко-| | | вых констант и переменных. | | | | | множество | Любая множественная константа; лю-| | | бое выражение, совместимое с мно-| | | жественным типа, в котором исполь-| | | зуются операции +, - и *. | +--------------------------+------------------------------------| | Приведение типа | Соблюдаются стандартные правила| | | Паскаля. | +--------------------------+------------------------------------| | Операции | Все операции Borland Pascal. | +--------------------------+------------------------------------| | Встроенные функции | Все функции, допустимые в выражени-| | | ях-константах. | +--------------------------+------------------------------------| | Массивы | Массивы Borland Pascal - Mem, MemL,| | | MemW. | +--------------------------+------------------------------------+



Генерация отладочной информации


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

Когда вы компилируете программу Borland Pascal, компилятор всегда сохраняет список используемых идентификаторов, который на- зывается таблицей идентификаторов. В этом списке отслеживаются имена всех переменных, констант, типов, процедур и функций. Для целей отладки там сохраняются также номера строк исходных файлов, где встречаются все эти идентификаторы. Выбрав в диалоговом окне Compiler Options параметр Debug Information (Отладочная информа- ция) или задав директиву компилятора $D+, вы указываете компиля- тору, что в таблицу идентификаторов нужно добавить информацию о номерах строк.

Встроенная и автономная отладка

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

Информация в модулях

Если вы пишете большую программу, которая использует модули, и отладочная информация получается слишком объемной, вы можете сократить объем этой информации для отдельных модулей, используя в них директиву компилятора $L- или отменив в диалоговом окне Compiler Options параметр Local Symbols (Информация о локальных идентификаторах).



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



Отладка в интегрированной среде


Интегрированная интерактивная среда разработки программ Borland Pascal (IDE) включает в себя ряд средств, облегчающих разработку программ: автоматическое управление проектами, средств обеспечения модульной структуры программы, быструю компиляцию и простые в использовании оверлеи. Но несмотря на все это ваша программа все равно может содержать ошибки, что не позволит ей корректно работать.

IDE для DOS Borland Pascal предоставляет вам инструменталь- ные средства для отладки программ, то есть поиска и исправления ошибок. В этой главе описываются инструментальные средства и про- цедуры отладки программы в интегрированной среде, включая следую- щие темы:

* обзор ошибок и методов отладки;

* управление выполнением программы;

* проверка значений;

* остановки выполнения программы.

Данная глава посвящена встроенному отладчику IDE для DOS. Все описанные процедуры применимы также к Турбо отладчику (Turbo Debugger) и Турбо отладчику для Windows, хотя имена меню и нажи- маемые клавиши в них могут отличаться.



Использование двух мониторов


IDE предоставляет вам возможность использования для целей отладки второго монитора. Этот монитор должен быть монохромным дисплеем (поскольку использует память, отличную от цветного дисп- лея), и вам нужно будет запустить IDE с параметром /D. В режиме с двумя мониторами экран IDE выводится на монохромном экране, вывод вашей программы - на цветном экране, а переключение экранов не выполняется.



Использование точек останова


Borland Pascal дает вам возможность устанавливать в свое программе для целей отладки точки останова. Точка останова - это обозначенная в коде программы позиция, в которой вы хотите прек- ратить выполнение программы и вернуть выполнение отладчику. В этом смысле точка останова работает аналогично команде Go to Cursor, при которой программа выполняется обычным путем до дости- жения определенной точки. Основное различие состоит в том, что вы можете задать несколько точке останова и точки останова, которые будут срабатывать не при каждом их достижении.



Какие существуют виды ошибок?


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

Ошибки этапа компиляции

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

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

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

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

Ошибки этапа выполнения

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

Когда программа Borland Pascal обнаруживает такую ошибку, она завершает выполнение и выводит сообщение следующего вида:

Run-time error ## at seg:ofs

Если вы выполняете программу из IDE, Borland Pascal автома- тически находит вызвавший ошибку оператор (как в случае синтакси- ческих ошибок). Если вы выполняете программу вне IDE, то вы може- те запустить IDE и, чтобы найти вызвавший ошибку оператор, ис- пользовать команду Search|Find Error, которая дает вам адрес сег- мента и смещения (seg:ofs). Если вы используете компилятор ко- мандной строки, то можете для поиска ошибки использовать параметр /F.

Логические ошибки

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

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



Методы отладки


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

В данном разделе описываются различные возможности отладки в IDE для DOS Borland Pascal.

Выполнение по шагам и трассировка

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

Остановка выполнения

Существует два способа сообщить IDE, что программу нужно вы- полнить до определенной точки, а затем остановить. Первый и прос- тейший способ состоит в том, чтобы найти позицию в программе, где вы хотите остановиться, затем выбрать в меню Run команду Go to Cursor (Выполнение до позиции курсора). Ваша программа выполняет- ся как обычно, пока не достигнет оператора, где она должна оста- новиться. В этой точке вы можете проверить значения и продолжать выполнение непрерывно или по шагам.

Второй способ состоит в том, чтобы остановить в определенной заданной точке вашу программу. Эта точка называется точкой оста- нова. Когда вы выполняете программу, она останавливается перед выполнением оператора в точке останова. Точки останова - это бо- лее гибкий механизм, чем использование метода выполнения до пози- ции курсора (Go to Cursor), поскольку в программе вы можете уста- новить несколько точек останова.


Отслеживание и модификация

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

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

Поиск

Если вам нужно найти в программе описания процедуры или функции, либо определения объекта, это легко можно сделать с по- мощью средства просмотра объектов ObjectBrowser. С помощью меню Search и выбора команд Objects, Globals, Units или Symbols выбе- рите соответствующее окно просмотра. См. Главу 4 ("Программирова- ние в интегрированной среде для DOS"), где о просмотре кода расс- казывается более подробно.


Модификация точек останова


В процессе сеанса отладки IDE отслеживает все точки остано- ва. Вместо того, чтобы шарить по исходному коду в поиске точек останова, она обслуживать точки останова в одном диалоговом окне Breakpoints. Для вывода диалогового окна Breakpoints выберите ко- манду View|Breakpoints. В этом диалоговом окне вы можете устанав- ливать, удалять, редактировать и просматривать свои точки остано- ва.

Командные кнопки диалогового окна Breakpoints работают сле- дующим образом:

* Чтобы добавить новую точку останова, подсветите пустую строку в списке и выберите командную кнопку Edit.

* Чтобы отменить точку останова, подсветите ее и выберите кнопку Clear.

* Чтобы модифицировать существующую точку останова, подсве- тите ее и выберите командную кнопку Edit.

* Чтобы найти в своем исходном коде точку останова, подсве- тите ее и выберите кнопку View.

* Чтобы удалить все точки останова, выберите командную кноп- ку Clear All.



Окно Output


IDE для DOS предусматривает для экрана пользователя окно, которое называется окном вывода. Выбрав команду меню Debug| Output, вы можете открыть (вывести на переднем плане) активное окно, содержащее вывод программы. Настроить размер этого окна можно аналогично окну редактирования.



Отмена точке останова


Чтобы отменить точку останова, поместите курсор на содержа- щую ее строку и выберите в локальном меню окна редактирования ко- манду Toggle Breakpoint или нажмите клавиши Ctrl+F8.



Отслеживание вывода программы


При выполнении программы по шагам часто полезно просмотреть вывод программы, называемый экраном пользователя. В прикладной программе Windows это достаточно просто, так как программа уже выполняется в отдельном окне. Однако в DOS это не так легко. К счастью, Borland Pascal предоставляет вам несколько способов просмотра экрана пользователя.



Переключение экранов


В любой момент сеанса отладки вы можете выполнять переключе- ние экрана IDE и экрана пользователя. Чтобы вывести экран пользо- вателя, нажмите клавиши Alt+F5. Чтобы вернуться в IDE, нажмите любую клавишу или щелкните "мышью".

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

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



Поиск нужного места


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

Возврат

Иногда в ходе отладки полезно узнать, как вы попали в данную часть кода. Окно Call Stack (Стек вызова) показывает вам последо- вательность вызовов процедур или функций, которые привели к теку- щему состоянию (глубиной до 128 уровней). Для вывода окна Call Stack используйте команду Debug|Call Stack.

Окно Call Stack особенно полезно использовать, если вы слу- чайно начали трассировку кода, который хотели бы выполнить за один шаг. В стеке вызовов вы можете найти тот вызов, который на- чали трассировать по ошибке, затем выбрать команду Run to Cursor, чтобы выполнить за один шаг остальную часть вызова.



Повторное выполнение


В ходе сеанса отладки иногда желательно начать все сначала. Выберите команду Run|Reset Program или нажмите клавиши Ctrl+F2. Это приведет к полному сбросу, так что выполнение по шагам, или трассировка начнется в начале основной программы.



Прерывание программы без точек останова


Даже если вы не установите точек останова, то все равно смо- жете выйти в отладчик при выполнении программы из IDE. В любой момент работа программы нажмите клавиши Ctrl+Break. Отладчик на- ходит позицию в исходном коде, где вы прервали программу. Как и в случае обычно точки останова вы можете затем выполнить программу по шагам, трассировать ее, отследить или вычислить выражения.

| |



Просмотр выражений


Если вы хотите отслеживать значение переменной или выражения при выполнении программы по шагам, то можете открыть окно прос- мотра Watches. Это окно IDE показывает переменные и их значения в каждый конкретный момент.

Чтобы открыть окно Watches, выберите команду Window|Watch. IDE открывает активное окно Watches без активных записей. Если вы выберите переменную для просмотра, IDE автоматически открывает окно Watches (если вы этого еще не сделали).

Добавление просматриваемого выражения

Чтобы добавить в окно Watches переменную, выберите команду Debug|Watch|Add Watch или нажмите клавиши Ctrl+F7. Если окно Watches является активным окном, вы можете добавить выражение просмотра, нажав клавишу Ins. Отладчик открывает диалоговое окно, запрашивающее у вас тип просматриваемого выражения. По умолчанию выражением считается слово в позиции курсора в текущем окне ре- дактирования. Просматриваемые выражения, которые вы отслеживали ранее, сохраняются в списке протокола.

Отслеживание текущего просматриваемого выражения

Последнее добавленное или модифицированное просматриваемое выражение является текущим просматриваемым выражением, которое указывается выводимым слева от него символом жирной левой точки. Если окно Watches активно, вы можете также удалить текущее выра- жение, нажав клавишу Del или Ctrl+Y. Чтобы удалить все просматри- ваемые выражения, выберите команду Debug|Watch|Remove All Watches.

Редактирование просматриваемых выражений

Чтобы отредактировать просматриваемое выражение, нужно дваж- ды щелкнуть на этом выражении "мышью" или сделать это выражение текущим, затем нажать клавишу Enter или выбрать команду Debug| Watch|Edit Watch. Отладчик открывает диалоговое окно, аналогичное тому, которое используется для добавления просматриваемого выра- жения, которое позволяет вам отредактировать текущее выражение. При выборе командной кнопки OK или нажатии клавиши Enter отредак- тированное выражение заменяет оригинал.

Форматирование просматриваемых выражений

Окно Watches позволяет вам несколькими способами форматиро- вать просматриваемые выражения, добавляя запятую и один или более спецификаторов формата. Например, хотя целочисленные значения вы- водятся обычно в десятичном виде, указав после него ,H, вы можете задать вывод выражения в шестнадцатиричном формате. Допустимые спецификаторы формата и их действие перечисляются в Таблице 6.2.



Просмотр значений


Выполнение программы по шагам или ее трассировка могут по- мочь вам найти ошибки в алгоритме программы, но обычно желательно также знать, что происходит на каждом шаге со значениями отдель- ных переменных. Например, при выполнении по шагам цикла for по- лезно знать значение переменной цикла. IDE Borland Pascal имеет два инструментальных средства для проверки содержимого переменных программы: окно Watches (Просмотр) и диалоговое окно Evaluate and Modify (Вычисление и модификация).



Создание условный точек останова


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

Подсчет числа проходов

Задание для точки останова счетчика проходов сообщает отлад- чику, что останавливать программу нужно не при каждом достижении точки останова, а только на n-ый раз. То есть, если счетчик про- ходов равен 3, то отладчик останавливает программу только при третьем достижении данной точки останова.

Проверка условий

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



Спецификаторы формата в выражениях отладчика


Таблица 6.2 +--------------+---------------------+--------------------------+ | Символ | Тип, на который | Функция | | | он влияет | | +--------------+---------------------+--------------------------| | $, H или X | целочисленные типы | Шестнадцатиричный. Выво-| | | | дит целочисленные значе-| | | | ния в префиксом $, вклю-| | | | чая те, которые содержат-| | | | ся в структуре данных. | +--------------+---------------------+--------------------------| | C | Char, строковые | Символьный. Выводит спе-| | | типы | циальные символы для ко-| | | | дов ASCII 0..31. По умол-| | | | чанию такие символы выво-| | | | дятся в виде значений| | | | #xx. | +--------------+---------------------+--------------------------| | D | целочисленные | Десятичный. Выводят цело-| | | типы | численные значения в де-| | | | сятичном виде (включая| | | | те, которые содержатся в| | | | структурах данных). | +--------------+---------------------+--------------------------| | Fn | с плавающей точкой | С плавающей точкой. Выво-| | | | дит n значащих цифр, где| | | | n лежит в диапазоне 2..18| | | | (по умолчанию - 11). | +--------------+---------------------+--------------------------| | nM | все | Дамп памяти. Выводит n| | | | байт памяти, начиная с| | | | адреса, указываемого вы-| | | | ражением. Если n не зада-| | | | но, то по умолчанию оно| | | | равно значению размера в| | | | байтах типа переменной. | +--------------+---------------------+--------------------------| | P | указатели | Указатель. Выводит указа-| | | | тели по адресу сегм:смещ| | | | (на не Ptr(сегм:смещ),| | | | как это делается по умол-| | | | чанию. | +--------------+---------------------+--------------------------| | R | записи, объекты | Запись. Выводит имена по-| | | | лей, например, (X:1;| | | | Y:10; Z:5) вместо (1, 10,| | | | 5). | +--------------+---------------------+--------------------------| | S | Char, строки | Строки. Выводит символы| | | | ASCII 0..31 в виде #xx.| | | | Использует только для мо-| | | | дификации дампов памяти| | | | (см. выше nM). | +--------------+---------------------+--------------------------+



Трассировка или выполнение по шагам?


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

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

Примечание: О модулях и их секциях инициализации расс- казывается в Главе 7 "Модули Borland Pascal".

Пошаговое выполнение и трассировка методов объектов

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

Пошаговое выполнение и трассировка внешнего кода

Если вы выполняете в программе компоновку с внешним кодом, используя для этого директиву компилятора {$L имя_файла}, то если компонуемый файл .OBJ содержит отладочную информацию, вы можете трассировать этот код или выполнять его по шагам. Borland Pascal ничего не знает об отлаживаемом вами коде в этих модулях, но он будет показывать вам соответствующие строки в исходном коде.

Примечание: Требования к внешнему коду поясняются в Главе 25 "Руководства по языку".

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



Трассировка программы


Трассировка программы во многом аналогичная ее выполнению по шагам. Единственное исключение состоит в том, что когда встреча- ется оператор вызова процедуры или функции, при трассировке эти процедуры и функции также выполняются по шагам, а при простом вы- полнении по шагам управление возвращается вам после завершения выполнения подпрограммы.

Например, чтобы выполнить трассировку кода в Примере 6.1, загрузите файл, затем выберите команду Run|Trace Into или нажмите клавишу F7. Когда вы в первый раз делаете это, управление переме- щается на оператор begin основной программы. Повторное нажатие F7 снова перемещает строку управления на оператор for. После этого нажатие клавиши F7 трассирует вызов функции Negate - строка вы- полнения перемещается на оператор begin в блоке функции. Если вы продолжаете нажимать F7, строка выполнения перемещается по функ- ции, а затем, когда вы дойдете до оператора end, возвращается к оператору вызова.

Формат вашей программы влияет на поведение строки выполнения при трассировке, хотя и не в такой степени как при пошаговом вы- полнении. Если код сформатирован как в Примере 6.1, то трассиров- ка оператора for приводит к выполнению 10 раз функции Negate. Ес- ли вы разобъете оператор for на две строки, как в Примере 6.2, то трассировка оператора end функции возвращает строку выполнения ту строку основной программы, которая будет выполняться следующей. Первые девять раз это снова будет вызов функции. В десятый раз строка выполнения перемещается на оператор end программы.



Управление выполнением


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

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

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



Вычисление и модификация


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

Вычисление выражений

Чтобы вычислить выражение, выберите команду Debug|Evaluate/ Modify или нажмите клавиши Ctrl+F4. Отладчик выводит диалоговое окно Evaluate and Modify (Вычисление и модификация). По умолчанию слово в позиции курсора в текущем окне редактирования выводится подсвеченным в поле Expression (Выражение). Вы можете отредакти- ровать это выражение, набрать другое выражение или выбрать вычис- ляемое вами ранее выражение из списка протокола.

Когда вы нажимаете Enter или щелкаете "мышью" на командной кнопке Evaluate, текущее значение выражения в поле Expression по- казывается в поле Result.

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

Модификация переменных

Во время отладки с помощью диалогового окна Evaluate and Modify вы можете изменить значение переменной. Введите переменную в поле Expression, затем в поле New Value наберите новое значение.

При изменении значений переменных следует иметь в виду сле- дующее:

* Вы можете изменять только отдельные переменные или элемен- ты массивов или записей, но не сами массивы и записи.

* Выражения в поле New Value должны отвечать ограничениям для выражений, перечисленных в Таблице 6.1.

* Выражение в поле New Value (Новое значение) должно в ре- зультате вычисления давать результат, совместимый по прис- ваиванию с переменной, которой вы хотите ее присвоить. Здесь можно руководствоваться следующим правилом: если присваивание дает при компиляции ошибку, то оно не являет- ся допустимым значением модификации.



Выполнение больших фрагментов


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

Чтобы задать в программе точку, до которой вы хотите ее вы- полнить, а затем остановиться, используйте команду Run|Go To Cursor (Выполнение|Выполнение до курсора) или клавишу F4. (Этим вы сообщите отладчику, что не хотите выполнять программу по ша- гам, пока не достигнете заданной точки.) Позиционируйте курсор на той строке, где вы хотите возобновить управление отладкой, затем нажмите клавишу F4. Заметим, что вы можете сделать это как в на- чале сеанса отладки, так и когда уже выполните часть программы по шагам или протрассируете.



Выполнение программы по шагам


Выполнение по шагам - это простейший способ выполнения прог- раммы по элементарным фрагментам. Выбор команды Run|Step Over или нажатие клавиши F8 вызывает выполнение отладчиком всего кода в операторе, указанном строкой выполнения, включая любые вызываемые на ней процедуры или функции, пока управление не вернется обратно к вам. После этого строка выполнения указывает следующий выполня- емый оператор.

Возьмем, например, следующий пример программы:

program StepTest;

function Negate(X: Integer): Integer; begin Negate := -X; end;

var I: Integer; begin for I := 1 to 10 do Writeln(Negate(I)); end.

Пример 6.1 Простая программа, выполняемая по шагам.

Если в окне редактирования вы выведите StepTest и нажмете клавишу F8, то строка выполнения перемещается на оператор begin в начале основного цикла, поскольку это первое, что выполняется в программе. Второе нажатие клавиши F8 выполняет begin и перемещает строку выполнения вниз до оператора for на следующей строке. Пос- ле этого нажатие F8 вызывает выполнение всего цикла for; на экран пользователя выводятся числа от -1 до -10, а строка выполнения перемещается к end.

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

begin for I := 1 to 10 do Writeln(Negate(I)); end.

Пример 6.2 Изменение формата кода для лучшего выполнения по шагам.

Поскольку оператор Паскаля может занимать несколько строк, такая программа будет в точности эквивалентна предыдущей версии, а генерируемый код будет идентичен. Но поскольку оператор Writeln теперь находится на отдельной строке, отладчик может интерпрети- ровать его отдельно. Если теперь вы будете нажимать клавишу F8, то увидите, что строка выполнения будет при выполнении цикла 10 раз возвращаться на Writeln.



Задание точек останова


Чтобы установить в своем в своем коде точку останова, пере- местите курсор на той строке, где вы хотите остановиться. Строка должна содержать выполняемый код и не может быть комментарием, описанием или пустой строкой. Выбор команды Toggle Breakpoint в локальном меню окна редактирования или нажатие клавиш Ctrl+F8 ус- танавливает на строке точку останова, которая обозначается подс- веткой всей строки.

Теперь при выполнении программы из IDE она будет останавли- ваться при достижении данной строки, но перед ее выполнением. Строка, содержащая точку останова, выводится при этом в окне ре- дактирования как строка выполнения. В этот момент вы можете вы- полнить любые другие действия по отладке (выполнение программы по шагам, трассировку, просмотр и вычисление).