JavaRush /Java-Blog /Random-DE /IntelliJ IDEA und Debug: nicht tauchen, sondern schnorche...
Viacheslav
Level 3

IntelliJ IDEA und Debug: nicht tauchen, sondern schnorcheln

Veröffentlicht in der Gruppe Random-DE
Das Schreiben von Code ist die halbe Miete. Es muss noch dafür gesorgt werden, dass es richtig funktioniert. IDEs und Debugging-Tools helfen uns dabei sehr.
IntelliJ IDEA und Debug: Nicht Tauchen, sondern Schnorcheln – 1
Am Beispiel von IntelliJ IDEA möchte ich mich damit vertraut machen, wie wir herausfinden können, was mit unserem Code passiert, wenn er ausgeführt wird. Debuggen ist ein weitreichendes Thema, daher bietet diese Rezension kein tiefes Eintauchen wie bei einem Taucher. Aber ich hoffe auf jeden Fall Schnorcheln)

Einführung

Ein Teil des Codeschreibens besteht darin, ihn zu debuggen. Und wenn zu Ihren Aufgaben auch Code-Unterstützung gehört, fällt noch mehr Debugging an. Darüber hinaus können Sie mit Hilfe des Debuggings die Arbeit der verwendeten Bibliotheken und Frameworks genauso tief untersuchen wie Sie in den Dschungel des Codes anderer eintauchen können. Für unseren Tauchgang benötigen wir: Entpacken Sie zunächst das heruntergeladene Archiv mit dem Quick Start-Quellcode. Starten Sie IntelliJ Idea und erstellen Sie „ Neues Projekt aus vorhandenen Quellen “. Wählen Sie die Datei pom.xml im Unterverzeichnis hibernate4 aus . Geben Sie beim Importieren „ Maven-Projekte automatisch importieren “ an und schließen Sie die Erstellung des Projekts ab, wobei andere Einstellungen unverändert bleiben. Während das Projekt importiert wird, entpacken Sie den heruntergeladenen WildFly-Anwendungsserver in ein Verzeichnis. Wir starten den Server mit der Datei (oder standalone.sh für *nix-Systeme). (!) Es ist wichtig, mit dem Parameter --debug zu beginnen . Wir warten darauf, dass der Server startet. Sie werden uns schreiben, dass es begonnen hat, und die Uhrzeit angeben. Es wird ungefähr so ​​aussehen: bin\standalone.bat
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 2
Als nächstes müssen wir das von uns ausgewählte Projekt auf dem Server ausführen. Dieser Vorgang wird in einer kleinen Dokumentation beschrieben, die im Projekt selbst zu finden ist: \hibernate4\README.adoc Wie in dieser Dokumentation angegeben, müssen wir den Befehl im Verzeichnis hibernate4 ausführen: mvn clean package wildfly:deploy Wir warten auf eine Nachricht, dass der Build erfolgreich abgeschlossen wurde:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 3
Danach können wir im Serverprotokoll sehen, wie das neue Projekt „bereitgestellt“ wurde:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 4
Danach gehen wir zur Seite http://localhost:8080/wildfly-hibernate4und es sollte eine Seite mit dem Formular „ Mitgliederregistrierung “ angezeigt werden. Unsere Vorbereitungen für die Experimente sind also abgeschlossen und wir können beginnen)) Zur Verdeutlichung werden noch viele Bilder folgen, also machen Sie sich bereit)

Remote-Debug

Daher müssen wir den Debug-Modus so konfigurieren, dass unsere IDE die Ausführung von Code auf dem Anwendungsserver steuert. IntelliJ Idea gibt es in zwei Versionen: kostenlos (Community) und kostenpflichtig (Ultimate). Letzteres kann offiziell in Form von EAP ausprobiert werden. In der Ultimate-Version ist alles einfach – der Anwendungsserver kann im Debug-Modus direkt aus der IDE gestartet werden. In der Community-Version müssen Sie jedoch einige Dinge manuell erledigen. Betrachten wir daher einen komplizierteren Fall, d. h. Einstellung in der Community-Version. Die Community-Version weist einige Einschränkungen auf. Insbesondere können Sie keinen Anwendungsserver darauf ausführen. Sie können jedoch Remote-Debugging (Remote Debug) einrichten, wenn irgendwo separat ein laufender Server mit der von uns benötigten Anwendung vorhanden ist. Verwenden wir die Beschreibung des Setups von hier: Remote-Debug Wildfly in der IntelliJ Idea Community Edition (Einrichten der Remote Run-Konfiguration für Port 8787). Nach der Konfiguration starten wir unsere neue Konfiguration im Debug-Modus:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 5
Wenn alles in Ordnung ist, sehen wir unten eine Meldung dazu:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 6

Debug-Prozess

Lassen Sie uns das Speichern des Datensatzes debuggen. Dazu müssen wir uns zunächst für den Ort entscheiden, den wir erkunden möchten. Dem Fenster nach zu urteilen, benötigen wir einen „Registrieren“-Button. Finden wir es im Code. Wir brauchen also ein Element, es sollte den Text haben: „Register“. Oder sie sollte etwas damit zu tun haben. Klicken Sie auf Ctrl+Shift+Fund suchen Sie nach „In Anführungszeichen registrieren“. Wir sehen, dass es eine auf index.xhtml gibt.
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 7
Drücken Sie die Eingabetaste, um zur gefundenen Quelle zu gelangen:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 8
Wir sehen also, dass bei der Registrierung memberController.register aufgerufen wird. Anscheinend muss es sich dabei um eine Art Java-Klasse handeln. Klicken Sie Ctrl+Nund suchen Sie nach:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 9
Tatsächlich gibt es eine solche Klasse. Lasst uns darauf eingehen. Anscheinend sollte es eine Registermethode geben. Klicken Sie Ctrl+F12und suchen Sie nach der Registrierungsmethode
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 10
Tatsächlich haben wir es gefunden. Anscheinend erfolgt die Registrierung hier in memberRegistration.register . Drücken Sie Strg und klicken Sie auf die Methode, um hineinzufallen:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 11
Lassen Sie uns nun einen „Breakpoint“ oder Break Point festlegen. Dies ist eine Markierung, die angibt, wo die Codeausführung angehalten werden soll. In diesem Moment werden wir die Gelegenheit haben, viele interessante Dinge zu lernen. Um es einzufügen, müssen Sie auf die Stelle rechts neben der Zeilennummer klicken.
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 12
Füllen Sie auf der Seite http://localhost:8080/wildfly-hibernate4 die Felder aus und klicken Sie auf die Schaltfläche Registrieren. Das Ideensymbol auf dem Bedienfeld blinkt:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 13
Wenn Sie zu Idea gehen, können Sie sehen, dass das Debug-Panel viele interessante Informationen enthält:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 14
Hier können Sie den Wert der Felder des Objekts sehen. Woraus besteht beispielsweise ein registriertes Mitglied:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 15
Großartig. Was können wir sonst noch tun? Wir können das Kontextmenü öffnen und dort Ausdruck auswerten auswählen (oder über das Menü Ausführen -> Ausdruck auswerten). Besser noch, im Debugger-Kontrollfeld:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 16
Dies ist eine super coole Fähigkeit an einem Haltepunkt, Zugriff auf alles zu haben, worauf dieser Codepunkt Zugriff hat, um jeden Code auszuführen, der an diesem Punkt ausgeführt werden könnte. Zum Beispiel:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 17
Es gibt auch Steuerschaltflächen im Debugger-Bedienfeld, die dafür verantwortlich sind, wohin Sie die Programmflusssteuerung verschieben möchten. Ist das nicht Zauberei?) Durch Drücken der Taste F8 (Step Out) gehen wir durch den Code, ohne Methoden einzugeben. Durch Drücken von F9 hören wir auf, mit dem Debugger durch die Codezeilen zu laufen, und geben dem Debugger die Kontrolle über die Ausführung des Programms. Wenn wir F7 (Step Into) drücken, gehen wir den Code durch und geben jede Methode ein, die uns unterwegs begegnet. Achten Sie übrigens besonders auf diesen Informationsblock:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 18
Dies zeigt den Thread, in dem wir uns befinden, und die Methoden auf dem Stapel des aktuellen Threads. Aber das ist nicht alles. Der Einfachheit halber können Sie die Registerkarte „Frames“ öffnen. Dazu muss es aktiviert sein:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 19
Jetzt sehen wir auf der Registerkarte „Frames“ Informationen über den Übergang von Methode zu Methode, weil Ich habe begonnen, den Code mithilfe von „Step Into“ durchzugehen.
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 20
Wie wir sehen, können wir nicht immer dorthin übertragen werden, wo das Programm gerade ausgeführt wird. Wir sind jetzt bei „getDelegate:469, AbstractEntityManager(org.jboss.as.jpa.container)“. Aber tatsächlich sind wir in der Umsetzung. Dies wird durch die hier angegebene Klasse belegt:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 21
Schauen wir uns das an. Wie wir wissen, zeigt es auf das aktuelle Objekt. Wir sind bei TransactionScopedEntityManager. Warum kann Idea uns den Code nicht zeigen? Tatsache ist, dass IntelliJ Idea derzeit keinen TransactionScopedEntityManager kennt, weil Es ist nicht mit unserem Projekt verbunden (es befindet sich nicht in den Projektabhängigkeiten). Wenn ein Anwendungsserver ausgeführt wird, laufen darin viele, viele verschiedene Bibliotheken. Aber wir wissen sehr wenig über sie, weil... Im Allgemeinen müssen wir uns nicht mit den Interna befassen, wir brauchen es nur, um zu funktionieren. Aber manchmal erfordert es die Arbeit oder das sportliche Interesse. Anschließend müssen Sie Idea über diese Bibliothek informieren, damit sie weiß, wo sie den Klassencode erhalten kann.

Anbindung von Bibliotheken von Drittanbietern zum Debuggen

Zunächst müssen wir selbst verstehen, welche Art von Bibliothek angeschlossen werden muss. Der erste Weg ist der schwierigste – die Suche im Internet. Die Geschwindigkeit und das Ergebnis der Ergebnisfindung hängen stark davon ab, wie gut das Projekt gemanagt wurde. WildFly verfügt beispielsweise über ein offenes Repository. Wenn wir also „TransactionScopedEntityManager“ googeln, gehen wir zu https://github.com/wildfly/wildfly/tree/master/jpa/subsystem und stellen fest, dass wir wildfly-jpa benötigen. Die zweite Methode ist richtig. Wo der Server ist, schauen Sie dort nach. Dabei können verschiedene Mittel helfen. Unter Windows könnte es beispielsweise Far Manager sein . Nachfolgend finden Sie ein Beispiel für einen Suchalgorithmus. Nachdem Sie es installiert und gestartet haben, wechseln Sie mit der Tabulatortaste zu einer der Registerkarten, indem Sie Alt+F1die linke oder Alt+F2rechte Registerkarte verwenden, und wählen Sie die benötigte Partition auf der Festplatte aus. Es ist durchaus möglich, dass das Far Manager-Verzeichnis selbst nach der Installation im Far Manager geöffnet ist. Um zum Stammverzeichnis der Festplatte zu gelangen, drücken Sie Ctrl + \. Öffnen Sie mit Alt+Fdas Suchfenster, beginnen Sie mit der Eingabe des Namens des Verzeichnisses und drücken Sie die Eingabetaste, nachdem das Verzeichnis gefunden wurde. Diese Suche ist clever und hebt diejenigen Verzeichnisse hervor, die zum Suchtext passen. Wenn Sie Zeichen eingeben, für die es keine Ordner gibt, können diese Zeichen nicht eingegeben werden. Auf diese Weise gelangen wir in das Verzeichnis des Anwendungsservers. Nehmen wir an, wir wissen nicht, wo sich die Module auf dem Server befinden. Vielleicht ist es das erste Mal in Ihrem Leben, dass Sie von einer Art WildFly hören. Klicken Sie daher sofort hier, Alt+F7um nach Dateien zu suchen. Die Logik schreibt also vor: Wir brauchen eine Datei mit der Bibliothek. Das heißt, wir brauchen ein Glas. Es sollte eine TransactionScopedEntityManager-Klasse darin vorhanden sein. Weil class = file, dann suchen Sie nach „contains“. Das heißt, etwa so:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 22
Warten wir nun auf das Ergebnis. Er wird dich nicht warten lassen)
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 23
Jetzt müssen wir irgendwo den Quellcode dafür finden. Und es gibt 2 Möglichkeiten: Lassen Sie uns vielleicht die zweite verwenden. Finden wir dort:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 24
Kommen wir nun zur Beschreibung der Abhängigkeit. Auf dieser Seite können Sie den Quellcode herunterladen. Großartig, jetzt haben wir den Code heruntergeladen. Jetzt muss nur noch die Bibliothek angeschlossen werden. Der Anschluss ist denkbar einfach. Wir müssen die Projekteinstellungen öffnen:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 25
Dort wählen wir „Bibliotheken“ aus und fügen die empfangenen Quellcodes zum Abschnitt „Quellen“ hinzu. Im Abschnitt „Klassen“ geben wir die Bibliotheks-JAR-Datei selbst aus dem WildFly-Verzeichnis an, die wir mit Far Manager gefunden haben. Wenn wir danach durch F7 navigieren, sehen wir den Inhalt der Klassen AbstractEntityManager und TransactionScopedEntityManager und werden auch über eine Suche nach Klasse mit Strg+N verfügbar.

Haltepunkte mit Bedingungen

Kehren wir nun zu den Haltepunkten zurück. Manchmal wollen wir nicht immer aufhören, sondern nur unter bestimmten Bedingungen. Was zu tun? Und auch hier hilft uns unsere IDE. Indem wir einen Haltepunkt platzieren, können wir ihm eine Bedingung zuweisen. Setzen Sie zum Beispiel einen Punkt und klicken Sie mit der rechten Maustaste darauf:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 26
Jetzt wird der Haltepunkt nur dann ausgelöst, wenn der Name Maximilian lautet. Durch Klicken auf die Schaltfläche „Mehr“ steht Ihnen ein erweiterter Satz an Einstellungen für Haltepunkte zur Verfügung.

Haltepunkte bei Ausnahmen

Manchmal erhalten wir einen Fehler und möchten herausfinden, woher er kommt. Dann können wir einen Haltepunkt nicht an einer bestimmten Codezeile hinzufügen, sondern an der Stelle, an der die Ausnahme ausgelöst wird. Dazu müssen Sie die Liste aller Haltepunkte erweitern:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 27
Und erstellen Sie eine neue Regel für den ausgewählten Ausnahmetyp:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 28
Zum Beispiel für NPE:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 29

HotSwap-Klassen

Debugger ist eine erstaunliche Sache. Zusätzlich zum Debuggen können Sie damit Klassen ändern! Ja, Ressourcen (wie zum Beispiel XHTML-Seiten) können nicht so einfach geändert werden. Der Code von Java-Klassen kann jedoch im laufenden Betrieb ausgetauscht werden (dies wird als Hot Swap bezeichnet). Ändern Sie dazu einfach die Klasse mit angeschlossenem Debugger und führen Sie Ausführen -> Geänderte Klassen neu laden aus. Nützliche Rezension zu diesem Thema: 4 kostenlose Möglichkeiten, Code auf der JVM im laufenden Betrieb auszutauschen

Abschluss

Ein Debugger ist ein leistungsstarkes Tool, das es einem Entwickler ermöglicht, bis in die Tiefen des ausgeführten Codes vorzudringen und ihn bis ins Detail zu studieren. Auf diese Weise können Sie die verwirrendsten Fehler korrigieren. Außerdem können Sie so besser verstehen, wie bestimmte Bibliotheken funktionieren. Sogar eine so kurze Rezension erwies sich als ziemlich beeindruckend, aber ich hoffe, dass sie nützlich und interessant sein wird. Wenn jemand Interesse an diesem Material hat, kann er den Tauchgang über die folgenden Links fortsetzen:
IntelliJ IDEA und Debug: Nicht tauchen, sondern schnorcheln – 30
#Wjatscheslaw
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION