JavaRush /Blog Java /Random-PL /IntelliJ IDEA i debugowanie: nie nurkowanie, ale snorkeli...
Viacheslav
Poziom 3

IntelliJ IDEA i debugowanie: nie nurkowanie, ale snorkeling

Opublikowano w grupie Random-PL
Pisanie kodu to połowa sukcesu. Trzeba to jeszcze dopracować, żeby działało poprawnie. IDE i narzędzia do debugowania bardzo nam w tym pomagają.
IntelliJ IDEA i debugowanie: nie nurkowanie, ale snorkeling - 1
Na przykładzie IntelliJ IDEA proponuję zapoznać się z tym, w jaki sposób możemy dowiedzieć się, co dzieje się z naszym kodem podczas jego działania. Debugowanie to szeroki temat, więc ta recenzja nie oferuje głębokiego nurkowania, jak nurek. Ale na pewno mam nadzieję na snorkeling)

Wstęp

Częścią pisania kodu jest jego debugowanie. A jeśli Twoje zadania obejmują obsługę kodu, debugowania będzie jeszcze więcej. Cóż, w dodatku za pomocą debugowania można zbadać pracę używanych bibliotek i frameworków tak głęboko, jak można zanurzyć się w dżungli cudzego kodu. Do naszego nurkowania będziemy potrzebować: Najpierw rozpakuj pobrane archiwum za pomocą kodu źródłowego szybkiego startu. Uruchom IntelliJ Idea i utwórz „ Nowy projekt z istniejących źródeł ”. Wybierz plik pom.xml w podkatalogu hibernate4 . Podczas importowania wybierz opcję „ Importuj projekty Maven automatycznie ” i dokończ tworzenie projektu, pozostawiając inne ustawienia bez zmian. Podczas importowania projektu rozpakuj pobrany serwer aplikacji WildFly do jakiegoś katalogu. Serwer uruchamiamy z pliku (lub standalone.sh dla systemów *nix). (!) Ważne jest, aby zacząć od parametru --debug.Czekamy na uruchomienie serwera. Napiszą nam, że to się zaczęło i wskażą godzinę. Będzie to wyglądać mniej więcej tak: bin\standalone.bat
IntelliJ IDEA i debugowanie: nie nurkowanie, ale snorkeling - 2
Następnie musimy uruchomić wybrany przez nas projekt na serwerze. Proces ten opisany jest w małej dokumentacji, którą można znaleźć w samym projekcie: \hibernate4\README.adoc Jak wskazano w tej dokumentacji, musimy uruchomić komendę w katalogu hibernate4: mvn clean package wildfly:deploy Czekamy na wiadomość, że kompilacja zakończyła się pomyślnie:
IntelliJ IDEA i debugowanie: nie nurkowanie, ale snorkeling - 3
Następnie w logu serwera możemy zobaczyć, jak nowy projekt został „wdrożony”:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 4
Następnie wchodzimy na stronę http://localhost:8080/wildfly-hibernate4i powinniśmy wyświetlić stronę z formularzem „ Rejestracja członka ”. Tak więc nasze przygotowania do eksperymentów zostały zakończone i możemy zaczynać)) Przed nami będzie wiele zdjęć dla przejrzystości, więc przygotujcie się)

Zdalne debugowanie

Musimy więc skonfigurować tryb debugowania, aby nasze IDE kontrolowało wykonywanie kodu na serwerze aplikacji. IntelliJ Idea jest dostępny w dwóch wersjach: bezpłatnej (Społeczność) i płatnej (Ultimate). To drugie można oficjalnie wypróbować w formie EAP. W wersji Ultimate wszystko jest proste – serwer aplikacji można uruchomić bezpośrednio z IDE w trybie debugowania. Ale w wersji Community musisz zrobić kilka rzeczy ręcznie. Rozważmy zatem bardziej skomplikowany przypadek, tj. ustawienie w wersji Community. Wersja społecznościowa ma pewne ograniczenia. W szczególności nie można z niego uruchomić serwera aplikacji. Można jednak ustawić zdalne debugowanie (Remote Debug), gdy gdzieś osobno znajduje się działający serwer z potrzebną nam aplikacją. Skorzystajmy z opisu konfiguracji z tego miejsca: Zdalne debugowanie Wildfly w wydaniu społecznościowym IntelliJ Idea (konfigurowanie konfiguracji zdalnego uruchamiania dla portu 8787). Po konfiguracji uruchamiamy naszą nową konfigurację w trybie debugowania:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 5
Jeśli wszystko jest w porządku, poniżej pojawi się komunikat na ten temat:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 6

Proces debugowania

Debugujmy, zapisując rekord. Aby to zrobić, musimy najpierw zdecydować o miejscu, które będziemy eksplorować. Sądząc po oknie, potrzebujemy przycisku „Zarejestruj się”. Znajdźmy to w kodzie. Potrzebujemy więc elementu, który powinien mieć tekst: „Zarejestruj się”. Albo ona powinna mieć z tym coś wspólnego. Kliknij Ctrl+Shift+Fi poszukaj Zarejestruj się w cudzysłowie. Widzimy, że istnieje taki plik w pliku Index.xhtml.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 7
Naciśnij Enter, aby przejść do znalezionego źródła:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 8
Widzimy więc, że podczas rejestracji wywoływany jest MemberController.register . Najwyraźniej musi to być jakiś rodzaj klasy Java. Kliknij Ctrl+Ni wyszukaj:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 9
Rzeczywiście, istnieje taka klasa. Wejdźmy w to. Najwyraźniej powinna istnieć metoda rejestru. Kliknij Ctrl+F12i poszukaj metody rejestracji
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 10
Rzeczywiście, znaleźliśmy to. Najwyraźniej rejestracja odbywa się tutaj, w MemberRegistration.register . Naciśnij klawisz Ctrl i kliknij metodę, aby „wpaść” w nią:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 11
Ustawmy teraz „punkt przerwania” lub punkt przerwania. Jest to znacznik informujący, gdzie należy wstrzymać wykonywanie kodu. W tym momencie będziemy mieli okazję dowiedzieć się wielu ciekawych rzeczy. Aby go umieścić należy kliknąć miejsce po prawej stronie numeru linii.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 12
Na stronie http://localhost:8080/wildfly-hibernate4 wypełnij pola i kliknij przycisk Zarejestruj. Ikona pomysłu na panelu zacznie migać:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 13
Wchodząc do Idea, widać, że w panelu debugowania znajduje się wiele ciekawych informacji:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 14
Tutaj możesz zobaczyć wartość pól obiektu. Na przykład, z czego składa się zarejestrowany Członek:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 15
Świetnie. Co jeszcze możemy zrobić? Możemy otworzyć menu kontekstowe i wybrać tam opcję Oceń wyrażenie (lub poprzez menu Uruchom -> Oceń wyrażenie). Jeszcze lepiej, w panelu sterowania debugera:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 16
To super fajna umiejętność w punkcie przerwania, mająca dostęp do wszystkiego, do czego ma dostęp ten punkt kodowy, aby wykonać dowolny kod, który mógłby zostać wykonany w tym punkcie. Na przykład:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 17
Na panelu sterowania debugera znajdują się również przyciski sterujące, które odpowiadają za to, gdzie chcesz przenieść kontrolę przepływu programu. Czy to nie magia?) Wciskając przycisk F8 (Step Out) przechodzimy przez kod bez wpisywania metod. Naciskając klawisz F9, przestajemy przeglądać wiersze kodu za pomocą debugera i przekazujemy debugerowi kontrolę nad wykonaniem programu. Jeśli naciśniemy F7 (Step Into), to przejdziemy przez kod, wpisując każdą metodę, którą spotkamy po drodze. Nawiasem mówiąc, zwróć szczególną uwagę na ten blok informacyjny:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 18
Pokazuje wątek, w którym się znajdujemy, i metody na stosie bieżącego wątku. Ale to nie wszystko. Dla wygody możesz otworzyć zakładkę ramki. Aby to zrobić, należy włączyć:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 19
Teraz w zakładce ramki widzimy informację o przejściu z metody na metodę, bo zacząłem przeglądać kod za pomocą Step In.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 20
Jak widzimy, nie zawsze da się nas przenieść tam, gdzie aktualnie wykonywany jest program. Jesteśmy teraz w „getDelegate:469, AbstractEntityManager(org.jboss.as.jpa.container)”. Ale tak naprawdę jesteśmy w trakcie realizacji. Świadczy o tym klasa określona przez to:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 21
Spójrzmy na to. Jak wiemy, wskazuje na bieżący obiekt. Jesteśmy w TransactionScopedEntityManager. Dlaczego Idea nie może pokazać nam kodu? Faktem jest, że IntelliJ Idea obecnie nie wie o żadnym TransactionScopedEntityManager, ponieważ nie jest podłączony do naszego projektu (nie ma go w zależnościach projektu). Kiedy serwer aplikacji jest uruchomiony, działa w nim wiele, wiele różnych bibliotek. Ale wiemy o nich bardzo niewiele, ponieważ... ogólnie rzecz biorąc, nie musimy zagłębiać się w elementy wewnętrzne, wystarczy, że to zadziała. Czasem jednak wymaga tego praca lub zainteresowania sportowe. Następnie musisz poinformować Idea o tej bibliotece, aby wiedział, skąd wziąć kod zajęć.

Podłączanie bibliotek innych firm w celu debugowania

Najpierw sami musimy zrozumieć, jaki rodzaj biblioteki wymaga połączenia. Pierwszy sposób jest najtrudniejszy - wyszukaj w Internecie. Szybkość i wynik osiągnięcia rezultatu w dużej mierze zależą od tego, jak dobrze zarządzano projektem. Na przykład WildFly ma otwarte repozytorium. Kiedy więc wygooglujemy „TransactionScopedEntityManager”, przejdziemy do https://github.com/wildfly/wildfly/tree/master/jpa/subsystem i okaże się, że potrzebujemy wildfly-jpa. Druga metoda jest poprawna. Gdzie jest serwer, spójrz tam. Pomóc w tym mogą różne środki. Na przykład w systemie Windows może to być Far Manager . Poniżej znajduje się przykład algorytmu wyszukiwania. Po jego zainstalowaniu i uruchomieniu, za pomocą Tab przejdź do jednej z zakładek, korzystając Alt+F1z lewej lub Alt+F2prawej zakładki i wybierz potrzebną nam partycję na dysku twardym. Jest całkiem możliwe, że sam katalog Far Managera jest otwarty w Far Managerze po instalacji. Aby przejść do katalogu głównego dysku, naciśnij Ctrl + \. Za pomocą Alt+Fotwórz okno wyszukiwania, zacznij wpisywać nazwę katalogu i po znalezieniu katalogu naciśnij klawisz Enter. To wyszukiwanie jest sprytne i wyróżnia te katalogi, które pasują do wyszukiwanego tekstu. Jeśli wprowadzisz znaki, dla których nie ma folderów, nie będzie można wprowadzić takich znaków. W ten sposób przechodzimy do katalogu serwera aplikacji. Załóżmy, że nie wiemy, gdzie na serwerze znajdują się moduły. Być może po raz pierwszy w życiu słyszysz o jakimś rodzaju WildFly. Dlatego kliknij natychmiast tutaj, Alt+F7aby wyszukać pliki. Logika podpowiada więc: potrzebujemy pliku z biblioteką. Oznacza to, że potrzebujemy słoika. Wewnątrz powinna znajdować się klasa TransactionScopedEntityManager. Ponieważ class = plik, a następnie poszukaj „zawiera”. Czyli coś takiego:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 22
Teraz poczekajmy na wynik. Nie będzie kazał ci czekać)
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 23
Musimy teraz znaleźć gdzieś kod źródłowy. I są 2 opcje: Użyjmy może tego drugiego. Znajdźmy tam:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 24
Przejdźmy teraz do opisu zależności. Na tej stronie możesz pobrać kod źródłowy. Świetnie, teraz mamy pobrany kod. Pozostaje tylko podłączyć bibliotekę. Łączy się niezwykle prosto. Musimy otworzyć ustawienia projektu:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 25
Tam wybieramy „Biblioteki” i otrzymane kody źródłowe dodajemy do sekcji „Źródła”, a w sekcji „Klasy” wskazujemy sam plik jar biblioteki z katalogu WildFly, który znaleźliśmy za pomocą Far Managera. Następnie, gdy przejdziemy przez klawisz F7, zobaczymy zawartość klas AbstractEntityManager i TransactionScopedEntityManager, a także staniemy się dostępni poprzez wyszukiwanie według klas za pomocą Ctrl+N.

Punkty przerwania z warunkami

Wróćmy teraz do punktów przerwania. Czasami nie zawsze chcemy przestać, ale tylko pod pewnymi warunkami. Co robić? I tutaj nasze IDE również nam pomoże. Umieszczając punkt przerwania, możemy przypisać do niego warunek. Na przykład umieść punkt i kliknij go prawym przyciskiem myszy:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 26
Teraz punkt przerwania zostanie uruchomiony tylko wtedy, gdy nazwa to Maximilian. Kliknięcie przycisku Więcej spowoduje udostępnienie rozszerzonego zestawu ustawień punktów przerwania.

Punkty przerwania w wyjątkach

Czasami może pojawić się błąd i chcemy prześledzić, skąd on pochodzi. Wtedy możemy dodać punkt przerwania nie w konkretnej linii kodu, ale w miejscu, w którym zostanie zgłoszony wyjątek. Aby to zrobić, musisz rozwinąć listę wszystkich punktów przerwania:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 27
I utwórz nową regułę dla wybranego typu wyjątku:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 28
Na przykład dla NPE:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 29

Klasy HotSwap

Debuger to niesamowita rzecz. Oprócz debugowania umożliwia zmianę klas! Tak, zasobów (takich jak na przykład strony xhtml) nie można tak łatwo zmienić. Ale kod klas Java można zastąpić na bieżąco (nazywa się to Hot Swap). Aby to zrobić, po prostu zmień klasę z dołączonym debugerem i wykonaj polecenie Uruchom -> Załaduj ponownie zmienione klasy. Przydatna recenzja na ten temat: 4 bezpłatne sposoby wymiany kodu na gorąco w JVM

Wniosek

Debuger to potężne narzędzie, które pozwala programiście wniknąć w głąb wykonywanego kodu i przestudiować go w każdym szczególe. Dzięki temu możesz poprawić najbardziej mylące błędy. Pozwala także lepiej zrozumieć, jak działają niektóre biblioteki. Nawet tak krótka recenzja zrobiła spore wrażenie, ale mam nadzieję, że będzie przydatna i ciekawa. Jeśli ktoś jest zainteresowany tym materiałem, może kontynuować nurkowanie korzystając z poniższych linków:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 30
#Wiaczesław
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION