理想图可视化工具

理想图可视化工具 (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。也可以选择指定一个端口。然后,转储会从本地主机上运行的 GraalVM 发送到 IGV。如果 IGV 未在本地主机上监听,请在“选项”下检查,然后勾选“理想图设置|接受来自网络的数据”。如果没有 IGV 实例在 127.0.0.1 上监听,或者无法连接,则转储将被重定向到本地文件系统。文件系统位置在进程当前工作目录下的 graal_dumps/ 中,可以通过 -Djdk.graal.DumpPath 选项进行更改。

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

相关文档 #

联系我们