注:
- Oracle 提供的免费实验室环境中提供了本教程。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间示例值。完成实验室后,请使用特定于您的云环境的这些值替换这些值。
调试 GraalVM Native Image 生成的可执行文件
简介
此实验室向您介绍 Visual Studio Code(VS 代码)为使用 GraalVM Enterprise Native Image 提前编译的 Java 应用程序提供的调试支持。
随着时间的推移,使用 GraalVM Native Image 的需求不断增长,随着这种增长,工具的需求也日益增加。适用于 VS 代码的 GraalVM Tools for Java 扩展包括对 GraalVM Native Image 生成的可执行文件的调试支持,该扩展提供:
- 断点
- 监视点
- 交互式分步执行
- 可执行文件的可变检验
此实验室在一个小例子的上下文中引入了这些功能(以及其他功能)。
在 Oracle Cloud Infrastructure (OCI) 上免费提供 GraalVM 企业版
实验室内容
在此实验室中,您将:
- 初始化实验室环境
- 连接到 Oracle Cloud 中的远程 VM 主机,您将在其中执行练习
- 使用 GraalVM Native Image 构建 Java 应用并将其编译到原生可执行文件中
- 为 VS 代码中的应用程序配置本机调试
- 设置断点并逐步完成编译为本机计算机代码的 Java 源代码
估计的实验室时间:45 分钟
注意:每当您看到手提电脑图标时,您都需要执行诸如输入命令或编辑文件之类的操作。

# The box under the icon will tell you what to do.
STEP 1:连接到 VM 实例
启动练习时,将在后台预配所需的计算资源(在本例中为 VM 实例)。完成预配可能需要几分钟时间。您可以通过参阅 Luna Lab Web 页上的 Resources(资源)选项卡来判断资源何时已完全预配并准备就绪(请参见下面的步骤 2)。
-
双击桌面上的 Luna Lab 图标以打开浏览器。

-
动画齿轮(资源除外)变为复选标记时,将预配所有必需的计算和网络资源,您可以继续操作。

-
向下滚动到设置,然后从打开 VSCode 和连接文本框复制文本。您需要单击
View Details。此脚本将设置实验室所需的环境并启动 VS 代码。将鼠标悬停在方框上方时,可以使用最右侧显示的 Copy to clipboard 按钮。
-
单击应用程序菜单并打开终端仿真器。

-
将光标置于终端窗口中并粘贴所复制的实验初始化脚本 (Shift+Ctrl+V)。一个对话框将警告您正在粘贴多行,这些行看起来可疑,但单击粘贴以继续。

-
将打开“VS Code(VS 代码)”窗口,并自动连接到为您预配的远程 VM 实例。单击继续接受计算机指纹。

-
VS Code 左下角的绿色框将显示
SSH: <REMOTE VM IP ADDRESS>,指示您通过 SSH 进行连接。
STEP 2:构建示例应用程序
使用 VS 代码 GraalVM Tools for Java,可以构建、测试和调试在 JVM 上运行的 Java 应用程序。但是,我们在本练习中的重点是调试由 GraalVM Native Image 生成的原生可执行文件,因此我们不会使用工具提供的所有功能。
打开 src/main/java/javagdb/App.java 并查看源。应用程序计算作为输入参数传递的值的阶乘。
您可以使用源代码中覆盖的链接在 Java Virtual Machine (JVM) 上运行或调试应用程序(如图所示)。但是,在调试本机可执行文件之前,还需要进行一些其他设置。

请注意,对 neverCalledMethod() 的调用带有黄色波浪线,以指示此代码无法访问。此停用代码有意包含在应用程序中。稍后,我们将了解在调试时,GraalVM Native Image 如何在本地可执行文件中处理停用代码。

编译应用程序并生成本机可执行文件。为此,请运行应用程序的 Maven 构建:它首先使用 javac 编译应用程序的 Java 源,然后使用 GraalVM Native Build Tools Maven 插件生成使用 native-image 实用程序的本机可执行文件。
-
使用 VS Code 窗口顶部的 Terminal>New Terminal(终端)菜单打开终端。
-
在终端中,运行 Maven 以构建项目。

mvn -Pnative -DskipTests package生成本机可执行文件所需的时间高度取决于计算机提供的核心数和可用内存量。实验室机器需要几分钟时间
-
您将在
target文件夹中找到名为javagdb的生成的可执行文件。请注意,只有几 MB!
ls -lh target
STEP 3:在 launch.json 中创建调试配置
现在,您已经使用调试符号生成了可执行文件,您可以试用 GraalVM Tools for Java 调试支持。
-
单击左侧
Activity Bar中的 Run and Debug(运行和调试)图标可打开调试Side Bar面板。 -
单击 create a start.json file 链接并从环境下拉列表中选择
Native Image。
-
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" } ] }
STEP 4:调试可执行文件
在编译代码和启动配置后,即可调试可执行文件。设置断点并逐步完成代码。
-
返回到
App.java并在第 10 行设置断点,方法是单击行号左侧的边界。
-
单击调试侧栏顶部的绿色箭头可在调试模式下运行应用程序。

请注意,VS 代码窗口底部的状态栏将颜色更改为橙色,表示正在进行调试。

-
应用程序快速启动,调试控制显示在应用程序源的上方,执行在您在第 10 行设置的断点处停止。

-
使用调试器控件中的
Step Over按钮向下步至第 17 行。请注意,本地变量n的值是100。
-
继续前进到第 21 行,现在定义了本地变量
f,并将其设置为 100 阶乘。
-
在源代码中向下滚动,以便看到第 24 行至第 35 行。请注意,调用
neverCalledMethod()的表达式和整个方法定义都呈灰色显示。GraalVM Native Image 可以检测并消除它生成的可执行文件中的死代码或无法访问代码。可执行文件的计算机代码中既不存在
if(false)表达式,也不存在neverCalledMethod。为了说明这一点,调试器将灰显出已消除的代码。
-
单击调试器控件
Continue按钮可让程序运行完成,或者使用Step Over按钮逐步完成程序的其余部分。输出显示在DEBUG CONSOLE中。
结论
在此实验室中,您使用 GraalVM Tools for Java 调试由 GraalVM Native Image 生成的时间提前编译的可执行文件。您已学习了如何创建启动配置、如何设置断点和步骤调试应用程序,以及如何识别被检测为无法访问且因此未包含在可执行文件中的代码。
要了解有关使用 GraalVM Native Image 进行开发的更多信息,请执行以下操作:
- 观看简短的 GraalVM Native Image Hello World 视频。
- 在 GraalVM Native Image Quick Start 联机实验室中,了解提前编译的基本知识。
- 观看视频原生映像架构师 Christian Wimmer 的演示:使用 Oracle GraalVM 预先编译 Java
- 阅读 GraalVM Native Image 参考文档
更多学习资源
在 docs.oracle.com/learn 上浏览其他实验室,或者在 Oracle Learning YouTube 渠道上访问更多免费学习内容。此外,访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
在 Oracle Cloud Infrastructure (OCI) 上免费提供 GraalVM 企业版