Run-time error ## at seg:ofs
Если выполнять программу вне IDE, то можно запустить IDE и для поиска вызвавшего ошибку оператора использовать команду Search|Find Error, которая дает адрес сегмента и смещения (seg:ofs).
Логические ошибки
Логические ошибки – это ошибки проектирования и реализации программы. То есть, все операторы допустимы и что-то делают, но не то, что предполагалось. Эти ошибки часто трудно отследить, поскольку IDE не может найти их автоматически, как синтаксические и семантические ошибки. Тем не менее, IDE включает в себя средства отладки, помогающие найти логические ошибки.
Логические ошибки приводят к некорректному или непредвиденному значению переменных, неправильному виду графических изображений или невыполнению кода, когда это ожидается. Далее рассматриваются методы отслеживания этих логических ошибок.
Выполнение программы по шагам и трассировка
Методы отладки
Иногда, когда программа делает что-то непредвиденное, причина достаточно очевидна, и можно быстро исправить код программы. Но другие ошибки более трудноуловимы и вызываются взаимодействие различных частей программы. В этих случаях лучше всего остановить программу в заданной точке, пройти ее шаг за шагом и просмотреть состояние переменных и выражений. Такое управляемое выполнение - ключевой элемент отладки.
Выполнение по шагам и трассировка
Команды выполнения по шагам Step Over и трассировки Trace Into меню Run дают возможность построчного выполнения программы. Единственное отличие выполнения по шагам и трассировки состоит в том, как они работают с вызовами процедур и функций.
Выполнение по шагам вызова процедуры или функции интерпретирует вызов как простой оператор и после завершения подпрограммы возвращает управление на следующую строку. Трассировка подпрограммы загружает код этой подпрограммы и продолжает ее построчное выполнение.
Остановка выполнения
Существует два способа сообщить IDE, что программу нужно выполнить до определенной точки, а затем остановить.
Первый способ состоит в том, чтобы найти позицию в программе, где необходимо остановиться, затем выбрать в меню Run команду Go to Cursor (Выполнение до позиции курсора). Программа выполняется как обычно, пока не достигнет оператора, где она должна остановиться. В этой точке можно проверить значения и продолжать выполнение непрерывно или по шагам.
Второй способ состоит в том, чтобы остановить в определенной заданной точке программу. Эта точка называется точкой останова. Во время выполнения программы, она останавливается перед выполнением оператора в точке останова. В программе можно установить несколько точек останова.
Отслеживание и модификация
Для наблюдения за выводом программы встроенный отладчик имеет средства для просмотра значений переменных, выражений и структур данных. С помощью команды Watches в меню Debug в окне просмотра Watches можно добавлять или удалять отслеживаемые элементы. В этом диалоговом окне можно проверять переменные и выражения и изменять значения любых переменных, включая строки, указатели, элементы массива и поля записей, что позволяет проверить реакцию программы на различные условия.
Понятие отладочного шага
При отладке программы, наименьшим выполняемым элементом является строка. Поэтому, если на одной строке программы содержится несколько операторов Паскаля, нельзя отладить эти операторы индивидуально. Следовательно, нужно разбить оператор на несколько строк, которые будут выполняться за один шаг.
Строка выполнения выводится цветом, отличным от нормального цвета. Благодаря этому можно видеть, в каком месте программы идет проверка.
Выполнение программы по шагам
Это простейший способ выполнения программы по элементарным
фрагментам. Выбор команды 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.
Пример 1 Простая программа, выполняемая по шагам.
Если нажать клавишу F8, то строка выполнения перемещается на оператор begin в начале основного цикла, поскольку это первое, что выполняется в программе. Второе нажатие клавиши F8 выполняет begin и перемещает строку выполнения вниз до оператора for на следующей строке. После этого нажатие F8 вызывает выполнение всего цикла for на экран пользователя выводятся числа от -1 до -10, а строка выполнения перемещается к end.
Хотя функция Negate вызывается 10 раз, строка выполнения никогда на нее не перемещается. Выполнение по шагам позволяет отладчику не показывать детали любых вызовов для отдельной строки.
Выполнение по шагам вызывает выполнение всего цикла for сразу, поэтому невозможно видеть изменения в ходе выполнения цикла.
Если необходимо видеть подробности цикла, то в пример нужно внести следующее простое изменение:
Begin
for I := 1 to 10 do
Writeln(Negate(I));
End.
Пример 2 Изменение формата кода для лучшего выполнения
по шагам.
Если теперь нажимать клавишу F8, то строка выполнения будет при выполнении цикла 10 раз возвращаться на Writeln.
2.6 Трассировка программы
Трассировка программы во многом аналогичная ее выполнению по шагам. Единственное исключение состоит в том, что когда встречается оператор вызова процедуры или функции, при трассировке эти процедуры и функции также выполняются по шагам, а при простом выполнении по шагам управление возвращается программисту после завершения выполнения подпрограммы.
Например, чтобы выполнить трассировку кода в Примере 1, необходимо выбрать команду Run|Trace Into или нажать клавишу F7. Первое нажатие на F7 передает управление на оператор begin основной программы. Повторное нажатие F7 снова перемещает строку управления на оператор for. После этого нажатие клавиши F7 трассирует вызов функции Negate - строка выполнения перемещается на оператор begin в блоке функции. Если продолжать нажимать F7, строка выполнения перемещается по функции, а затем, когда дойдет до оператора end, возвращается к оператору вызова.
Формат программы влияет на поведение строки выполнения при трассировке, хотя и не в такой степени как при пошаговом выполнении. Если код сформатирован как в Примере 1, то трассировка оператора for приводит к выполнению 10 раз функции Negate. Если разбить оператор for на две строки, как в Примере 2, то трассировка оператора end функции возвращает строку выполнения ту строку основной программы, которая будет выполняться следующей.
Первые девять раз это снова будет вызов функции. В десятый раз строка выполнения перемещается на оператор end программы.
2.7 Выполнение больших фрагментов
Иногда, конечно, нежелательно выполнять по шагам всю программу только для того, чтобы добраться до того места, где возникает проблема. Отладчик позволяет выполнить сразу большой фрагмент программы до той точки, где необходимо начать выполнение по шагам.
Чтобы задать в программе точку, до которой программист хочет ее выполнить, а затем остановиться, нужно использовать команду Run|Go To Cursor (Выполнение| Выполнение до курсора) или клавишу F4. (То есть программист сообщает отладчику, что не хочет выполнять программу по шагам, пока не достигнет заданной точки.) Для этого необходимо установить курсор на той строке, где нужно возобновить управление отладкой, затем нажать клавишу F4. Причем, это можно сделать как в начале сеанса отладки, так и когда уже часть программ мы выполнена по шагам или протрассирована.
2.8 Повторное выполнение
В ходе сеанса отладки иногда желательно начать все сначала. Выбор команды Run|Reset Program или нажатие клавиши Ctrl+F2 приведет к полному сбросу, так что выполнение по шагам, или трассировка начнется в начале основной программы.
2.9 Отслеживание вывода программы
При пошаговом выполнении часто полезно просмотреть вывод программы, называемый экраном пользователя. Turbo Pascal предоставляет несколько способов просмотра экрана пользователя.
2.9.1 Переключение экранов
В любой момент сеанса отладки можно выполнять переключение экрана IDE и экрана пользователя. Чтобы вывести экран пользователя, необходимо нажать клавиши Alt+F5. Для возврата в IDE нажать любую клавишу.
2.9.2 Окно Output
IDE предусматривает для экрана пользователя окно, которое называется окном вывода. Выбор команды меню Debug|Output открывает (выводит на переднем плане) активное окно, содержащее вывод программы.
2.10 Просмотр значений
Выполнение программы по шагам или ее трассировка могут помочь найти ошибки в алгоритме программы, но обычно желательно также знать, что происходит на каждом шаге со значениями отдельных переменных. Например, при выполнении по шагам цикла for полезно знать значение переменной цикла. IDE имеет два инструментальных средства для проверки содержимого переменных программы: окно Watches (Просмотр) и диалоговое окно Evaluate and Modify (Вычисление и модификация).
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|