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

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

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

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

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

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

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

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

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

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

Ошибки этапа компиляции или синтаксические ошибки происходят, когда ваш исходный код нарушает правила синтаксиса Паскаля. 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»), где о просмотре кода рассказывается более подробно.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Выполнение по шагам - это простейший способ выполнения программы по элементарным фрагментам. Выбор команды 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.

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

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

Например, чтобы выполнить трассировку кода в Примере 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 выполняет всю инициализацию, возвращая управление на следующий оператор только после того, как все будет завершено; при трассировке выполняется трассировка кода инициализации.

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

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

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

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

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

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

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

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

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

Чтобы задать в программе точку, до которой вы хотите ее выполнить, а затем остановиться, используйте команду 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. Это приведет к полному сбросу, так что выполнение по шагам, или трассировка начнется в начале основной программы.

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

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

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

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

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

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

Окно Output

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

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

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

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

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

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

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

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

Если вы хотите отслеживать значение переменной или выражения при выполнении программы по шагам, то можете открыть окно прос- мотра 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.

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

Таблица 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).           |
+--------------+---------------------+--------------------------+

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

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

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

Чтобы вычислить выражение, выберите команду 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 (Новое значение) должно в результате вычисления давать результат, совместимый по присваиванию с переменной, которой вы хотите ее присвоить.
    Здесь можно руководствоваться следующим правилом: если присваивание дает при компиляции ошибку, то оно не является допустимым значением модификации.

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

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

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

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

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

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

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

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

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

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

* Чтобы добавить новую точку останова, подсветите пустую строку в списке и выберите командную кнопку Edit. * Чтобы отменить точку останова, подсветите ее и выберите кнопку Clear. * Чтобы модифицировать существующую точку останова, подсветите ее и выберите командную кнопку Edit. * Чтобы найти в своем исходном коде точку останова, подсветите ее и выберите кнопку View. * Чтобы удалить все точки останова, выберите командную кнопку Clear All.

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

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

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

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

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

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

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

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

 
doc/pascal/user_bp/глава_6._отладка_в_интегрированной_среде.txt · Последнее изменение: d.m.Y H:i — romtek
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki