java_debug_2

Debugowanie w IntelliJ #2 Poruszanie się po kodzie w trybie debug

W poprzednim odcinku serii poznaliśmy podstawy debugowania, a tym odcinku serii przyjrzymy się stosowi wywołań (call stack) i poznamy jak poruszać się o nim podczas sesji debug.

Czym jest stos wywołań (call stack)?

W czasie wykonywania programu w Javie uruchamiana jest spora liczba metod, a ich wykonywanie jest śledzone na tak zwanym call stack’u – stosie wywołań. Nie zagłębiając się w szczegóły:

Na początku, na samym dole stosu, mamy tylko metodę main

Gdy zostanie wywołana metoda createNewGuest to ona trafia na górę stosu

Następnie zostanie wywołana metoda getTransaction z EntityManager to ona trafia na górę

Po zakończeniu zostaje ze stosu zdjęta i kontynuowane jest działanie metody createNewGuest


I tak dalej.

Sprawdzanie stanu programu w poszczególnych elementach stosu

Po co nam ta wiedza? W trybie debug w IntelliJ na dole po lewej stronie widzimy aktualny stos wywołań.

Możemy przechodzić pomiędzy poszczególnymi elementami stosu klikając na nie. Otrzymamy wówczas stan aplikacji w jakim dany element stosu przerwał swoje działanie. Biorąc powyższy przykład:

Aplikacja zatrzymała się w trakcie wykonywania metody getTransaction. Ze stosu wywołań widzimy, że metoda ta została wywołana w metodzie createNewGuets, a ta z kolei została wywołana z wnętrza metody main.

Gdy klikniemy na metodę createNewGuest na stosie wywołań otrzymamy stan zmiennych lokalnych i obiektu w momencie, gdy została uruchomiona metoda getTransaction.

Poruszanie się po kodzie i pomiędzy elementami stosu w trybie debug.

Powyżej aktualnego stanu stosu wywołań znajduje się zestaw strzałek. Dziś interesują nas trzy z nich.

Step over

Pierwsza od lewej, “złamana’, służy do przejścia do kolejnej linii kodu. Jest to tak zwany “step over”.

Breakpoint zatrzymał program na linii 18, w której tworzy się nowy obiekt z klasy Guest. Po kliknięciu w tę strzałkę (lub użyciu skrótu F8) przejdziemy do linii 19 i program tam się zatrzyma. Po prawej stronie panelu pojawi się nowy wpis – zmienna newOne. Będziemy mieli możliwość podejrzenia jej wartości.

W ten sposób możemy przejść krok po kroku całe wykonanie aktualnego stosu wywołań i jego poprzedników. To znaczy – będąc na linii 19 i używając ponownie “step over” nie wejdziemy do żadnej metody, a przejdziemy do linii 20 w aktualnej metodzie. Natomiast, gdy dotrzemy do końca wywołania metody “step over” przeniesie nas do funkcji main – do punktu wywołania metody createNewGuest.

Step into

Jeśli jednak chcemy wejść do wykonywanej metody i tym samym dodać nowy element na stosie oraz przenieść się do niego, używamy drugiej z zaznaczonych, niebieskich strzałek – tej skierowanej w dół. Jest to “step into”.

Patrząc na nasz przykład, gdy jesteśmy w linii 19

EntityTransaction transaction = em.getTransaction();

możemy z pomocą “step into” (bądź skrótu F7) przejść do kodu metody getTransaction() w obiekcie em i tym samym dorzucić kolejny element do stosu wywołań.

Step out

By wrócić do miejsca z którego przyszliśmy i wykonać metodę getTransaciton możemy albo “przejść” po całym jej kodzie za pomocą F8 (step over) albo użyć ostatniego interesującego nas dziś elementu – strzałki skierowanej ku górze, czyli “step out“. Spowoduje to wykonanie aktualnej metody, czyli w naszym wypadku getTransaction i natychmiastowe zdjęcie jej ze stosu wywołań. Powrócimy w ten sposób do miejsca w kodzie, gdzie wywołana została metoda getTransaction (w która się zagłębiliśmy). W tym wypadku wrócimy do metody createNewGuest jednak już po wywołaniu getTransaction. Będziemy mieli wówczas np. przypisaną wartość, którą metoda zwróci.

To na tyle w tej części, zapraszam do kolejnych 🙂

By być na bieżąco i mieć realny wpływ na tematykę tworzonych przeze mnie artykułów zapraszam do dołączenia do mojego newslettera.

Pozostałe artykuły z cyklu:
1. Podstawy debugowania w IntelliJ
2. Poruszanie się po stosie w trybie debug
3. Więcej możliwości przy pracy z breakpointami

Jedna myśl w temacie “Debugowanie w IntelliJ #2 Poruszanie się po kodzie w trybie debug”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *