Отладка программ пользователя в Tubro Pascal
Думаю, вы не раз сталкивались с тем, что программа отказывалась работать так, как надо. Часто эти ошибки приводят к тому, что решение задачи заходило в тупик. Тут и приходят на помощь обширные средства отладки программ Turbo Pascal. Обычно эти средства используются редко, а зря. Умелая отладка программы позволяет избежать многих подводных камней и создавать идеальные программы.
Введение.
Turbo Pascal предлагает сверхусовершенствованную среду, с автоматическим управлением проектом, модульной организацией программ, высокой скоростью компиляции, с легко используемыми оверлеями. Но даже используя все эти предоставленные средства, программы пользователя могут содержать ошибки, которые приводят к неправильной работе программы.
В помощь пользователю Turbo Pascal предоставляет средства, необходимые для отладки его программы, способствующие устранению всех ошибок в программе, ее тщательному тестированию и выполнению. Turbo Pascal позволяет легко определять местоположение ошибок во время компиляции и во время выполнения программы, а также позволяет включать или выключать автоматический контроль ошибок во время выполнения программы.
Особенно важно то, что Turbo Pascal имеет мощный и гибкий отладчик исходного уровня, который позволяет пользователю выполнять программу построчно, просматривать выражения и модифицировать переменные по мере необходимости. Отладчик встроен в интегрированную среду разработки (IDE) Turbo Pascal; пользователь может редактировать, компилировать и отлаживать программу даже не выходя из Turbo Pascal. Для больших или сложных программ, которые требуют использования всего диапазона средств отладки от машинного языка до вычисления выражений Паскаля, Turbo Pascal полностью поддерживает автономный отладчик фирмы Borland, Turbo Debugger.
|
Типы ошибок.
Существует три основных типа программных ошибок: ошибки времени компиляции, ошибки времени выполнения и логические ошибки.
Ошибки компиляции.
Ошибки компиляции или синтаксические ошибки встречаются, когда забывают объявить переменную, передают ошибочное количество параметров процедуры, при назначении действительного значения целочисленной переменной. Это означает, что записываются операторы, которые не согласуются с правилами Паскаля.
Turbo Pascal не закончит процесс компиляции программы пользователя (генерацию машинного кода), пока все синтаксические ошибки не будут удалены. Если Turbo Pascal обнаружит синтаксическую ошибку во время компиляции программы, он останавливает компиляцию, входит в исходный текст, указывает местоположение ошибки позиционированием курсора и выводит сообщение об ошибке в окно Edit. Как только пользователь исправит ошибку, он сможет начать процесс компиляции снова.
Если используется версия командной строки (TPC.EXE), Turbo Pascal будет выводить ошибочный оператор, номер строки и сообщение об ошибке. Затем пользователь может войти в любой используемый им редактор, найти заданную строку, исправить ошибку и перекомпилировать программу. Для дополнительной информации о сообщениях об ошибках см. Приложение А в Руководстве программиста.
Ошибки времени выполнения.
Другой тип ошибок - ошибки времени выполнения программы или семантические ошибки. Они встречаются, когда пользователь компилирует синтаксически корректную программу, которая пытается сделать что-нибудь запрещенное во время ее выполнения, например, открывает несуществующий файл для ввода или производит деление на 0. В этом случае Turbo Pascal выводит на экран следующее сообщение об ошибке: Runtime error ## at seg:ofs (Ошибка выполнения # в сегменте: смещение) и останавливает выполнение программы пользователя.
|
При использовании интегрированной среды Turbo Pascal определяет местоположение ошибки выполнения автоматически, осуществляя переход в окно редактирования для соответствующего исходный файл.
Если пользователь выполняет программу в среде MS-DOS, он будет возвращаться в MS-DOS. Пользователь может загрузить модуль TURBO.EXE и использовать опции Search/Find error для локализации позиции ошибки в исходной программе (убедитесь, что опция Destination установлена в Disk). Для обнаружения ошибки пользователь может также использовать и опцию /F для компилятора командной строки (TPC.EXE).
(Более полное объяснение опций командной строки TPC.EXE приведено в главе 9 "Компилятор командной строки".)
Логические ошибки.
Программа пользователя может содержать и логические ошибки. Это означает, что программа делает то, что ей указали вместо того, что хотелось бы. Может отсутствовать инициализация переменной; могут оказаться ошибочными вычисления; рисунки, изображенные на экране, выглядят неправильно; программа может просто работать не так, как было задумано. Такие ошибки находятся с большим трудом, и интегрированный отладчик поможет вам в этом случае наилучшим образом.
|
Интегрированный отладчик Turbo Pascal.
Некоторые ошибки времени выполнения (логические ошибки) незаметны и трудны для прослеживания. Другие ошибки могут скрываться за неуловимым взаимодействием разделов большой программы. В этих случаях необходимо интерактивное выполнение программы, во время которого производится наблюдение за значениями определенных переменных или выражений. Вам хотелось бы, чтобы Ваша программа останавливалась при достижении определенного места так, чтобы просмотреть, как она проработала этот кусок. Вам хотелось бы остановиться и изменить значения некоторых переменных во время выполнения программы, изменить определенный режим или проследить за реакцией программы. И вам хотелось бы сделать это в режиме, когда возможно быстрое редактирование, перекомпилирование и повторное выполнение программы.
Интегрированный отладчик Turbo Pascal имеет все описанные выше возможности и даже более того. Он представляет собой встроенную часть интегрированной усовершенствованной среды Turbo Pascal (IDE): для использования предлагаются две основные функции меню (Run, Debug), а также некоторые клавиши для команд отладчика. Для дополнительной информации об IDE горячих клавишах см. главу 7 "Справочник по IDE" или справочную информацию о Turbo Pascal.
Что может делать отладчик.
Интегрированный отладчик работает очень просто. Ему не требуются специальные инструкции в Вашем коде, он не увеличивает размер Вашего.EXE файла и не требует перекомпиляции для создания отдельного.EXE файла после окончания отладки.
Если Ваша программа разделена на ряд модулей, исходный код каждого из них автоматически загружается в редактор при трассировке.
Если Вы используете оверлеи, отладчик автоматически обрабатывает их внутри IDE, которая выполняет переключения между компилятором, редактором и отладчиком.
Обзор возможностей отладчика:
Трассировка. F7
Run/Trace Into Вы можете выполнить одну строку вашей программы, затем прерваться и посмотреть на результаты. При вызове процедуры или функции внутри вашей программы, Вы можете задать режим выполнения вызова как одного шага или режим трассировки этой процедуры или функции строка за строкой.
Вы можете так же трассировать вывод Вашей программы строка за строкой. Вы можете так же установить, чтобы экран переключался по необходимости или использовать два монитора. Вы можете так же установить экран вывода в отдельном окне.
Переход на курсор. F4
Run/Go to Сursor Вы можете передвинуть курсор на определенную строку в Вашей программе, а затем указать отладчику выполнить программу до достижения этой строки. Это позволяет обходить циклы или другие утомительные участки программы, это также позволяет перебираться в то место программы, откуда Вы хотите начать отладку.
Прерывание.
С помощью команды Debug/Breakpoints Вы можете пометить строки в Вашей программе как точки прерывания. Когда в процессе выполнения Вашей программы достигается точка прерывания, выполнение программы приостанавливается и отображается исходный текст и курсор останавливается на строке с точкой прерывания. Затем Вы можете проверить значения переменных, начать трассировку или выполнить программу до другой точки прерывания. Вы можете подключить условие к точке прерывания. Вы можете также прерваться в любой точке Вашей программы, нажав клавишу Ctrl-Break. Произойдет остановка на следующей строке исходной программы, как если бы в этой строке была установлена точка прерывания.
Наблюдение.
Debug/Watches Пользователь имеет возможность задавать для просмотра в окне Watch некоторые объекты (переменные, структуры данных, выражения). Просматриваемые данные меняются, отражая текущие изменения в программе при пошаговом выполнении.
Вычисление/модификация Ctrl-F4.
Debug/Evaluate/Modify Пользователь может вызвать окно Evaluate, что проверить значения переменных, структуру данных и выражения в интерактивном режиме. Используя окно Evaluate, Вы можете изменить значение любой переменной, включая строки, указатели, элементы массива и поля записей. Это обеспечивает простой механизм для проверки, как Ваш код реагирует на определенную установку значений или условий.
Поиск.
Пользователь может быстро находить объявления процедур или функций, даже если программа разбита на несколько модулей (Search/Find Рrocedure). Во время трассировки Вы можете быстро вернуться обратно из вызовов процедур или функций и проверить параметры каждого вызова (Window/Call Stack).
Подготовка к использованию отладчика.
До начала отладки Вы должны понимать, что основным элементом выполнения в отладчике является строка, а не оператор. Более точно наименьшим элементом выполнения является строка. Если на одной строке находится несколько операторов, они будут выполняться вместе при нажатии F7. С другой стороны, если один оператор размещен на нескольких строках, то при нажатии F7 будет выполняться весь оператор. Все команды выполнения основываются на строках, включая пошаговую отладку и точки прерывания; строка, на которой находится выполнение, всегда отмечена курсором выполнения.
Прежде, чем начать отладку программы, Вы должны задать для компилятора Turbo Pascal инструкцию по генерации таблицы символов и таблицы номеров строк этой программы. Таблица символов представляет собой небольшую базу данных со всеми используемыми идентификаторами - константами, типами, переменными, процедурами и информацией о номерах строк. Директивы компилятора $D+ и $L+ делают это по умолчанию; они соответствуют элементам меню Options/Compiler/Debug Information и Options/Compiler/Local Symbols. Так же по умолчанию установлена опция Options/Debugger/Integrated, которая генерирует отладочную информацию в выполнимом файле.
Директива {$D+} генерирует таблицу номеров строк, которая устанавливает соответствие между объектным кодом и исходным модулем. Директива {$L+} генерирует локальную отладочную информацию, а именно, строит список идентификаторов, локальных для каждой процедуры или функции, для того, чтобы отладчик мог хранить информацию о них в процессе отладки. Когда Вы используете директивы компилятора, разделяйте их запятыми и без пробелов, и ставя $ только перед первой директивой; например {$D+,L+}.
Примечание: Вы можете отключить эти переключатели для сохранения памяти или дискового пространства во время компиляции.
Когда Вы выполняете пошаговую отладку, Turbo Pascal будет иногда переключаться на экран пользователя, выполнять Ваш код, а затем возвращаться в интегрированную среду, ожидая следующей команды. Вы можете управлять переключением экрана с помощью установок Options/Debugger/Display Swapping, которые могут принимать 3 значения:
Smart: Это режим по умолчанию. Среда IDE переключается на экран пользователя, когда программа обращается к видеопамяти или при вызове программы.
Always: Переключение на экран пользователя происходит на каждом шаге.
None: Переключение экранов не происходит. Интегрированная среда остается видимой все время. Если в программе предусматривается вывод на экран или требуется ввод информации, текст будет писаться на экране среды. Вы можете восстановить окна интегрированной среды, выбирая Ё/Refresh Display.
Начало сеанса отладки.
Наиболее быстрый способ начать отладку состоит в загрузке программы и выборе команды Run/Trace Into (F7). Программа будет компилироваться. Когда компиляция завершится, редактор отобразит на дисплей тело основной программы с индикацией строки выполнения на первом операторе begin. Пользователь может начать трассировку программы с этого места (нажать клавиши F7 или F8) или использовать другие методы которые приведены ниже.
Если пользователю необходимо начать отладку с определенного места программы, он может выполнить программу до этого места, а затем остановиться. Для этого, загрузите нужный раздел исходного модуля в редактор и передвиньте курсор на строку, где Вы желаете остановиться. Затем можно поступить двумя способами:
- Выбрать команду Run/Goto Cursor (или нажать клавишу F4), которая будет выполнять программу пользователя до достижения строки, помеченной курсором, а затем останавить работу программы.
- Задать на указанной строке точку прерывания (выбрать команду Debug/Toggle Breakpoint или нажать на Ctrl-F8), затем выполнить программу (выполнить команду Run/Run или нажать Ctrl-F9); остановка будет происходить каждый раз при достижении заданной строки. Вы можете задать несколько точек прерывания, в этом случае программа будет делать остановку всякий раз при достижении какой-либо из этих точек.
Рестарт сеанса отладки.
Если в процессе отладки программы возникает необходимость начать все сначала, то нужно выполнить команду Program Reset из меню Run. Система отладки повторно инициализируется, и команда следующего шага вернет вас к первой строке главной программы. При этом производится закрытие всех файлов, которые были открыты программой, очистка стека всех вложенных программ, которые вызывались программой, и освобождение всего использованного пространства кучи. Переменные программы, однако, не будут повторно инициализированы или подвержены модификации какого-нибудь другого вида. (Turbo Pascal никогда не инициализирует переменные автоматически). Однако, начальные значения типированных констант программы будут восстановлены.
Turbo Pascal также предлагает рестарт, если Вы производите какие-либо изменения в программе во время отладки. Например, если Вы изменяете часть программы, а затем выбираете любую команду выполнения (нажимаете клавиши F7, F8, F4, Ctrl-F9 и т.д.), Вы получите сообщение: Source modified, rebuild? (Y/N) (исходный модуль модифицирован, нужно повторить сборку? да/нет). Если Вы отвечаете Y, Turbo Pascal будет перекомпилировать программу и возобновит отладку программы с начала. Если Вы ответите N, Turbo Pascal предполагает, что Вы уверены в своих действиях, и продолжает сеанс отладки дальше. (Любые изменения в программе, которые Вы произвели, не будут влиять на ее выполнение до тех пор, пока Вы не перекомпилируете программу). Если Вы добавили или удалили строки программы, курсор выполнения не реагирует на эти изменения, и может оказаться, что будет выделяться ошибочная строка.
Окончание сеанса отладки.
В процессе отладки программы Turbo Pascal хранит трассу того, что Вы делаете и где находитесь в данный момент. Так как пользователь может в процессе отладки загружать и даже редактировать различные файлы, Turbo Pascal не интерпретирует загрузку другого файла в редактор, как конец сеанса отладки. Поэтому, если вы желаете выполнить или отладить другую программу, нужно выполнить команду Run/Program Reset (клавиша Ctrl -F2).