检测 Java 9+ 运行时模块



>我们的工具(http://plse.cs.washington.edu/daikon(通过将检测插入程序的Java字节码来计算程序不变量。用户代码在运行时通过普通ClassFileTransformer::transform方法进行检测。

还需要通过JDK方法跟踪价值流。因此,我们还需要检测 Java 运行时。我们不能使用transform,因为在我们第一次获得控制权之前加载了数百个运行时方法transform.

在Java 9之前,我们在离线步骤中处理了这个问题,该步骤读取rt.jar,检测其方法,并写出修改后的版本作为dcomp-rt.jar。 用户将dcomp-rt.jar放在引导类路径上,以确保加载我们修改后的 Java 运行时方法而不是标准方法。 用户程序调用如下所示:

java -cp .:.../daikon/daikon.jar 
-Xbootclasspath/p:.../daikon/java/dcomp_rt.jar:.:.../daikon/daikon.jar 
-javaagent:.../daikon/java/dcomp_premain.jar={various dcomp arguments} 
{user program} {user program arguments}

现在来看Java 9+。 我们的第一种方法是读入并检测 Java 运行时 jmod 文件中的类文件(通过新的jrt:/文件系统(,并像以前一样创建一个dcomp_rt.jar。 我们遇到的问题是我们无法让系统使用此 jar 的内容而不是jrt:/java.base(例如(。 我们尝试了各种--module-path-Xbootclasspath(现在只有/a可用,可能是问题的一部分(选项都无济于事。 仍然希望有办法做到这一点吗?

如果没有,我猜我们需要为每个有趣的运行时 jmod 制作修改版本,然后为每个 jmod 使用--patch-module参数。 这能确保加载我们修改后的代码而不是标准运行时吗?

有什么想法/建议吗?

看起来 --patch-module 可以解决问题。 我做了同样的dcomp_rt.jar,但只使用了java.base.jmod中的类。 然后使用:

--patch-module java.base={full path}/dcomp_rt.jar

使用 -verbose:class 运行 java 显示所有基类都是从我的 jar 加载的。

这是实现目标的最佳方式吗?

相关内容

  • 没有找到相关文章

最新更新