CodeGym /Kursy /JAVA 25 SELF /Debug w IntelliJ IDEA

Debug w IntelliJ IDEA

JAVA 25 SELF
Poziom 14 , Lekcja 6
Dostępny

1. Bug

Programiści mają swój własny slang. Pierwszym słowem, z którym zetkniesz się blisko, będzie bug (z ang. bug — robak). Słowo to oznacza błąd w programie, przez który robi on coś nie tak, crashuje się lub zwraca dziwny wynik.

Jeśli program działa dziwnie, ale programista zapewnia, że tak miało być, zwykle mówi się: "To nie bug, to feature". Internet jest pełen memów na ten temat.

Mem o bugu i feature

Rys historyczny

Legenda głosi, że we wrześniu 1947 roku naukowcy z Harvardu testowali komputer Mark II. Szwankował. Sprawdzając wszystkie styki, znaleźli prawdziwą ćmę uwięzioną między przekaźnikami. Owada wklejono do dziennika z podpisem "First actual case of bug being found" (Pierwszy rzeczywisty przypadek znalezienia robaka).

Od tego czasu proces wyszukiwania i usuwania błędów nazywa się debugowaniem lub po prostu odpluskwianiem.

Zdjęcie pierwszego buga w dzienniku


2. Debug Mode

Aby znaleźć błąd, programiści używają Debuggera. To specjalne narzędzie wewnątrz IntelliJ IDEA, które pozwala wstrzymać wykonywanie programu i zajrzeć mu "pod maskę".

IntelliJ IDEA może uruchomić Twój program w dwóch trybach:

Tryb Ikona Skróty klawiszowe Istota
Run (Zwykły) Ikona Play Shift+F10 (Win/Lin)
Ctrl+R (Mac)
Program po prostu przebiega od początku do końca.
Debug (Debugowanie) Ikona Robaka Shift+F9 (Win/Lin)
Ctrl+D (Mac)
Program może się zatrzymywać we wskazanych miejscach.

W trybie debugowania możesz wykonywać program linijka po linijce, obserwując, jak zmieniają się wartości zmiennych.

3. Punkty wstrzymania (Breakpoints)

Aby Debugger zrozumiał, gdzie ma się zatrzymać, musisz postawić Breakpoint. Bez niego program po prostu przeleci do końca, jak zwykle.

Poćwiczmy na żywym przykładzie. Przenieśliśmy logikę mnożenia do osobnej metody, aby pokazać całą moc debuggera. Skopiuj ten kod do IDEA:

public class Main {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 5; i++) {
            int result = calculateMultiply(i);  // <--- Chcemy zatrzymać się tutaj
            sum += result;
            System.out.println("Step: " + i + ", Result: " + result + ", Sum: " + sum);
        }
        System.out.println("Final Sum: " + sum);
    }

    public static int calculateMultiply(int number) {
        return number * 2;
    }
}

Zadanie. Chcemy zobaczyć, jak zmieniają się zmienne wewnątrz pętli i zajrzeć do wnętrza naszej metody.

Akcja. Kliknij myszką w wąski szary pasek po lewej stronie od linii int result = calculateMultiply(i);. Pojawi się czerwone kółko.

Edytor IDEA pokazujący kod Java z czerwonym Breakpointem

Teraz uruchom program przez Debug (ikona robaka). Program uruchomi się i natychmiast "zamarznie" przed wykonaniem tej linii.

Debugger IDEA wstrzymany na breakpoincie, pokazujący podświetloną linię wykonywania

4. Sterowanie: F8, F7, F9

Gdy program jest na pauzie, masz do dyspozycji panel sterowania w górnej części okna Debuggera.

Pasek narzędzi Debuggera z podświetlonymi przyciskami Step Over, Step Into, Resume

F8 — Krok nad (Step Over)

Naciśnij F8. Program wykona bieżącą linię (wywoła metodę, pobierze wynik) i przejdzie do następnej sum += result;.

Wykonywanie przeniesione do sum += result; widoczne wartości inline

Naciśnij F8 ponownie. Program doda liczby. Zobaczysz, jak zmieniły się wartości zmiennych.

Zmienne sum i result zaktualizowane w panelu Variables

Naciśnij F8 jeszcze raz. Zobaczysz wyjście w konsoli.

Wyjście konsoli pokazujące Step 1

To podstawowy sposób poruszania się: linijka po linijce, bez wchodzenia w wewnętrzne szczegóły metod.

F9 — Wznów (Resume Program)

Mamy pętlę od 1 do 5. Naciskanie F8 pięć razy, aby przejść jedno okrążenie pętli, jest czasochłonne. A co jeśli pętla ma 1000 iteracji?

Naciśnij F9. Program "odmrozi się", wykona całą resztę kodu w bieżącej iteracji, przejdzie do drugiego okrążenia i... znowu zatrzyma się na Breakpoincie.

Naciśnięcie F9 przeskakuje do następnej iteracji pętli, i=2

W ten sposób, za pomocą F9 możesz szybko przewijać pętle: jedno naciśnięcie — jedna iteracja.

Zmienne pokazujące wartości dla drugiej iteracji

F7 — Krok do środka (Step Into)

Jeśli w kodzie wystąpi wywołanie Twojej metody (w naszym przypadku calculateMultiply(i)) i naciśniesz F8, Debugger po prostu ją wykona i pójdzie dalej. Ale jeśli chcesz zobaczyć, jak działa kod wewnątrz tej metody — naciśnij F7.

Spróbuj nacisnąć F7, gdy program zatrzyma się na linii int result = calculateMultiply(i);. Debugger przeniesie Cię do wnętrza metody calculateMultiply, a Ty zobaczysz, jak wartość jest przekazywana do parametru number.

Wejście do metody calculateMultiply(int number)

Shift + F8 — Krok na zewnątrz (Step Out)

Co zrobić, jeśli przypadkowo nacisnąłeś F7 na linii System.out.println(...) i trafiłeś w gąszcz kodu systemowego Javy? Czytanie tysięcy linii cudzego kodu jest nudne i niezrozumiałe.

Naciśnij Shift + F8. Program szybko wykona wszystko, co pozostało w bieżącej metodzie, i zwróci Cię z powrotem tam, skąd przyszedłeś (do Twojej metody main).

Wyjście z metody PrintStream/System.out z powrotem do Main

5. Gdzie podglądać wartości?

Wróćmy do naszego przykładu z pętlą.

Przegląd okna Debuggera pokazujący zakładki Variables i Frames

Sposób 1: Inline Debugging

Spójrz bezpośrednio w edytor kodu. Po prawej stronie od linii na szaro IDEA wypisuje bieżące wartości.

Sposób 2: Panel Variables

Na dole w oknie Debuggera znajduje się zakładka Variables. Tam pokazane są wszystkie bieżące zmienne.

Ważna uwaga dla Javy: Typy proste (np. int) pokazują swoją wartość od razu. Z kolei obiekty i tablice (np. String[]) przechowują w sobie wiele danych. Aby zobaczyć ich zawartość, należy kliknąć na małą strzałkę po lewej stronie od zmiennej, aby "rozwinąć" obiekt.

Sposób 3: Panel Frames

Po lewej stronie od zmiennych znajduje się lista nazywająca się Frames (Stos wywołań). Pokazuje ona, na jakim etapie znajduje się obecnie program.

Na przykład wpis main:6, Main oznacza:

  • Znajdujesz się w metodzie main klasy Main.
  • Zatrzymałeś się na linii numer 6.

To Twój dokładny adres w kodzie. Jeśli wpadniesz do innej metody (naciśniesz F7 na calculateMultiply), na tej liście na górze pojawi się nowy wpis calculateMultiply:13, Main, wskazujący, że nowa metoda została wywołana z poprzedniej.

6. Evaluate Expression

Czasami samo patrzenie na zmienne to za mało. Chcesz zapytać: "A co będzie, jeśli..."

Naciśnij Alt + F8 (Windows/Linux) lub Option + F8 (macOS). Otworzy się okno "Evaluate". Możesz też wpisywać wyrażenia bezpośrednio w pole pod panelem Variables.

Tutaj możesz napisać dowolny kod, korzystając z bieżących zmiennych. Na przykład w naszej pętli wpisz:

sum + 100

Naciśnij Enter, a IDEA policzy wynik bez zmieniania prawdziwego programu. To Twój brudnopis do eksperymentów.

Okno dialogowe Evaluate Expression pokazujące sum + 100 wraz z obliczonym wynikiem

7. Conditional Breakpoints

Wyobraź sobie, że masz pętlę na 10 000 iteracji, a błąd występuje tylko na 5000. kroku. Naciskanie F9 pięć tysięcy razy to zły pomysł.

Kliknij prawym przyciskiem myszy na czerwone kółko Breakpointu. Pojawi się wyskakujące okienko. W polu Condition napisz warunek w Javie, na przykład: i == 5. Naciśnij Done.

Kliknięcie prawym przyciskiem myszy na Breakpoint pokazujące pole Condition z wpisanym i == 5

Teraz, jeśli uruchomisz Debuggera, program zignoruje pierwsze 4999 okrążeń i zatrzyma się dopiero wtedy, gdy warunek stanie się true. To zaoszczędzi Ci godziny pracy!

8. Zarządzanie wszystkimi punktami wstrzymania

Czasami początkujący stawiają tak dużo Breakpoints w różnych plikach projektu, że program potem stale zatrzymuje się w nieoczekiwanych miejscach. Szukanie czerwonych kółek po wszystkich plikach ręcznie zajmuje dużo czasu.

Naciśnij Ctrl + Shift + F8 (Windows/Linux) lub Cmd + Shift + F8 (macOS). Otworzy się okno Breakpoints.

Okno Breakpoints (Ctrl+Shift+F8) pokazujące listę wszystkich aktywnych breakpointów z checkboxami

Tutaj widzisz listę wszystkich punktów wstrzymania w Twoim projekcie. Możesz odznaczyć je (tymczasowo wyłączyć) lub usunąć klawiszem Delete.

9. Podsumowanie

Omówiliśmy podstawowy arsenał programisty Javy do wyszukiwania błędów. Debugger to narzędzie, które zamienia pisanie kodu z "wróżenia z fusów" w precyzyjną pracę inżynierską.

Umiejętność szybkiego znajdowania przyczyny błędu to umiejętność ceniona w komercyjnym Developmentie nawet bardziej niż umiejętność szybkiego pisania kodu. Ćwicz z warunkowymi breakpointami i Ewaluacją, a żaden bug się przed Tobą nie ukryje.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION