理想图可视化工具

理想图可视化工具(IGV)是一款开发者工具,用于分析编译图并调查性能问题。IGV 旨在查看和检查中间表示图——一种语言无关的中间表示(IR),它位于源语言和机器代码之间,由编译器生成。对于任何在 GraalVM 之上构建语言的语言实现者来说,它都是必不可少的。

IGV 工具旨在允许 GraalVM 语言实现者优化其使用 Truffle 框架 组装的语言。作为开发工具,它不应安装到生产环境中。

先决条件 #

  • 已安装 GraalVM
  • 用于 GraalVM 项目开发的 mx 工具(见下文)。

入门 #

IGV 免费使用,必须使用用户机器上的 mx 工具 构建——这是一个命令行工具,用于构建、测试、运行、更新代码和构建 GraalVM 的工件。

  1. mx 存储库克隆到您的工作目录
     git clone https://github.com/graalvm/mx.git
    
  2. 克隆 Graal 存储库
     git clone https://github.com/oracle/graal.git
    
  3. mx 添加到 PATH 环境变量中
     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 数据搜索节点,所有匹配的结果将显示出来。此工具的另一个很棒的功能是能够导航到原始访客语言源代码。在图中选择一个节点,然后单击“堆栈视图”窗口中的“转到源代码”按钮。

IGV add source

也可以从上下文菜单中导航图,方法是聚焦特定图节点并右键单击。提取节点选项重新渲染一个图,仅显示所选节点及其邻居。

IGV context menu

如果图比屏幕更大,请使用主工具栏中的“卫星视图”按钮操作以移动视口矩形。

IGV satellite view button

为了用户的喜好,可以通过编辑着色过滤器来调整图的配色方案,默认情况下,着色过滤器位于左侧边栏中。

查看源代码 #

源代码视图可以在手动模式和辅助模式下打开。在图视图中选择一个节点后,将打开“处理”视图。如果 IGV 知道当前帧的源代码在哪里,则绿色的“转到源代码”箭头将启用。如果 IGV 不知道源代码在哪里,则该行将变灰,并且会显示一个“放大镜”按钮。

View Source Code

按它并选择“在 Java 项目中定位”以在对话框中定位正确的项目。IGV 会隐藏不包含所需源文件的项目。源代码集合用于显示通过“添加源代码根目录”通用操作添加的独立根目录。如果使用首选方法定位源代码(例如,从 Java 项目中定位),则以后可以在“项目”选项卡上管理其项目。该选项卡最初是隐藏的,但您可以使用“窗口”,然后“项目”显示打开项目的列表。

从嵌入式 Java 中转储图 #

要将 GraalVM 编译器图从嵌入式 Java 应用程序转储到 IGV,您需要向基于 GraalVM 的进程添加选项。根据所使用的语言/VM,您可能需要在选项前添加 --vm。有关详细信息,请参阅特定语言的文档。要添加的主要选项是 -Djdk.graal.Dump=:1。这将以 IGV 可读格式将图转储到本地文件系统中。要将转储直接发送到 IGV,请在启动 GraalVM 实例时添加 -Djdk.graal.PrintGraph=Network。可以选择指定端口。然后,转储将从运行在 localhost 上的 GraalVM 发送到 IGV。如果 IGV 未侦听 localhost,请检查“选项”,然后选中“理想图设置 | 接受来自网络的数据”。如果在 127.0.0.1 上没有侦听的 IGV 实例,或者无法连接到该实例,则转储将被重定向到本地文件系统。文件系统位置是进程当前工作目录下的 graal_dumps/,可以使用 -Djdk.graal.DumpPath 选项更改该位置。

如果使用的是较旧版本的 GraalVM,您可能需要明确要求转储包含 nodeSourcePosition 属性。这可以通过添加 -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints 选项来完成。

相关文档 #

与我们联系