代码之家  ›  专栏  ›  技术社区  ›  manuel aldana

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

  •  53
  • manuel aldana  · 技术社区  · 14 年前

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

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

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

    3 回复  |  直到 9 年前
        1
  •  41
  •   Jagger    11 年前

    JVM的调试特性通过 Java Platform Debugger Architecture (JPDA) .

    JPDA本身由以下部分组成:

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

    中列出的图表 JPDA architecture structure 是一个很好的起点。需要寻找的其他地方是 guides listed in the JPDA page .

        2
  •  9
  •   Daniel Trebbien    14 年前

    Java的调试架构称为JPDA。你可能想读JPDA documentation . 尤其是, Walk-through section 给出了一个与JDI接口以在堆栈上获取值的IDE示例。

        3
  •  9
  •   Pritam Banerjee Ashish Karnavat    9 年前

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

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

    要将代理lib传递给JVM,可以通过启动参数来实现,使用-

    agentlib:libname[=options]
    

    实际上,我们正在将名为jdwp的代理lib传递给运行Tomcat的JVM。JDWP是JDM特定的、可选的JDWP(Java调试线协议)实现,用于定义调试器和正在运行的JVM之间的通信。它的实现(如果存在)作为jvm的本机库作为jdwp.so或jdwp.dll提供。

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

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