JavaRush /Курсы /Kotlin SELF /Debug в IntelliJ IDEA

Debug в IntelliJ IDEA

Kotlin SELF
14 уровень , 6 лекция
Открыта

1. Bug

У программистов есть свой сленг. И первым словом, с которым вы познакомитесь плотно, будет баг (от англ. bug — жук). Это слово обозначает ошибку в программе, из-за которой она делает что-то не то, падает или выдает странный результат.

Если программа работает странно, но программист уверяет, что так и было задумано, обычно говорят: «Это не баг, это фича». Интернет полон мемов на эту тему.

Мем про баг и фичу

Историческая справка

Легенда гласит, что в сентябре 1947 года ученые Гарварда тестировали компьютер Mark II. Он сбоил. Проверив все контакты, они нашли настоящего мотылька, застрявшего между реле. Насекомое вклеили в журнал с подписью «First actual case of bug being found» (Первый реальный случай найденного жука).

С тех пор процесс поиска и устранения ошибок называют дебаг или отладка.

Фото первого бага в журнале


2. Debug Mode

Чтобы найти ошибку, программисты используют Debugger. Это специальный инструмент внутри IntelliJ IDEA, который позволяет поставить выполнение программы на паузу и заглянуть ей "под капот".

Intellij IDEA может запустить вашу программу в двух режимах:

Режим Иконка Горячие клавиши Суть
Run (Обычный) Иконка Play Shift+F10 (Win/Lin)
Ctrl+R (Mac)
Программа просто пробегает от начала до конца.
Debug (Отладка) Иконка Жука Shift+F9 (Win/Lin)
Ctrl+D (Mac)
Программа может останавливаться в указанных местах.

В режиме отладки вы можете выполнять программу построчно (строка за строкой), наблюдая, как меняются значения переменных.

3. Точки остановки

Чтобы Debugger понял, где нужно остановиться, вы должны поставить Break Point. Без нее программа просто пролетит до конца, как обычно.

Давайте потренируемся на живом примере. Скопируйте этот код в IDEA:

fun main() {
    var sum = 0
    for (i in 1..5) {
        val result = i * 2  // <--- We want to stop here
        sum += result
        println("Step: $i, Result: $result, Sum: $sum")
    }
    println("Final Sum: $sum")
}

Задача: Мы хотим посмотреть, как меняется переменная sum внутри цикла.

Действие: Кликните мышкой в узкую серую полоску слева от строки val result = i * 2. Появится красный кружок.

Теперь запустите программу через Debug (иконка жука). Программа запустится и мгновенно "замерзнет" перед выполнением этой строки.

4. Управление: F8, F7, F9

Когда программа стоит на паузе, у вас есть пульт управления в верхней части панели Debugger.

F8 — Шаг поверх (Step Over)

Нажмите F8. Программа выполнит текущую строку (умножение) и перейдет к следующей (sum += result).

Нажмите F8 еще раз. Программа сложит числа. Вы увидите, как значения переменных изменились.

Нажмите F8 еще раз. Вы увидите вывод в консоль.

Это основной способ перемещения: строка за строкой, не вдаваясь в детали.

F9 — Возобновить - Resume Program

У нас цикл от 1 до 5. Нажимать F8 пять раз, чтобы пройти один круг цикла — долго. А если цикл на 1000 итераций?

Нажмите F9. Программа "отлипнет", выполнит весь остаток кода в цикле, пойдет на второй круг и... снова остановится на Breakpoint

Таким образом, с помощью F9 вы можете быстро прокручивать циклы: Один нажим — одна итерация.

F7 — Шаг внутрь (Step Into)

Допустим, мы немного усложнили наш код и вынесли логику умножения в отдельную функцию:

fun main() {
    var sum = 0
    for (i in 1..5) {
        val result = calculateMultiply(i) // <--- We want to stop here
        sum += result
        println("Step: $i, Result: $result, Sum: $sum")
    }
    println("Final Sum: $sum")
}

fun calculateMultiply(number: Int): Int {
    return number * 2
}

Если на строке с вызовом val result = calculateMultiply(i) вы нажмете F8, Дебаггер просто выполнит её целиком, мгновенно запишет ответ в result и пойдет дальше. Но если вы хотите увидеть, как работает код внутри этой функции — жмите F7.

Дебаггер перенесет вас внутрь calculateMultiply, и вы увидите, как значение переменной i передается в параметр number. Это незаменимо, когда вы ищете ошибку внутри сложной функции.

Shift + F8 — Шаг наружу (Step Out)

Что делать, если вы нажали F7 случайно на строке println(...) и попали в дебри системного кода Kotlin или исходников Java? Читать тысячи строк чужого кода скучно и непонятно.

Жмите Shift + F8. Программа быстро выполнит всё, что осталось в текущей системной функции, и вернет вас обратно туда, откуда вы пришли (в вашу функцию main).

5. Где смотреть значения?

Вернемся к нашему примеру с циклом.

Способ 1: Inline Debugging

Посмотрите прямо в редактор кода. Справа от строк серым цветом IDEA пишет текущие значения

Способ 2: Панель Variables

Внизу в окне Debugger есть вкладка Variables. Там показаны все переменные . Вы можете раскрывать списки и объекты, изучая их содержимое.

Способ 3: Панель Frames

Слева от переменных есть список, который называется Frames. Он показывает, на каком шаге сейчас находится программа.

Например, надпись main:4 (или main:4, MainKt) означает:

  • Вы находитесь в функции main.
  • Вы остановились на строке номер 4.

Это ваш точный адрес в коде. Если вы провалитесь внутрь другой функции (нажмете F7), в этом списке появится новая запись сверху.

6. Супер-сила: Evaluate Expression (Alt+F8)

Иногда просто смотреть на переменные мало. Вы хотите спросить: "А что будет, если..."

Поставьте программу на паузу. Нажмите Alt + F8 (Windows/Linux) или Option + F8 (macOS). Откроется окно "Evaluate". Также вы можете вводить выражения прямо в строку под панелью Variables.

Здесь вы можете написать любой код, используя текущие переменные. Например, в нашем цикле напишите:

sum + 100

IDEA посчитает результат, не меняя реальную программу. Это ваш черновик для экспериментов.

7. Conditional Breakpoints

Представьте, что у вас цикл на 10 000 итераций, а ошибка происходит только на 5000-м шаге. Нажимать F9 пять тысяч раз — плохая идея.

Кликните правой кнопкой мыши по красному кружку Breakpoint. Появится всплывающее окно. В поле Condition напишите условие на Java, например: i == 4. Нажмите Done.

Right-click on a Breakpoint showing the Condition field with i == 4 entered

Теперь, если вы запустите Debugger, программа проигнорирует первые 4999 кругов и остановится только тогда, когда условие станет true. Это сэкономит вам часы работы!

8. Управление всеми точками остановки

Иногда новички ставят так много Breakpoints в разных файлах проекта, что программа потом постоянно останавливается в неожиданных местах. Искать красные кружки по всем файлам вручную — долго.

Нажмите Ctrl + Shift + F8 (Windows/Linux) или Cmd + Shift + F8 (macOS). Откроется окно Breakpoints.

Breakpoints window (Ctrl+Shift+F8) showing a list of all active breakpoints with checkboxes

Здесь вы видите список всех точек остановки в вашем проекте. Вы можете снять с них галочки (временно отключить) или удалить клавишей Delete.

9. Итоги

Мы рассмотрели основной арсенал разработчика для поиска ошибок. Отладчик (Debugger) — это то, что превращает написание кода из "гадания на кофейной гуще" в точную инженерную работу.

Умение быстро находить причину ошибки — это навык, который ценится в разработке даже выше, чем умение быстро писать код. Практикуйтесь, и ни один баг от вас не скроется.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ