Ответ 1
- Шаг в приведет к тому, что отладчик опустится в любые вызовы методов в текущей строке. Если есть несколько вызовов методов, они будут посещаться в порядке выполнения; если вызовов метода нет, это так же, как и шаг. Это в целом эквивалентно следованию каждой отдельной строке выполнения, как видно интерпретатору.
- Шаг через переходит к следующей строке в вашей текущей области (т.е. переходит к следующей строке), не опускаясь ни на какие вызовы методов на этом пути. Обычно это используется для логики с помощью конкретного метода, не беспокоясь о деталях своих сотрудников и может быть полезно для поиска в какой момент метода нарушены ожидаемые условия.
- Шаг выход продолжается до следующего "возврата" или эквивалента - т.е. до тех пор, пока элемент управления не вернется в предыдущий стек стека. Это обычно используется, когда вы видели все, что вам нужно в этой точке/методе, и хотите, чтобы пузырь в стеке несколько слоев, где фактическое значение действительно используется.
Представьте следующий код, который вводится через main()
и теперь находится в первой строке bar
:
function main() {
val s = foo();
bar(s);
}
function foo() {
return "hi";
}
function bar(s) {
val t = s + foo(); // Debugger is currently here
return t;
}
Тогда:
- Вступим в вызов
foo
, и текущая строка станетreturn "hi";
в пределахfoo
. - Шаг за шагом проигнорирует тот факт, что вызывается другой метод, и перейдет к строке
return t;
(что позволяет быстро увидеть, что оцениваетсяt
как). - Вывод завершит выполнение оставшейся части метода
bar
, и элемент управления вернется к последней строке методаmain
.