ノート:

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)のコストなしで利用可能

ラボ・コンテンツ

この演習では、次のことを行います。

推定ラボ時間: 45分

注:ラップトップアイコンが表示された場合は常に、コマンドの入力やファイルの編集などのアクションを実行する必要があります。

# The box under the icon will tell you what to do.

ステップ1: VMインスタンスへの接続

演習を開始すると、必要なコンピュート・リソースがバックグラウンド(この場合はVMインスタンス)でプロビジョニングされます。プロビジョニングの完了には数分かかる場合があります。Luna Lab Webページの「リソース」タブを参照すると、リソースが完全にプロビジョニングされ、準備ができたときにわかります(下の手順2を参照)。

  1. デスクトップの「Luna Lab」アイコンをダブルクリックしてブラウザを開きます。

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

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

  4. 「アプリケーション」メニューをクリックし、ターミナル・エミュレータを開きます。

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

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

  7. 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ユーティリティを使用してネイティブ実行可能ファイルを生成します。

  1. 「VS Code」ウィンドウの上部にある「Terminal」→「New Terminal」メニューを使用して端末を開きます。

  2. 端末で、Mavenを実行してプロジェクトを構築します。

    mvn -Pnative -DskipTests package
    

    ネイティブ実行可能ファイルを生成するために必要な時間は、コア数およびマシンによって提供される使用可能なメモリーの量に大きく依存します。演習用機械には数分かかります。

  3. 生成されたjavagdb実行可能ファイルは、targetフォルダにあります。数MBのみであることに注意してください。

    ls -lh target
    

ステップ3: launch.jsonでのデバッグ構成の作成

デバッグ・シンボルを使用して実行可能ファイルが生成されたので、GraalVM Tools for Javaのデバッグ・サポートを試すことができます。

  1. 左側のActivity Barにある「実行およびデバッグ」アイコンをクリックして、デバッグSide Barパネルを開きます。

  2. 「create a Launch.json file」リンクをクリックし、「環境」ドロップダウン・リストからNative Imageを選択します。

  3. 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:実行ファイルのデバッグ

コードがコンパイルされ、起動構成が行われると、実行可能ファイルをデバッグする準備が整います。ブレークポイントを設定し、コードをステップスルーします。

  1. App.javaに戻り、行番号の左にあるマージンをクリックして行10にブレークポイントを設定します。

  2. デバッグ・サイド・バーの上部にある緑色の矢印をクリックして、アプリケーションをデバッグ・モードで実行します。

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

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

  4. デバッガ制御の Step Overボタンを使用して、17行目まで下げます。ローカル変数nの値が100であることに注意してください。

  5. 21行目までステップ・ダウンし、ローカル変数fが定義され、100のファクタリングに設定されます。

  6. ソース・コードを下にスクロールして、24行目から35行目を表示します。neverCalledMethod()をコールする式とメソッド定義全体がグレー表示されています。

    GraalVM Native Imageは、生成した実行可能ファイルから死または到達不可能なコードを検出および除去します。if(false)式もneverCalledMethodも実行可能ファイルのマシン・コードに存在しません。これを説明するために、デバッガは排除されたコードをつかみます。

  7. デバッガ制御の Continueボタンをクリックして、プログラムの実行を完了させるか、または Step Overボタンを使用して残りのプログラムを実行します。出力はDEBUG CONSOLEに表示されます。

まとめ

このラボでは、GraalVM Tools for Javaを使用して、GraalVM Native Imageで生成された事前にコンパイルされた実行可能ファイルをデバッグしています。起動構成の作成方法、ブレークポイントの設定方法、アプリケーションのデバッグのステップ方法、およびアクセス不能として検出されて実行可能ファイルに含まれていないコードの認識方法を学習しました。

GraalVM Native Imageでの開発方法について詳しくは:

その他の学習リソース

docs.oracle.com/learnの他のラボを調べるか、Oracle Learning YouTubeチャネルでさらに無料の学習コンテンツにアクセスします。さらに、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerにします。

製品ドキュメントは、Oracleヘルプ・センターを参照してください。