Hinweis:
- Dieses Tutorial steht in einer von Oracle bereitgestellten kostenlosen Übungsumgebung zur Verfügung.
- Er verwendet Beispielwerte für Oracle Cloud Infrastructure-Zugangsdaten, Mandanten und Compartments. Ersetzen Sie diese Werte beim Durchführen Ihrer Übung durch spezifische Werte für Ihre Cloud-Umgebung.
Durch GraalVM Native Image generierte ausführbare Dateien debuggen
Einführung
In dieser Übung wird die Debuggingunterstützung von Visual Studio Code (VS Code) für Java-Anwendungen vorgestellt, die im Voraus mit GraalVM Enterprise Native Image kompiliert wurden.
Die Verwendung von GraalVM Native Image im Voraus wird weiterhin steigen und zusammen mit diesem Wachstum müssen Tools bereitgestellt werden. Die Erweiterung GraalVM Tools for Java für VS Code umfasst Debuggingunterstützung für ausführbare Programme, die von GraalVM Native Image generiert werden, mit denen:
- Breakpoints
- Überwachungspunkte
- Interaktive Schritt-für-Schritt-Ausführung
- Variablenprüfung für ausführbare Dateien
In dieser Übung werden diese Features (und mehr) im Kontext eines kleinen Beispiels vorgestellt.
GraalVM Enterprise ist ohne Kosten auf Oracle Cloud Infrastructure (OCI) verfügbar
Laborinhalt
In dieser Übung führen Sie folgende Schritte aus:
- Lab-Umgebung initialisieren
- Stellen Sie eine Verbindung zu einem Remote-VM-Host in Oracle Cloud her, in dem Sie die Übung ausführen
- Java-Anwendungen mit GraalVM Native Image in einer nativen ausführbaren Datei erstellen und kompilieren
- Natives Debugging für eine Anwendung im VS-Code konfigurieren
- Festlegen von Breakpoints und schrittweiser Java-Quelle, die in den nativen Rechnercode kompiliert wurde
Geschätzte Labordauer: 45 Minuten
HINWEIS: Wenn das Laptopsymbol angezeigt wird, müssen Sie eine Aktion ausführen, wie z.B. die Eingabe eines Befehls oder die Bearbeitung einer Datei.
# The box under the icon will tell you what to do.
Schritt 1: Verbindung zu einer VM-Instanz herstellen
Beim Starten der Übung werden die erforderlichen Compute-Ressourcen im Hintergrund bereitgestellt (in diesem Fall eine VM-Instanz). Das Provisioning kann einige Minuten in Anspruch nehmen. Informationen dazu, wann die Ressourcen vollständig bereitgestellt und bereit sind, finden Sie auf der Webseite Luna Lab auf der Registerkarte Ressourcen (siehe Schritt 2 unten).
-
Doppelklicken Sie auf dem Desktop auf das Symbol Luna Lab, um den Browser zu öffnen.
-
Wenn das animierte Fanggerät außer Ressourcen zu einem Häkchen wechselt, werden alle erforderlichen Compute- und Netzwerkressourcen bereitgestellt, und Sie können fortfahren.
-
Scrollen Sie nach unten zu Setup, und kopieren Sie den Text aus dem Textfeld Open VSCode and Connect. Sie müssen auf
View Details
klicken. Dieses Skript richtet die Umgebung ein, die für die Übung erforderlich ist, und startet den VS-Code. Mit der Schaltfläche In Zwischenablage kopieren ganz rechts, die angezeigt wird, wenn Sie den Mauszeiger über das Feld bewegen. -
Klicken Sie auf das Menü Anwendungen, und öffnen Sie einen Terminalemulator.
-
Platzieren Sie den Cursor im Terminalfenster, und fügen Sie das kopierte Labinitialisierungsskript ein (Shift+Ctrl+V). In einem Dialogfeld werden Sie gewarnt, dass Sie mehrere verdächtige Zeilen einfügen. Klicken Sie jedoch auf Einfügen, um fortzufahren.
-
Ein VS-Codefenster wird geöffnet und stellt automatisch eine Verbindung zur Remote-VM-Instanz her, die für Sie bereitgestellt wurde. Klicken Sie auf Weiter, um den Fingerprint des Rechners zu akzeptieren.
-
Im grünen Feld in der unteren linken Ecke des VS-Codes wird
SSH: <REMOTE VM IP ADDRESS>
angezeigt, um anzugeben, dass Sie über SSH verbunden sind.
Schritt 2: Beispielanwendung erstellen
Mit dem VS-Code GraalVM Tools for Java können Sie Java-Anwendungen erstellen, testen und debuggen, die auf der JVM ausgeführt werden. Im Rahmen dieser Übung debuggen wir jedoch native, ausführbare Dateien, die von GraalVM Native Image generiert werden. Deshalb verwenden wir nicht alle Funktionen der Tools.
Öffnen Sie src/main/java/javagdb/App.java
, und prüfen Sie die Quelle. Die Anwendung berechnet den Faktor des als Eingabeargument übergebenen Wertes.
Sie können die Anwendung auf der Java Virtual Machine (JVM) mit den Links ausführen oder debuggen, die im Quellcode überlagert sind (siehe Abbildung). Vor dem Debuggen einer nativen ausführbaren Datei ist jedoch ein zusätzliches Setup erforderlich.
Beachten Sie, dass der Aufruf von neverCalledMethod()
mit einer gelben Wellenlinie unterstrichen ist, um anzugeben, dass dieser Code nicht erreichbar ist. Dieser Dead Code ist absichtlich in der Anwendung enthalten. Später wird gezeigt, wie GraalVM Native Image beim Debugging mit totem Code in einer nativen ausführbaren Datei umgeht.
Kompilieren Sie die Anwendung, und generieren Sie eine native ausführbare Datei. Führen Sie dazu den Maven-Build der Anwendung aus: Zuerst werden die Java-Quellen der Anwendung mit javac
kompiliert, und dann wird mit dem Maven-Plug-in GraalVM Native Build Tools eine native ausführbare Datei mit dem Utility native-image
generiert.
-
Öffnen Sie ein Terminal mit dem Menü Terminal>New Terminal am oberen Rand des VS-Codefensters.
-
Führen Sie im Terminal Maven aus, um das Projekt zu erstellen.
mvn -Pnative -DskipTests package
Die zum Generieren einer nativen ausführbaren Datei erforderliche Zeit hängt in hohem Maße von der Anzahl der Cores und dem verfügbaren Arbeitsspeicher ab, der von Ihrem Rechner bereitgestellt wird. Es sollte einige Minuten dauern.
-
Sie finden die generierte ausführbare Datei mit dem Namen
javagdb
im Ordnertarget
. Beachten Sie, dass es nur ein paar MB ist!ls -lh target
Schritt 3: Debug-Konfiguration in launch.json
erstellen
Nachdem Sie eine ausführbare Datei mit Debug-Symbolen generiert haben, können Sie jetzt die Unterstützung für GraalVM Tools for Java Debugging testen.
-
Klicken Sie auf das Symbol Ausführen und debuggen im
Activity Bar
auf der linken Seite, um den DebugSide Bar
-Bereich zu öffnen. -
Klicken Sie auf den Link Launch.json-Datei erstellen, und wählen Sie
Native Image
aus der Dropdown-Liste "Umgebung" aus. -
Die Datei
launch.json
enthält eine Boilerplate-Konfigurationnativeimage
, die Sie aktualisieren können. Bearbeiten Sie den Wert der EigenschaftnativeImagePath
, um die ausführbare Dateijavagdb
im Ordnertarget
zu suchen, und fügen Sie eine Eigenschaftargs
hinzu, um das Eingabeargument anzugeben.{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "nativeimage", "request": "launch", "name": "Launch Native Image", "nativeImagePath": "${workspaceFolder}/target/javagdb", "args": "100" } ] }
Schritt 4: Ausführbare Programme debuggen
Wenn der kompilierte Code und die Startkonfiguration vorhanden sind, können Sie die ausführbare Datei debuggen. Legen Sie einen Breakpoint fest, und durchlaufen Sie den Code.
-
Kehren Sie zu
App.java
zurück, und legen Sie einen Breakpoint in Zeile 10 fest, indem Sie auf den Rand links neben der Zeilennummer klicken. -
Klicken Sie auf den grünen Pfeil oben in der Debug-Seitenleiste, um die Anwendung im Debug-Modus auszuführen.
Beachten Sie, dass die Statusleiste unten im Fenster "VS-Code" die Farbe in Orange ändert, um anzuzeigen, dass das Debugging durchgeführt wird.
-
Die Anwendung wird schnell gestartet, Debug-Steuerelemente werden über der Anwendungsquelle angezeigt, und die Ausführung wird am Breakpoint gestoppt, den Sie in Zeile 10 festlegen.
-
Verwenden Sie die Schaltfläche
Step Over
in den Debugger-Steuerelementen, um zu Zeile 17 zu gehen. Beachten Sie, dass der Wert der lokalen Variablenn
100
lautet. -
Fahren Sie mit dem Schritt nach unten zu Zeile 21 fort, und jetzt ist die lokale Variable
f
definiert und auf 100 Faktorial gesetzt. -
Blättern Sie im Quellcode nach unten, damit die Zeilen 24 bis 35 angezeigt werden. Beachten Sie, dass sowohl der Ausdruck, der
neverCalledMethod()
aufruft, als auch die gesamte Methodendefinition ausgegraut sind.Das native GraalVM Image erkennt und eliminiert toten oder nicht zugänglichen Code von der generierten ausführbaren Datei. Weder der Ausdruck
if(false)
nochneverCalledMethod
sind im Rechnercode der ausführbaren Datei vorhanden. Um dies zu veranschaulichen, ruft der Debugger den Eliminierungscode ab. -
Klicken Sie auf die Debugger-Kontrollschaltfläche
Continue
, damit das Programm abgeschlossen werden kann, oder verwenden Sie die SchaltflächeStep Over
, um den Rest des Programms zu durchlaufen. Die Ausgabe wird inDEBUG CONSOLE
angezeigt.
Schlussfolgerung
In dieser Übung haben Sie mit GraalVM Tools for Java eine kompilierte, vorab von GraalVM Native Image generierte ausführbare Datei debuggen. Sie haben gelernt, wie Sie eine Startkonfiguration erstellen, wie Sie einen Breakpoint festlegen und eine Anwendung debuggen, und wie Sie Code erkennen, der als nicht erreichbar erkannt wurde und daher nicht in der ausführbaren Datei enthalten ist.
Weitere Informationen zur Entwicklung mit GraalVM Native Image:
- Sehen Sie sich ein kurzes Video mit GraalVM Native Image Hello World an.
- Hier erlernen Sie die Grundlagen der Vorabkompilierung in der Online-Übung GraalVM Native Image Quick Start.
- Sehen Sie sich eine Präsentation des nativen Imagearchitekten Christian Wimmer an: Java Ahead-of-Time Compilation mit Oracle GraalVM
- Lesen Sie die Referenzdokumentation zu GraalVM Native Image
Weitere Lernressourcen
Sehen Sie sich andere Übungen zu docs.oracle.com/learn an, oder greifen Sie auf weitere Inhalte für kostenloses Lernen im Oracle Learning YouTube-Kanal zu. Außerdem besuchen Sie education.oracle.com/learning-explorer, um Oracle Learning Explorer zu werden.
Produktdokumentation finden Sie im Oracle Help Center.