Различие между командами Trace Into (F7) и Step Over (F8) в том, что при использовании F7 осуществляется трассировка внутри процедур и функций, в то время как использование F8 приведет к обходу вызовов подпрограмм. Эти команды имеют особое значение при выполнении оператора begin основной программы, если программа использует модули, имеющие раздел инициализации. В этом случае, использование F7 приведет к трассировке раздела инициализации каждого модуля, что позволяет увидеть, что инициализируется в каждом модуле. При использовании F8 эти разделы не будут трассироваться, и курсор выполнения переходит на следующую строку после begin.
Рассмотрим следующий (неполный) пример программы:
($D+,L+)
program TestSort;
const
NLMax=100;
type
NumList=array[1..NLMax] of integer;
var
List : NumList;
I,Const : word;
procedure Sort ( var L:NumList; Cnt:Integer);
begin
(sort the list) (сортировка списка)
end; (of proc sort) (процедуры Sort)
begin
randomize;
Count:=NLMax;
for I:=1 to Count do
List[I] := Random(1000);
sort(List,Count);
for I:=1 to Count do
Write(List[I] :8);
Readln
end. {программы TestSort}
Предположим, что Вы отлаживаете процедуру Sort. Вы хотите осуществить трассировку процедуры Sort, включая проверку значения внутри List до вызова Sort. Однако, выполнять 100 раз инициализацию внутри List очень утомительно. Есть ли способ выполнять цикл, не останавливаясь на каждой выполняемой строке.
Да, фактически, существует несколько способов. Во-первых, Вы могли бы выделить этот цикл в отдельную процедуру и нажать клавишу F8 для того, чтобы обойти ее трассировку, но это слишком нерационально. Во-вторых, Вы могли бы установить внутри программы точку прерывания. Мы объясним, что это за точки прерывания, и как они используются немного позже. В конце концов, Вы могли бы использовать команду Run/Go to Cursor (F4). Переместите курсор на строку с вызовом Sort, а затем нажмите на клавишу (F4). Ваша программа будет выполняться до достижения строки, помеченной курсором. Курсор выполнения переместится на эту строку; затем Вы можете начать трассировку с этого места, нажимая на клавишу F7, для того, чтобы можно было сделать трассировку внутри Sort.
Команда Run/Goto Cursor (F4) действует на вложенных уровнях вызовов подпрограмм, даже если их исходный код находится в другом файле. Например, Вы могли бы разместить курсор где-либо внутри процедуры Sort и нажать на клавишу F4; программа выполнялась бы до этой строки. По существу, Sort могла бы быть выделена в отдельный модуль, отладчик бы уже знал, когда нужно остановиться и что отобразить.
Существуют три случая, когда команда Go to Cursor (F4) не будет выполнять программу до отмеченной курсором строки.
Первый, когда Вы расположили курсор между двумя выполняемыми строками; например, на пустой строке или строке с комментариями. В этом случае программа будет выполняться до следующей строки, содержащей оператор, который может быть выполнен.
Второй случай, когда курсор расположен вне процедурного блока, например, на операторе объявления переменной или операторе program. Отладчик будет выводить сообщение "no code generated for this line" (для этой строки код не генерируется).
Третий случай, когда Вы располагаете курсор на строке, которая никогда не выполняется. Например, строка располагается выше курсора выполнения (предполагается, что вы находитесь не в цикле) или строка является частью else - условного оператора, когда выражение if имеет значение true. В этом случае отладчик будет действовать так, как если бы выполнялась команда Run/Run (Ctrl-F9); программа будет выполняться до конца или до точки прерывания.
Предположим, что Вы трассируете процедуру Sort,затем хотите завершить работу программы и посмотреть выходные результаты. Каким способом сделать это? Сначала нужно переместить курсор к последнему оператору end основной части программы, а затем выполнить команду Run/Go to Cursor (F4). Или проще, нужно выполнить команду Run/Run (Ctrl-F9). Она позволяет отладчику продолжить нормальное выполнение программы пользователя. Программа будет выполняться до конца, или до тех пор, пока Вы не достигнете точки прерывания или не будет нажат Ctrl-Break.