ノート:
- このチュートリアルは、Oracle提供の無料ラボ環境で入手できます。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントに例の値を使用します。演習を完了するときは、これらの値をクラウド環境に固有の値に置き換えます。
GraalVM Native Imageで生成された実行可能ファイルのデバッグ
イントロダクション
このラボでは、GraalVM Enterprise Native Imageを使用して事前にコンパイルされたJavaアプリケーションのVisual Studio Code (VS Code)によって提供されるデバッグ・サポートをご紹介します。
GraalVM Native Imageの事前にコンパイルを実行すると、成長を継続し、その成長とともにツールの必要性が増します。VS CodeのGraalVM Tools for Java拡張機能には、GraalVM Native Imageによって生成される実行可能ファイルのデバッグ・サポートが含まれており、次の機能が提供されます。
- ブレークポイント
- ウォッチポイント
- 対話型で手順を追った実行
- 実行可能ファイルの変数検査
このラボでは、これらの機能(およびその他)を小さな例のコンテキストで紹介します。
GraalVM Enterpriseは、Oracle Cloud Infrastructure(OCI)のコストなしで利用可能
ラボ・コンテンツ
この演習では、次のことを行います。
- 演習環境の初期化
- 演習を実行するOracle CloudのリモートVMホストに接続します。
- GraalVM Native Imageを使用して、Javaアプリケーションをネイティブな実行可能ファイルにビルドしてコンパイルする
- VSコードのアプリケーションのネイティブ・デバッグの構成
- ネイティブ・マシン・コードにコンパイルされたJavaソースでのブレークポイントおよびステップ・スルーの設定
推定ラボ時間: 45分
注:ラップトップアイコンが表示された場合は常に、コマンドの入力やファイルの編集などのアクションを実行する必要があります。

# The box under the icon will tell you what to do.
ステップ1: VMインスタンスへの接続
演習を開始すると、必要なコンピュート・リソースがバックグラウンド(この場合はVMインスタンス)でプロビジョニングされます。プロビジョニングの完了には数分かかる場合があります。Luna Lab Webページの「リソース」タブを参照すると、リソースが完全にプロビジョニングされ、準備ができたときにわかります(下の手順2を参照)。
-
デスクトップの「Luna Lab」アイコンをダブルクリックしてブラウザを開きます。

-
「リソース」以外のアニメーション・ギアがチェック・マークに変わると、必要なすべてのコンピュートおよびネットワーク・リソースがプロビジョニングされ、続行できます。

-
「設定」までスクロールし、「VSCodeおよび接続」テキスト・ボックスからテキストをコピーします。多くのユーザーが
View Detailsをクリックする必要があります。このスクリプトは、演習に必要な環境を設定し、VSコードを起動します。ボックス上にカーソルを置いたときに表示される右端の「クリップボードにコピー」ボタンを使用できます。
-
「アプリケーション」メニューをクリックし、ターミナル・エミュレータを開きます。

-
ターミナル・ウィンドウにカーソルを置き、コピーしたlab initスクリプト(Shift+Ctrl+V)を貼り付けます。疑わしいように見える複数の行を貼り付けることをダイアログ・ボックスで警告しますが、「貼付け」をクリックして続行します。

-
VSコード・ウィンドウが開き、プロビジョニングされているリモートVMインスタンスに自動的に接続します。「続行」をクリックして、マシンのフィンガープリントを受け入れます。

-
VSコードの左下隅にある緑色のボックスには、SSH経由で接続していることを示す
SSH: <REMOTE VM IP ADDRESS>が表示されます。
ステップ2:サンプル・アプリケーションの構築
VS Code GraalVM Tools for Javaを使用すると、JVMで実行されるJavaアプリケーションを構築、テストおよびデバッグできます。ただし、このラボでは、GraalVM Native Imageで生成されたネイティブ実行可能ファイルのデバッグに重点を置いています。したがって、ツールが提供するすべての機能を使用することはありません。
src/main/java/javagdb/App.javaを開き、ソースを確認します。アプリケーションは、入力引数として渡された値の階乗を計算します。
(図に示すように)ソース・コードでオーバーレイされたリンクを使用して、Java Virtual Machine (JVM)でアプリケーションを実行またはデバッグできます。ただし、ネイティブ実行可能ファイルをデバッグする前にいくつかの追加設定が必要です。

neverCalledMethod()へのコールには、このコードにアクセスできないことを示す黄色のwavy行の下線が付いています。このデッド・コードは、意図的にアプリケーションに含められます。後で、デバッグ中にGraalVM Native Imageがネイティブ実行可能ファイルのデッド・コードをどのように処理しているか確認します。

アプリケーションをコンパイルし、ネイティブ実行可能ファイルを生成します。これを行うには、アプリケーションのMavenビルドを実行します。まず、アプリケーションのJavaソースをjavacでコンパイルし、次にGraalVM Native Build Tools Mavenプラグインを使用して、native-imageユーティリティを使用してネイティブ実行可能ファイルを生成します。
-
「VS Code」ウィンドウの上部にある「Terminal」→「New Terminal」メニューを使用して端末を開きます。
-
端末で、Mavenを実行してプロジェクトを構築します。

mvn -Pnative -DskipTests packageネイティブ実行可能ファイルを生成するために必要な時間は、コア数およびマシンによって提供される使用可能なメモリーの量に大きく依存します。演習用機械には数分かかります。
-
生成された
javagdb実行可能ファイルは、targetフォルダにあります。数MBのみであることに注意してください。
ls -lh target
ステップ3: launch.jsonでのデバッグ構成の作成
デバッグ・シンボルを使用して実行可能ファイルが生成されたので、GraalVM Tools for Javaのデバッグ・サポートを試すことができます。
-
左側の
Activity Barにある「実行およびデバッグ」アイコンをクリックして、デバッグSide Barパネルを開きます。 -
「create a Launch.json file」リンクをクリックし、「環境」ドロップダウン・リストから
Native Imageを選択します。
-
launch.jsonファイルには、更新するボイラープレートnativeimage構成が含まれています。nativeImagePathプロパティの値を編集して、targetフォルダのjavagdb実行可能ファイルに特定し、argsプロパティを追加して入力引数を指定します。
{ // 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" } ] }
ステップ4:実行ファイルのデバッグ
コードがコンパイルされ、起動構成が行われると、実行可能ファイルをデバッグする準備が整います。ブレークポイントを設定し、コードをステップスルーします。
-
App.javaに戻り、行番号の左にあるマージンをクリックして行10にブレークポイントを設定します。
-
デバッグ・サイド・バーの上部にある緑色の矢印をクリックして、アプリケーションをデバッグ・モードで実行します。

「VS Code」ウィンドウの下部にあるステータス・バーは、デバッグが実行されていることを示す色がオレンジ色に変わることに注意してください。

-
アプリケーションが起動し、デバッグ・コントロールがアプリケーション・ソースの上に表示され、実行は行10に設定したブレークポイントで停止します。

-
デバッガ制御の
Step Overボタンを使用して、17行目まで下げます。ローカル変数nの値が100であることに注意してください。
-
21行目までステップ・ダウンし、ローカル変数
fが定義され、100のファクタリングに設定されます。
-
ソース・コードを下にスクロールして、24行目から35行目を表示します。
neverCalledMethod()をコールする式とメソッド定義全体がグレー表示されています。GraalVM Native Imageは、生成した実行可能ファイルから死または到達不可能なコードを検出および除去します。
if(false)式もneverCalledMethodも実行可能ファイルのマシン・コードに存在しません。これを説明するために、デバッガは排除されたコードをつかみます。
-
デバッガ制御の
Continueボタンをクリックして、プログラムの実行を完了させるか、またはStep Overボタンを使用して残りのプログラムを実行します。出力はDEBUG CONSOLEに表示されます。
まとめ
このラボでは、GraalVM Tools for Javaを使用して、GraalVM Native Imageで生成された事前にコンパイルされた実行可能ファイルをデバッグしています。起動構成の作成方法、ブレークポイントの設定方法、アプリケーションのデバッグのステップ方法、およびアクセス不能として検出されて実行可能ファイルに含まれていないコードの認識方法を学習しました。
GraalVM Native Imageでの開発方法について詳しくは:
- 短いGraalVM Native Image Hello Worldビデオをご覧ください。
- GraalVM Native Imageクイック・スタートオンライン・ラボで、事前のコンパイルの基本を説明します。
- ネイティブ・イメージ・アーキテクトであるChristian Wimmer氏によるプレゼンテーションをご覧ください。Oracle GraalVMによるJava Ahead-of-Timeコンパイル
- GraalVM Native Imageのリファレンス・ドキュメンテーションをお読みください
その他の学習リソース
docs.oracle.com/learnの他のラボを調べるか、Oracle Learning YouTubeチャネルでさらに無料の学習コンテンツにアクセスします。さらに、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerにします。
製品ドキュメントは、Oracleヘルプ・センターを参照してください。
GraalVM Enterpriseは、Oracle Cloud Infrastructure(OCI)のコストなしで利用可能