Java远程debugging,它在技术上如何工作?

我非常喜欢JVM的远程debugging工具。 但我想知道它是如何工作的。

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

有没有人有兴趣的链接/资源呢?

JVM的debuggingfunction通过Java平台debugging器体系结构(JPDA)提供 。

JPDA本身由以下部分组成:

  • Java虚拟机工具接口(JVM TI) – 用于使用工具的本地编程接口。 该接口允许进行状态检查,并有助于控制debugging对象内的执行stream程。
  • Javadebugging线协议(JDWP) – 用于定义debugging器和debugging对象进程之间的通信。
  • Javadebugging接口(JDI) – 该接口允许工具开发人员编写远程debugging器应用程序。

JPDA体系结构中列出的图是一个很好的起点。 在JPDA页面列出的指南中还有其他需要查找的地方。

Java的debugging体系结构被称为JPDA。 您可能想要阅读JPDA 文档 。 具体来说,“ 演练”部分给出了一个与JDI接口的IDE的示例,以获取堆栈中的值。

Eclipsedebugging始于所谓的代理。

运行编译“.class”源代码的JVM具有一个function,允许在运行时将外部库(用Java或C ++编写)注入到JVM中。 这些外部库被称为代理,他们有能力修改运行的.class文件的内容。 这些代理可以访问在JVM中运行的常规Java代码中无法访问的JVM的function,并且可以使用它们来执行诸如注入和修改正在运行的源代码,分析等有趣的事情。一些工具,如JRebel用于代码的热replace)利用这一块function来实现它们的魔力。

并且要将代理库传递给JVM,可以通过启动参数来实现,使用 –

agentlib:libname[=options] 

实际上,我们将一个名为jdwp的代理程序库传递给运行Tomcat的JVM。 jdwp是用于定义debugging器和正在运行的JVM之间的通信的JDWP(Javadebugging线协议)的特定于JVM的可选实现。 它的实现,如果存在的话作为JVM的本地库提供,作为jdwp.so或jdwp.dll

那么它是做什么的? 简而言之,我们传递的jdwp代理基本上是提供运行应用程序的JVM实例和debugging器(可以位于远程或本地)之间的链接的function。 由于它是一个代理程序库,它能够拦截正在运行的代码,在JVM和debugging程序之间build立桥梁,并且在JVM上应用debugging程序的function。 由于在JVM体系结构中,debuggingfunction不在JVM本身内部,而是被抽象到外部工具(简称为debugging器)中,所以这些工具可以驻留在运行JVM的本地机器上进行debugging或运行从外部机器。 正是这种分离的模块化体系结构,使我们能够在远程机器上运行JVM,并使用JDWP,让远程debugging器能够与之通信。

Eclipsedebugging器就是这样工作的。