>我们的工具(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 加载的。
这是实现目标的最佳方式吗?