Шаги¶
Когда программа остановлена, двигать её можно вот так.
Команды¶
| Клавиша | Действие | Что делает |
|---|---|---|
| F9 | продолжить | выполнять до следующей точки останова или до конца программы |
| F8 | шаг с обходом | выполнить текущую строку, остановиться на следующей в этом же фрейме |
| F7 | шаг внутрь | войти в вызов на текущей строке |
| Shift+F8 | шаг наружу | доработать до возврата из текущей функции |
| Cmd+F2 / Ctrl+F2 | остановить | завершить сессию |
Есть ещё два действия без привязки по умолчанию: pause — прервать работающую
программу — и restart. Назначьте им клавиши в [ui.keymaps], если они вам
нужны; см. Настройка → Интерфейс.
Эти клавиши работают в любом месте окна, в том числе когда курсор стоит в поле ввода Evaluate или Watches. Именно поэтому они функциональные: так они никогда не конфликтуют с набираемым текстом.
Шаг с обходом против шага внутрь¶
На строке с вызовом функции:
- шаг с обходом выполняет вызов целиком и останавливается на следующей строке. Годится, когда вызываемому вы доверяете;
- шаг внутрь останавливается на первой строке внутри вызываемого. Годится, когда проблема может быть там.
Если вызова на строке нет, оба делают одно и то же.
Шаг наружу¶
Доводит текущую функцию до конца и останавливается сразу после возврата, уже в вызывающем коде. Самый быстрый способ вернуться, если вы зашли внутрь по ошибке или уже посмотрели достаточно.
Что происходит на каждой остановке¶
Каждая остановка обновляет всю картину:
- Стек вызовов перестраивается, выбранным становится верхний фрейм;
- Переменные показывают области видимости выбранного фрейма;
- Watches пересчитываются, все до одного;
- в панели исходника отмечается текущая строка.
Выбор другого фрейма в стеке переводит Variables и Evaluate на него, не двигая при этом исполнение.
Шаги в многопоточной программе¶
Шаг применяется к тому потоку, который сейчас выбран отладчиком. Остальные потоки могут работать или стоять — это зависит от политики адаптера. Какой поток перед вами, видно в панели Потоки.
Если шаг словно застрял¶
Шаг, который не завершается, обычно означает, что программа заблокирована: ждёт ввод-вывод, блокировку или сетевой вызов внутри строки, которую вы обошли. Отвечает ли ещё адаптер, видно в панели логов — см. Логи и диагностика.