理想グラフビジュアライザー

理想グラフビジュアライザー (IGV) は、コンパイルグラフを分析し、パフォーマンスの問題を調査するための開発ツールです。 IGVは、コンパイラによって生成される、ソース言語とマシンコードの間の言語に依存しない中間表現 (IR) である中間表現グラフを表示および検査するために開発されました。 GraalVM上に構築する言語実装者にとって不可欠です。

IGVツールは、GraalVM言語実装者がTruffleフレームワークでアセンブルされた言語を最適化できるように開発されました。 開発ツールとして、本番環境にインストールしないでください。

前提条件 #

  • GraalVM がインストールされていること。
  • GraalVMプロジェクトの開発用のmxツール (下記参照)。

はじめに #

IGVは無料で使用でき、GraalVMのコード、ビルドされた成果物をビルド、テスト、実行、更新するためのコマンドラインツールであるmxツールを使用してユーザーのマシン上にビルドする必要があります。

  1. mxリポジトリを作業ディレクトリにクローンします
     git clone https://github.com/graalvm/mx.git
    
  2. Graalリポジトリをクローンします
     git clone https://github.com/oracle/graal.git
    
  3. PATH環境変数にmxを追加します
     export PATH="/path/to/mx:$PATH"
    

    インストールが成功したかどうかを確認するには、次のコマンドを実行します

     mx --version 
    
  4. mxでIGVを起動します
     mx -p graal/compiler igv
    

Rubyの例を使用したグラフのダンプ #

いくつかのJavaを埋め込んだホストRubyアプリケーションを使用して、コンパイラグラフをネットワーク経由でダンプします。

  1. 次のコードスニペットをTest.rbという名前のファイルに保存します

     require 'json'
     obj = {
       time: Time.now,
       msg: 'Hello World',
       payload: (1..10).to_a
     }
     encoded = JSON.dump(obj)
     js_obj = Polyglot.eval('js', 'JSON.parse').call(encoded)
     puts js_obj[:time]
     puts js_obj[:msg]
     puts js_obj[:payload].join(' ')
    
  2. Rubyマネージャー/インストーラーを使用して、TruffleRubyスタンドアロンからRubyをインストールします。 TruffleRubyディストリビューションを実行していることを確認するために、バージョンを確認してください
     ruby --version
    
  3. 実行中のIGVにプロセスを接続して、アプリケーションを実行します
     ruby --vm.Djdk.graal.Dump=:1 --vm.Djdk.graal.PrintGraph=Network Test.rb
    

これは、IGV形式のコンパイラグラフをネットワーク経由で、_127.0.0.1:4445_でリッスンしているIGVプロセスにダンプします。 接続が確立されると、アウトラインビューでグラフを見ることができます。 たとえば、`java.lang.String.char(int)`フォルダーを見つけて、ダブルクリックして解析後のグラフを開きます。 ノードに`sourceNodePosition`プロパティがある場合、処理ウィンドウはその場所とスタックトレース全体を表示しようとします。

グラフの参照 #

特定のグラフを開いたら、名前、ID、または`property=value`データでノードを検索でき、一致するすべての結果が表示されます。 このツールのもう1つの優れた機能は、元のゲスト言語のソースコードに移動できることです。 グラフでノードを選択し、スタックビューウィンドウの**ソースに移動**ボタンをクリックします。

IGV add source

グラフナビゲーションは、コンテキストメニューからも利用できます。 特定のグラフノードにフォーカスを合わせて右クリックすると有効になります。 ノードの抽出オプションは、グラフを再レンダリングし、選択したノードとそのネイバーのみを表示します。

IGV context menu

グラフが画面よりも大きい場合は、メインツールバーの衛星ビューボタンで操作して、ビューポートの長方形を移動します。

IGV satellite view button

ユーザーの好みに合わせて、グラフの配色スキームは、左側のサイドバーでデフォルトで有効になっているカラーリングフィルターを編集することで調整できます。

ソースコードの表示 #

ソースコードビューは、手動モードとアシストモードで開くことができます。 グラフビューでノードを選択すると、処理ビューが開きます。 IGVが現在のフレームのソースコードの場所を知っている場合、緑色のソースに移動矢印が有効になります。 IGVがソースの場所を知らない場合、行はグレー表示され、虫眼鏡ボタンが表示されます。

View Source Code

それを押して、Javaプロジェクトで検索を選択し、ダイアログで正しいプロジェクトを見つけます。 IGVは、必要なソースファイルを含まないプロジェクトを非表示にします。 ソースコレクションは、**ソースのルートを追加**一般的なアクションによって追加されたスタンドアロンルートを表示するために使用されます。 ソースが推奨される方法 (たとえば、Javaプロジェクトから) を使用して配置されている場合、そのプロジェクトは後でプロジェクトタブで管理できます。 最初は非表示になっていますが、**ウィンドウ**、**プロジェクト**を使用して開いているプロジェクトのリストを表示できます。

埋め込みJavaからのグラフのダンプ #

埋め込みJavaアプリケーションからIGVにGraalVMコンパイラグラフをダンプするには、GraalVMベースのプロセスにオプションを追加する必要があります。 使用する言語/ VMによっては、オプションの前に`--vm`を付ける必要がある場合があります。 詳細については、特定の言語のドキュメントを参照してください。 追加する主なオプションは `-Djdk.graal.Dump=:1` です。 これにより、IGVで読み取り可能な形式のグラフがローカルファイルシステムにダンプされます。 ダンプをネットワーク経由でIGVに直接送信するには、GraalVMインスタンスを起動するときに `-Djdk.graal.PrintGraph=Network` を追加します。 オプションでポートを指定できます。 その後、ダンプは実行中のGraalVMからlocalhost上のIGVに送信されます。 IGVがlocalhostでリッスンしていない場合は、**オプション**、**理想グラフ設定|ネットワークからデータを受け入れる**で確認できます。 `127.0.0.1` でリッスンしているIGVインスタンスがない場合、または接続できない場合、ダンプはローカルファイルシステムにリダイレクトされます。 ファイルシステムの場所は、プロセスの現在の作業ディレクトリの下の `graal_dumps/` であり、 `-Djdk.graal.DumpPath` オプションで変更できます。

古いバージョンのGraalVMを使用している場合は、ダンプに`nodeSourcePosition`プロパティを含めるように明示的に要求する必要がある場合があります。 これは、 `-XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints` オプションを追加することで行われます。

関連ドキュメント #

お問い合わせ