VS Codeでのネイティブ・イメージのデバッグ

コマンドラインからGNUデバッガを使用して、またはGraalVM Tools for Java拡張機能によってVisual Studio Code (VS Code)内から、GraalVMネイティブ・イメージによって生成されたネイティブ実行可能ファイルをデバッグできます。

このガイドでは、VS Codeからネイティブ実行可能ファイルにコンパイルされたJavaアプリケーションをデバッグする方法を学習します。

GDBからJavaをデバッグする方法を学習するには、専用のネイティブ・イメージ・デバッグ情報機能リファレンス・マニュアルを参照してください。

概要

ネイティブ・イメージ・プロセスは、通常のJavaアプリケーションのデバッグと同じ方法でデバッグできます。ネイティブ実行可能ファイルが実行されている場合、デバッガはアプリケーション・プロセスにアタッチされ、Javaソース・ファイルが開かれ、デバッグできるようになります。ブレークポイントの設定、ウォッチの作成、アプリケーションの状態の検査など、通常のデバッグ・アクションを実行できます。デバッガ・アタッチメントは、個別の構成ネイティブ・イメージ: 起動launch.jsonファイルに追加することで有効になります。

ノート: VS Code内からネイティブ・イメージをデバッグするには、GraalVM Enterpriseをインストールする必要があります。

前提条件

  1. GDB 10.1を含むLinux OS
  2. VS Code
  3. VS CodeにインストールされたGraalVM Extension Pack for Java
  4. VS CodeでデフォルトのJavaランタイム環境として設定されたGraalVM Enterprise
  5. GraalVMのインストールに追加されたネイティブ・イメージ・プラグイン

デモの作成およびビルド

このデモは、GraalVMネイティブ・イメージのネイティブ・ビルド・ツールを使用するシンプルなJavaの階乗計算機で、Apache Maven™およびGradleを使用したネイティブ実行可能ファイルのビルドとテストをサポートします。

Maven pom.xmlファイルはネイティブ・プロファイルで拡張され、これを使用するとネイティブ実行可能ファイルのビルドが容易になります(詳細は、こちらにあるMavenプロファイルを参照)。デバッグ情報を追加するには、ネイティブ・プロファイル構成で<buildArg>タグを使用して、パラメータをnative-imageビルド・プロセスに渡します:

 <buildArg>-g</buildArg>
 <buildArg>-O0</buildArg>

-gフラグは、GNUデバッガ(GDB)が認識する形式でデバッグ情報を生成するようにnative-imageに指示します。その後、-O0では、コンパイラの最適化を実行しないことを指定します。すべての最適化の無効化は必須ではありませんが、一般的にはデバッグ・エクスペリエンスが向上します。

  1. demosリポジトリをGitHubからクローニングし、VS Codeでjavagdbnativeフォルダを開きます:

     git clone https://github.com/graalvm/graalvm-demos.git
    
  2. VS Codeで「Terminal」を開き、「New Terminal」をクリックして、次のコマンドを実行します:

     mvn -Pnative -DskipTests package
    

    このコマンドは、Javaアプリケーションを実行可能なJARファイルにコンパイルおよびパッケージ化してから、GraalVMネイティブ・イメージを使用してネイティブ実行可能ファイルを生成します。デバッグ・シンボルで実行可能ファイルを作成したら、次の手順としてネイティブ・イメージ・デバッガ構成Native Image: launchをVS Codeの launch.jsonファイルに追加します。

  3. 「Run Add Configuration…」を選択し、使用可能な構成のリストから「Native Image: Launch」を選択します。launch.jsonに次のコードを追加します:

     {
     “type”: “nativeimage”,
     “request”: “launch”,
     “name”: “Launch Native Image”,
     “nativeImagePath”: “${workspaceFolder}/build/native-image/application”
     }
    

    nativeImagePathプロパティの値は、pom.xmlで指定された実行可能ファイル名および場所と一致する必要があるため、構成の最後の行を"nativeImagePath": "${workspaceFolder}/target/javagdb"に変更します。

  4. 引数を追加して、階乗を計算する数値(“args”: “100”など)を指定します。構成は次のようになります:

     {
     “type”: “nativeimage”,
     “request”: “launch”,
     “name”: “Launch Native Image”,
     “nativeImagePath”: “${workspaceFolder}/target/javagdb”,
     “args”: “100”
     }
    

デモの実行およびデバッグ

アプリケーションをデバッグ・モードで実行するには、最初にソース・コードにブレークポイントを設定します。次に、上部のナビゲーション・パネルで「Run and Debug」アクティビティに移動し、「Launch Native Image」を選択し、緑色の矢印をクリックしてこの構成を実行します。VS Codeではネイティブの実行可能ファイルが実行され、アプリケーション・プロセスにアタッチし、Javaソース・ファイルを開いてデバッグできるようになります。コードのステップ実行、ローカル変数の確認、評価する式の指定などを行います。IDEからJavaアプリケーションをデバッグするときに実行できるすべての操作を実行します。

ネイティブ・イメージのデバッグのソース・コード

ソース・ファイルで一部のコードがグレー表示されていることに注意してください。たとえば、メソッドneverCalledMethod()は次のようになります:

未コールのメソッドがグレー表示されています

native-imageビルダーは、実行時にアプリケーションで使用されていないコードを削除します。これは、未コールのライブラリまたは一部の到達不可能なメソッドである可能性があります。VS Code拡張機能では、これらの削除が認識され、削除されたメソッド本体とメソッド・コールの両方がグレー表示されます。網掛けのコードはネイティブ実行可能ファイルの一部ではありません。

さらに学ぶ

ハンズオン・ラボ・エクスペリエンスを取得し、この専用ラボ(GraalVMネイティブ・イメージのデバッグ)を実行することで、Oracle CloudのOracle Linux環境を使用したネイティブ実行可能ファイルをデバッグします。