Java 远程调试,它在技术上是如何工作的?

我真的很喜欢 JVM 的远程调试工具,但是我想知道它在内部是如何工作的。

我的假设是: 这是通过一个 JVM 特性完成的,在这个特性中,运行的进程从附加的远程调试器(如 IDE)下载/使用源代码。它知道当前堆栈跟踪的行,然后可以跳转到相应的 IDE 断点。然后通过套接字或共享内存(远程调试器的设置)来进行堆栈跟踪和应用程序状态的内省通信。

有什么有趣的链接/资源吗?

20433 次浏览

Java 的调试架构称为 JPDA。您可能需要阅读 JPDA 文件。特别是,走过区给出了一个 IDE 与 JDI 接口以获取堆栈上的值的示例。

JVM 的调试特性是通过 JPDA (JPDA)提供的。

联合政策和发展司本身由以下部分组成:

  • Java 虚拟机工具接口(JVM TI)-工具使用的本机编程接口。此接口允许状态检查,并有助于控制调试对象中的执行流。
  • Java Debug Wire Protocol (JDWP)-用于定义调试器和调试对象进程之间的通信。
  • JavaDebug Interface (JDI)-该接口允许工具开发人员编写远程调试器应用程序。

JPDA 体系结构中列出的图表是一个很好的起点。其他的地方可以寻找的是 在 JPDA 页面中列出的指南

Eclipse 调试从所谓的“代理”开始。

JVM,它运行已编译的。”。Class”源代码有一个特性,允许在运行时将外部库(用 Java 或 C + + 编写)注入到 JVM 中。这些外部库称为 Agent,它们能够修改。运行类文件。这些代理可以访问 JVM 的功能,这些功能在 JVM 内部运行的常规 Java 代码中是无法访问的,它们可以用来做一些有趣的事情,比如注入和修改运行的源代码、分析等等。像 JRebel (用于代码的热替换)这样的一些工具利用这一功能来实现它们的魔力。

要将 Agent Lib 传递给 JVM,可以通过启动参数,使用-

agentlib:libname[=options]

我们实际上是将一个名为 jdwp 的 Agent Lib 传递给运行 Tomcat 的 JVM。JDWP 是 JDWP (Java Debug Wire Protocol,Java Debug Wire Protocol)的一个特定于 JVM 的可选实现,用于定义调试器和运行中的 JVM 之间的通信。它是一种实现,如果它作为 JVM 的本机库以 jdwp.so 或 jdwp.dll 的形式提供

那它是干什么的?简单地说,我们传递的 jdwp 代理基本上是作为运行应用程序的 JVM 实例和调试器(可以位于远程或本地)之间的链接。由于它是一个代理库,因此它确实能够拦截正在运行的代码,在 JVM 和调试器之间创建一个桥梁,并具有应用于 JVM 的调试器的功能。因为在 JVM 体系结构中,调试功能并不存在于 JVM 本身中,而是被抽象为外部工具(适当地称为调试器) ,这些工具可以驻留在运行被调试的 JVM 的本地机器上,也可以从外部机器上运行。正是这种解耦的模块化体系结构允许我们在远程机器上运行 JVM 并使用 JDWP,让远程调试器能够与之通信。

简而言之,这就是 Eclipse 调试器的工作方式。