【问题标题】:Java remote debugging, how does it work technically?Java远程调试,它在技术上是如何工作的?
【发布时间】:2011-04-05 05:24:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: java debugging remote-debugging


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      JVM 的调试功能通过Java Platform Debugger Architecture (JPDA) 提供。

      JPDA 本身由以下部分组成:

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

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

      【讨论】:

      • 谢谢,值得一读。出于兴趣,我将尝试使用 jdi.jar 库来直接查看实际调试。
      • @manuel,如果你有时间和耐心,可以看看 JSwat 的源代码(code.google.com/p/jswat)。它建立在 Netbeans 平台之上,就 JPDA 而言充当前端应用程序。我必须承认我自己没有调查过来源。
      【解决方案3】:

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

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

      要将代理库传递给 JVM,您可以通过启动参数使用 -

      agentlib:libname[=options]
      

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

      那么它有什么作用呢?简单来说,我们传递的 jdwp 代理基本上提供了连接运行应用程序的 JVM 实例和调试器(可以位于远程或本地)之间的功能。由于它是一个代理库,它确实具有拦截运行代码的能力,在 JVM 和调试器之间建立桥梁,并具有应用在 JVM 上的调试器的功能。由于在 JVM 架构中,调试功能不在 JVM 本身中找到,而是被抽象到外部工具(被恰当地称为调试器)中,这些工具可以驻留在运行正在调试的 JVM 的本地机器上,也可以运行来自外部机器。正是这种解耦、模块化的架构让我们能够让 JVM 在远程机器上运行并使用 JDWP,让远程调试器能够与之通信。

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

      【讨论】:

      • 其实我了解JVM代理基础。但不清楚开发人员何时在 eclipse 中的某行上设置断点,它是如何工作的?还需要在本地编译代码来调试远程远程应用程序?
      • 显然调试信息嵌入到 .class 文件中。当断点被命中时,调试器后端从 JVM 获取它并将其转发到前端(调试器应用程序)。
      猜你喜欢
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 2011-03-05
      • 2015-03-09
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多