如果 JVMTI 不是,Java 的 JDI 跨平台如何?

Nff*_*ff3 2 java jvm jvm-hotspot jdi jvmti

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

apa*_*gin 5

看看Java 平台调试器架构

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

jdwp agent 是原生库,当然是针对每个平台单独编译的。该库包含在标准 JDK 包中。因此,特定于平台的部分已经由 JDK 提供。

  • @Nfff3由于JVMTI是本机接口,因此它可以被本机软件使用。当您按照此答案中给出的链接访问 https://docs.oracle.com/en/java/javase/11/docs/specs/jvmti.html 时,您将获得此接口的描述。这并不意味着您可以使用它“*无需在调试模式下启动应用程序*”。您只需将“*在调试模式*”(即“*与 jdwp 代理*”)与“*与我的 JVMTI 代理*”交换即可。 (2认同)
  • @Nfff3 JDWP 代理 *是* JVM TI 代理,它仅支持加载时附加到 JVM。为了使用代理,必须在 JVM 命令行参数中指定它。这实际上与“在调试模式下启动应用程序”相同。 (2认同)