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
Jeden komentarz do “Debugowanie w IntelliJ #2 Poruszanie się po kodzie w trybie debug”