【问题标题】:How is Java's JDI cross platform if JVMTI is not?如果 JVMTI 不是,Java 的 JDI 跨平台如何?
【发布时间】:2021-07-23 16:19:24
【问题描述】:

所以Java的调试接口使用JVMTI作为后端......但是JVMTI需要在目标架构上编译,那么JDI使用的这些JVMTI函数是否预编译并作为库随JDK一起提供?这意味着我可以在不使用 JDI 的情况下使用那些预编译的库……对吗?我假设只有少数函数已经编译,但如果我需要这些函数,那么我不需要自己编译它们的麻烦......

【问题讨论】:

    标签: java jvm jvm-hotspot jvmti jdi


    【解决方案1】:

    Java Platform Debugger Architecture

                    /    |--------------|
                   /     |     VM       |
     debuggee ----(      |--------------|  <------- JVM TI - Java VM Tool Interface
                   \     |   back-end   |
                    \    |--------------|
                    /           |
     comm channel -(            |  <--------------- JDWP - Java Debug Wire Protocol
                    \           |
                         |--------------|
                         | front-end    |
                         |--------------|  <------- JDI - Java Debug Interface
                         |      UI      |
                         |--------------|
    
    • JDI 在 JDWP 之上运行;
    • 从JVM端来看,JDWP是由jdwp代理提供的,它使用JVM TI与JVM进行通信。

    jdwp 代理是一个本地库,当然是为每个平台单独编译的。 该库包含在标准 JDK 包中。因此,平台相关部分已经由 JDK 提供。

    【讨论】:

    • 有什么方法可以在不使用 JDI 的情况下调用这个原生库?因此,无需在调试模式下启动应用程序...
    • @Nfff3 由于JVMTI是一个native interface,它可以被native软件使用。当您按照此答案中给出的链接到达docs.oracle.com/en/java/javase/11/docs/specs/jvmti.html 时,您将获得此接口的描述。这并不意味着您可以“不以调试模式启动应用程序”使用它。您只需交换“in debug mode”,即“with jdwp agent”和“with my JVMTI agent”。
    • @Nfff3 JDWP 代理一个 JVM TI 代理,它仅支持加载时附加到 JVM。为了使用代理,必须在 JVM 命令行参数中指定它。这实际上与“以调试模式启动应用程序”相同。
    • 谢谢,我现在明白了。基本上,处于“调试”模式并没有什么特别之处。它只是意味着在应用程序启动时加载了一个 JVTMI 代理(称为 JDWP)。这个本地代理在与语言无关的套接字上与 JDI 通信。我对此很感兴趣,因为我有一个用例,我想在短时间内多次调用一些 JDI 方法并想减少执行时间。也许我可以修改 JDWP 代理以便能够通过 JNI 从 Java 调用函数并且不使用套接字。也许会更快。
    猜你喜欢
    • 2016-10-12
    • 2011-08-24
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    相关资源
    最近更新 更多