gpt4 book ai didi

java - 检测 Java 9+ 运行时模块

转载 作者:行者123 更新时间:2023-11-30 10:00:28 25 4
gpt4 key购买 nike

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

还需要通过 JDK 方法跟踪值(value)流。因此,我们还需要检测 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 制作修改版本,然后为每个使用 --patch-module 参数。这会确保加载我们修改后的代码而不是标准运行时吗?

有什么想法/建议吗?

最佳答案

看起来 --patch-module 可以解决问题。我制作了相同的 dcomp_rt.jar,但仅包含来自 java.base.jmod 的类。然后使用:

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

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

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

关于java - 检测 Java 9+ 运行时模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57976989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com