Основной смысл использования встроенного отладчика состоит в управляемом выполнении. Отслеживая выполнение каждой инструкции, вы можете легко определить, какая часть вашей программы вызывает проблемы. В отладчике предусмотрено пять основных механизмов управления выполнением программы, которые позволяют вам:
выполнять инструкции по шагам;
трассировать инструкции;
выполнять программу до заданной точки;
находить определенную точку;
выполнять сброс программы.
Само по себе выполнение программы по шагам может быть недостаточно полезным, разве что поможет найти то место, где что-то происходит совершенно неверно. Но управляемое выполнение дает вам возможность проверять состояние программы и ее данных, например, отслеживать вывод программы и ее переменные, как описывается в данной главе.
Что такое шаг?
Когда вы отлаживаете программу, наименьшим выполняемым элементом является строка. Этот означает, что вы можете управлять отладкой до уровня отдельной строки исходного кода программы. Поэтому, если на одной строке программы содержится несколько операторов Паскаля, вы не сможете отладить эти операторы индивидуально. С другой стороны, с целью отладки вы можете разбить оператор на несколько строк, которые будут выполняться за один шаг.
Все выполнение в отладчике, включая выполнение по шагам, трассировку и останов, основывается на строках. Подсвечивая строку, встроенный отладчик всегда сообщает вам, какую строку вы выполняете следующей (строка выполнения). Строка выполнения выводится цветом, отличным от нормального цвета. Благодаря этому вы можете легко видеть, где находитесь.
Выполнение программы по шагам
Выполнение по шагам - это простейший способ выполнения программы по элементарным фрагментам. Выбор команды 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.
Если в окне редактирования вы выведите 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.
Поскольку оператор Паскаля может занимать несколько строк, такая программа будет в точности эквивалентна предыдущей версии, а генерируемый код будет идентичен. Но поскольку оператор Writeln теперь находится на отдельной строке, отладчик может интерпретировать его отдельно. Если теперь вы будете нажимать клавишу F8, то увидите, что строка выполнения будет при выполнении цикла 10 раз возвращаться на Writeln.
1 2 3
8 8 8
| |