gpt4 book ai didi

java - 检测 JVM 引导阶段的结束

转载 作者:搜寻专家 更新时间:2023-10-31 20:29:56 26 4
gpt4 key购买 nike

有没有办法检测 JVM 引导阶段的结束?

编辑::

所以为了提供更多上下文,我正在尝试做的是检测 JDK。这是一个完整的工具,记录了每一个 LOAD、STORE、INVOKE 字节码指令。当指令被执行时,它们的数据被发送到一个静态方法,该方法从 xbootclasspath 加载。此静态方法捕获所有这些信息并将所有这些信息存储为跟踪以供稍后执行分析。

现在,当我为 JDK 执行此操作时,我不想干扰类在 JVM 中的加载方式,这可能会导致程序崩溃。我猜最好的方法是检测 JVM 完成引导的时间点,这样我就可以安全地打开我的仪器。 (我打算在引导过程中不检测任何代码。)这是否是正确的方法?

最佳答案

除了我之前关于调查 FERRARI 的评论之外和 MAJOR我想说几点:

  • 这两种工具都只能作为已编译的 Java JAR 存档下载。
  • 所以我写信给今天创造了这些工具的科学家,并向他们提出了我们的问题。一旦收到答复,我会立即在此处报告。
  • 无论如何,我研究了 FERRARI 的架构,我想我可能已经了解了他们是如何做到的。

因此,这是我对您可以做什么的有根据的猜测(仍未经测试):

  • 检测您的 JDK 类。
  • 添加一个简单的类BootstrapLock,如下所述。
  • 将检测后的新类重新打包到修改后的 rt.jar 中。
  • 写一个小虚拟 Java agent如下所述。
public class BootstrapLock {
private static volatile boolean inBootstrap = true;

public static boolean inBootstrap() {
return inBootstrap;
}

public static synchronized void setEndOfBS() {
inBootstrap = false;
}
}

public class DummyAgent {
public static void premain(String options, Instrumentation ins) {
BootstrapLock.setEndOfBS();
}
}

所以基本上逻辑如下:

  • 代理在主应用程序类之前加载,但在引导之后。
  • 因此,代理处于 Activity 状态这一事实意味着引导已完成。
  • 因此代理可以关闭全局标记inBootstrap
  • 您的检测类可以检查标记以确定是否应绕过它们的额外检测代码。

我不确定我是否有足够的时间来测试这个,但至少我想在这里发布这个答案,这样也许你,Vijai,也可以研究它并提供一些反馈。四只眼睛看多了两个……


更新:其中一位法拉利的作者已经回答了我的询问并证实了我上面的解释。您可以只使用 java 代理作为 JVM 完成引导的标记。也许您甚至不需要额外的类,但只需检查代理是否已加载到 JVM 中。它会让事情变得更简单,我只是不知道它是否表现良好。只需测试一下即可。

关于java - 检测 JVM 引导阶段的结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11220918/

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