Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Руководство пользователя 15 страница



 

Когда программа Borland Pascal обнаруживает такую ошибку,

она завершает выполнение и выводит сообщение следующего вида:

 

Run-time error ## at seg:ofs

 

Если вы выполняете программу из IDE, Borland Pascal автома-

тически находит вызвавший ошибку оператор (как в случае синтакси-

ческих ошибок). Если вы выполняете программу вне IDE, то вы може-

те запустить IDE и, чтобы найти вызвавший ошибку оператор, ис-

пользовать команду Search│Find Error, которая дает вам адрес сег-

мента и смещения (seg:ofs). Если вы используете компилятор ко-

мандной строки, то можете для поиска ошибки использовать параметр

/F.


 

B.Pascal 7 & Objects /UG - 142 -

 

 

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

 

Логические ошибки - это ошибки проектирования и реализации

программы. То есть, ваши операторы допустимы и что-то делают, но

не то, что вы предполагали. Эти ошибки часто трудно отследить,

поскольку IDE не может найти их автоматически, как синтаксические

и семантические ошибки. К счастью, IDE включает в себя средства

отладки, помогающие вам найти логические ошибки.

 

Логические ошибки приводят к некорректному или непредвиден-

ному значению переменных, неправильному виду графических изобра-

жений или невыполнению кода, когда это ожидается. В остальной

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

ошибок.

 

 


 

B.Pascal 7 & Objects /UG - 143 -

 

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

─────────────────────────────────────────────────────────────────

 

Иногда, когда программа делает что-то непредвиденная, причи-

на достаточно очевидна, и вы можете быстро исправить код програм-

мы. Но другие ошибки более трудноуловимы и вызываются взаимодейс-

твие различных частей программы. В этих случаях лучше всего оста-

новить вашу программу в заданной точке, пройти ее шаг за шагом и

просмотреть состояние переменных и выражений. Такое управляемое

выполнение - ключевой элемент отладки.

 

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

IDE для DOS Borland Pascal.

 

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

 

Команды выполнения по шагам Step Over и трассировки Trace

Into меню выполнения Run дают вам возможность построчного выпол-

нения программы. Единственное отличие выполнения по шагам и трас-



сировки состоит в том, как они работают с вызовами процедур и

функций. Выполнение по шагам вызова процедуры или функции интерп-

ретирует вызов как простой оператор и после завершения подпрог-

раммы возвращает управление на следующую строку. Трассировка

подпрограммы загружает код этой подпрограммы и продолжает ее

построчное выполнение.

 

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

 

Существует два способа сообщить IDE, что программу нужно вы-

полнить до определенной точки, а затем остановить. Первый и прос-

тейший способ состоит в том, чтобы найти позицию в программе, где

вы хотите остановиться, затем выбрать в меню Run команду Go to

Cursor (Выполнение до позиции курсора). Ваша программа выполняет-

ся как обычно, пока не достигнет оператора, где она должна оста-

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

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

 

Второй способ состоит в том, чтобы остановить в определенной

заданной точке вашу программу. Эта точка называется точкой оста-

нова. Когда вы выполняете программу, она останавливается перед

выполнением оператора в точке останова. Точки останова - это бо-

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

ции курсора (Go to Cursor), поскольку в программе вы можете уста-

новить несколько точек останова.

 

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

 

При выполнении программы по шагам вы можете наблюдать ее вы-

вод несколькими способами. Первый состоит в переключении в случае

необходимости экранов. При втором способе используется второй мо-

нитор. В-третьих, для вывода программы вы можете открыть окно в

IDE для DOS.

 


 

B.Pascal 7 & Objects /UG - 144 -

 

Кроме того, чтобы показать вывод программы, встроенный от-

ладчик позволяет вам просматривать значения переменных, выражений

и структур данных. С помощью команды Wathes в меню Debug в окне

просмотра Watches вы можете добавлять или удалять отслеживаемые

элементы. В этом диалоговом окне вы можете проверять переменные и

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

указатели, элементы массива и поля записей, что позволяет вам

проверять реакцию программы на различные условия.

 

Поиск

 

Если вам нужно найти в программе описания процедуры или

функции, либо определения объекта, это легко можно сделать с по-

мощью средства просмотра объектов ObjectBrowser. С помощью меню

Search и выбора команд Objects, Globals, Units или Symbols выбе-

рите соответствующее окно просмотра. См. Главу 4 ("Программирова-

ние в интегрированной среде для DOS"), где о просмотре кода расс-

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

 


 

B.Pascal 7 & Objects /UG - 145 -

 

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

─────────────────────────────────────────────────────────────────

 

Перед отладкой программы вам нужно указать компьютеру, что

нужно сообщить компилятору на необходимость генерации некоторой

дополнительной информации, благодаря которой он сможет отслежи-

вать, какие строки исходного кода соответствуют отдельным частям

выполняемой программы. Эта дополнительная информация называется

отладочной информацией. Вы можете включить эту информации, выбрав

соответствующий параметр (кнопку с независимой фиксацией)

диалогового окна Compiler Options интегрированной среды (команда

Options│Compiler) или включив в код программы соответствующую ди-

рективу компилятора.

 

Когда вы компилируете программу Borland Pascal, компилятор

всегда сохраняет список используемых идентификаторов, который на-

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

имена всех переменных, констант, типов, процедур и функций. Для

целей отладки там сохраняются также номера строк исходных файлов,

где встречаются все эти идентификаторы. Выбрав в диалоговом окне

Compiler Options параметр Debug Information (Отладочная информа-

ция) или задав директиву компилятора $D+, вы указываете компиля-

тору, что в таблицу идентификаторов нужно добавить информацию о

номерах строк.

 

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

 

В диалоговом окне параметров отладчика Debugger Options

(Options│Debugger) вы можете сообщить компилятору, нужно ли гене-

рировать отладочную информацию для использования встроенного или

автономного отладчика (такого как Turbo Debugger), или для обоих.

Если вы хотите использовать встроенный отладчик, то нужно выбрать

параметр Integrated (который устанавливается по умолчанию).

 

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

 

Если вы пишете большую программу, которая использует модули,

и отладочная информация получается слишком объемной, вы можете

сократить объем этой информации для отдельных модулей, используя

в них директиву компилятора $L- или отменив в диалоговом окне

Compiler Options параметр Local Symbols (Информация о локальных

идентификаторах).

 

Если вы выключите для модуля генерацию информации о локаль-

ных идентификаторах, то из отладочной информации для этого модуля

исключаются все идентификаторы, описанные в секции реализации мо-

дуля. Для всех идентификаторов в интерфейсной секции будет гене-

рироваться информацию для всех идентификаторов, так что вы сможе-

те использовать средства отладки.

 


 

B.Pascal 7 & Objects /UG - 146 -

 

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

─────────────────────────────────────────────────────────────────

 

Основной смысл использования встроенного отладчика состоит в

управляемом выполнении. Отслеживая выполнение каждой инструкции,

вы можете легко определить, какая часть вашей программы вызывает

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

равления выполнением программы, которые позволяют вам:

 

- выполнять инструкции по шагам;

- трассировать инструкции;

- выполнять программу до заданной точки;

- находить определенную точку;

- выполнять сброс программы.

 

Само по себе выполнение программы по шагам может быть недос-

таточно полезным, разве что поможет найти то место, где что-то

происходит совершенно неверно. Но управляемое выполнение дает вам

возможность проверять состояние программы и ее данных, например,

отслеживать вывод программы и ее переменные, как описывается в

данной главе.

 


 

B.Pascal 7 & Objects /UG - 147 -

 

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

─────────────────────────────────────────────────────────────────

 

Когда вы отлаживаете программу, наименьшим выполняемым эле-

ментом является строка. Этот означает, что вы можете управлять

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

этому, если на одной строке программы содержится несколько опера-

торов Паскаля, вы не сможете отладить эти операторы индивидуаль-

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

на несколько строк, которые будут выполняться за один шаг.

 

Все выполнение в отладчике, включая выполнение по шагам,

трассировку и останов, основывается на строках. Подсвечивая стро-

ку, встроенный отладчик всегда сообщает вам, какую строку вы вы-

полняете следующей (строка выполнения). Строка выполнения выво-

дится цветом, отличным от нормального цвета. Благодаря этому вы

можете легко видеть, где находитесь.

 

 

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

─────────────────────────────────────────────────────────────────

 

Выполнение по шагам - это простейший способ выполнения прог-

раммы по элементарным фрагментам. Выбор команды 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; на экран


 

B.Pascal 7 & Objects /UG - 148 -

 

пользователя выводятся числа от -1 до -10, а строка выполнения

перемещается к end.

 

Хотя функция Negate вызывается 10 раз, строка выполнения ни-

когда на нее не перемещается. Выполнение по шагам позволяет от-

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

Выполнение по шагам вызывает выполнение всего цикла for сразу,

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

Если вы хотите видеть подробности цикла, внесите в пример следую-

щее простое изменение.

 

begin

for I:= 1 to 10 do

Writeln(Negate(I));

end.

 

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

шагам.

 

Поскольку оператор Паскаля может занимать несколько строк,

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

а генерируемый код будет идентичен. Но поскольку оператор Writeln

теперь находится на отдельной строке, отладчик может интерпрети-

ровать его отдельно. Если теперь вы будете нажимать клавишу F8,

то увидите, что строка выполнения будет при выполнении цикла 10

раз возвращаться на Writeln.

 


 

B.Pascal 7 & Objects /UG - 149 -

 

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

─────────────────────────────────────────────────────────────────

 

Трассировка программы во многом аналогичная ее выполнению по

шагам. Единственное исключение состоит в том, что когда встреча-

ется оператор вызова процедуры или функции, при трассировке эти

процедуры и функции также выполняются по шагам, а при простом вы-

полнении по шагам управление возвращается вам после завершения

выполнения подпрограммы.

 

Например, чтобы выполнить трассировку кода в Примере 6.1,

загрузите файл, затем выберите команду Run│Trace Into или нажмите

клавишу F7. Когда вы в первый раз делаете это, управление переме-

щается на оператор begin основной программы. Повторное нажатие F7

снова перемещает строку управления на оператор for. После этого

нажатие клавиши F7 трассирует вызов функции Negate - строка вы-

полнения перемещается на оператор begin в блоке функции. Если вы

продолжаете нажимать F7, строка выполнения перемещается по функ-

ции, а затем, когда вы дойдете до оператора end, возвращается к

оператору вызова.

 

Формат вашей программы влияет на поведение строки выполнения

при трассировке, хотя и не в такой степени как при пошаговом вы-

полнении. Если код сформатирован как в Примере 6.1, то трассиров-

ка оператора for приводит к выполнению 10 раз функции Negate. Ес-

ли вы разобъете оператор for на две строки, как в Примере 6.2, то

трассировка оператора end функции возвращает строку выполнения ту

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

Первые девять раз это снова будет вызов функции. В десятый раз

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

 

 

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

─────────────────────────────────────────────────────────────────

 

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

действие, кроме того случая, когда строка выполнения находится

под строкой вызова процедуры или функции, или когда вы выполняете

оператор begin в начале программы или модуля, который использует

другие модули.

 

Выполнение begin в блоке begin..end основной программы вызы-

вает код инициализации для любого используемого в программе моду-

ля в том порядке, который указывается в операторе uses программы.

Аналогично, выполнение оператора begin в начале секции инициали-

зации вызывает код инициализации для любых модулей, используемых

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

этих случаях как и можно ожидать - пошаговое выполнение begin вы-

полняет всю инициализацию, возвращая управление на следующий опе-

ратор только после того, как все будет завершено; при трассировке

выполняется трассировка кода инициализации.

 

Примечание: О модулях и их секциях инициализации расс-


 

B.Pascal 7 & Objects /UG - 150 -

 

казывается в Главе 7 "Модули Borland Pascal".

 

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

 

Если вы используете в своей программе объекты, отладчик ин-

терпретирует свои методы аналогично тому, как он интерпретирует

обычные процедуры и функции. Пошаговое выполнение метода интерп-

ретирует метод как один шаг, возвращая управление к отладчику

после того как метод завершает выполнение. Трассировка метода

загружает и выводит на экран код метода и трассирует его операто-

ры.

 

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

 

Если вы выполняете в программе компоновку с внешним кодом,

используя для этого директиву компилятора {$L имя_файла}, то если

компонуемый файл.OBJ содержит отладочную информацию, вы можете

трассировать этот код или выполнять его по шагам. Borland Pascal

ничего не знает об отлаживаемом вами коде в этих модулях, но он

будет показывать вам соответствующие строки в исходном коде.

 

Примечание: Требования к внешнему коду поясняются в

Главе 25 "Руководства по языку".

 

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

включая Си, С++ и ассемблер. Если код отвечает требованиям для

внешней компоновки и содержит полную стандартную отладочную ин-

формацию, интегрированная среда отладчика может выполнять его по

шагам или трассировать.

 


 

B.Pascal 7 & Objects /UG - 151 -

 

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

─────────────────────────────────────────────────────────────────

 

Иногда, конечно, нежелательно выполнять по шагам всю прог-

рамму только для того, чтобы добраться до того места, где возни-

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

большой фрагмент программы до той точки, где вы хотите начать вы-

полнение по шагам.

 

Чтобы задать в программе точку, до которой вы хотите ее вы-

полнить, а затем остановиться, используйте команду Run│Go To

Cursor (Выполнение│Выполнение до курсора) или клавишу F4. (Этим

вы сообщите отладчику, что не хотите выполнять программу по ша-

гам, пока не достигнете заданной точки.) Позиционируйте курсор на

той строке, где вы хотите возобновить управление отладкой, затем

нажмите клавишу F4. Заметим, что вы можете сделать это как в на-

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

шагам или протрассируете.

 

 

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

─────────────────────────────────────────────────────────────────

 

IDE предусматривает два способа поиска в программе заданного

места. Простейший способ предоставляет команда Find Procedure ме-

ню Search. Команда Find Procedure (Поиск процедуры) запрашивает у

вас имя процедуры или функции, затем находит соответствующую

строку в файле, где определяется эта подпрограмма. Этот подход

полезно использовать при редактировании, но его можно комбиниро-

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

чтобы пройти программу до той части кода, которую вы хотите отла-

дить.

 

Возврат

 

Иногда в ходе отладки полезно узнать, как вы попали в данную

часть кода. Окно Call Stack (Стек вызова) показывает вам последо-

вательность вызовов процедур или функций, которые привели к теку-

щему состоянию (глубиной до 128 уровней). Для вывода окна Call

Stack используйте команду Debug│Call Stack.

 

Окно Call Stack особенно полезно использовать, если вы слу-

чайно начали трассировку кода, который хотели бы выполнить за

один шаг. В стеке вызовов вы можете найти тот вызов, который на-

чали трассировать по ошибке, затем выбрать команду Run to Cursor,

чтобы выполнить за один шаг остальную часть вызова.

 

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

─────────────────────────────────────────────────────────────────

 

В ходе сеанса отладки иногда желательно начать все сначала.

Выберите команду Run│Reset Program или нажмите клавиши Ctrl+F2.

Это приведет к полному сбросу, так что выполнение по шагам, или


 

B.Pascal 7 & Objects /UG - 152 -

 

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

 

 

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

─────────────────────────────────────────────────────────────────

 

При выполнении программы по шагам часто полезно просмотреть

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

программе Windows это достаточно просто, так как программа уже

выполняется в отдельном окне. Однако в DOS это не так легко. К

счастью, Borland Pascal предоставляет вам несколько способов

просмотра экрана пользователя.

 

 

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

─────────────────────────────────────────────────────────────────

 

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

ние экрана IDE и экрана пользователя. Чтобы вывести экран пользо-

вателя, нажмите клавиши Alt+F5. Чтобы вернуться в IDE, нажмите

любую клавишу или щелкните "мышью".

 

При выполнении программы отладчик также может переключать

экраны автоматически. Управлять характером переключения экранов

вы можете с помощью параметров Display Swapping (Переключение эк-

рана) диалогового окна Debugger. По умолчанию задано эффективное

переключение. Это означает, что экран пользователя выводится

только в том случае, если выполняемый оператор выводит информацию

на экран или вызывает процедуру (даже если эта процедура ничего

на экран не выводит). После завершения вывода экран переключается

обратно в IDE.

 

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

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

их вовсе. Переключение экранов для каждой строки полезно исполь-

зовать, если ваша программа посылает информацию непосредственно

на экран, что может затереть содержимое экрана IDE.

 

 

Окно Output

─────────────────────────────────────────────────────────────────

 

IDE для DOS предусматривает для экрана пользователя окно,

которое называется окном вывода. Выбрав команду меню Debug│

Output, вы можете открыть (вывести на переднем плане) активное

окно, содержащее вывод программы. Настроить размер этого окна

можно аналогично окну редактирования.

 

 

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

─────────────────────────────────────────────────────────────────

 

IDE предоставляет вам возможность использования для целей


 

B.Pascal 7 & Objects /UG - 153 -


Дата добавления: 2015-09-30; просмотров: 26 | Нарушение авторских прав







mybiblioteka.su - 2015-2024 год. (0.062 сек.)







<== предыдущая лекция | следующая лекция ==>