【问题标题】:How does Eclipse debug code in an application server?Eclipse 如何调试应用服务器中的代码?
【发布时间】:2010-09-25 12:42:18
【问题描述】:

当我在 Eclipse 中以调试模式运行服务器时,Eclipse 和我的应用程序服务器 (JBoss) 之间正在进行什么通信?这是如何工作的?

【问题讨论】:

    标签: java eclipse jakarta-ee jdb


    【解决方案1】:

    当您以调试模式启动服务器时,它会侦听指定的 TCP 端口。 Eclipse 连接到该端口,它们使用 Java Debug Wire Protocol (JDWP) 进行通信。在此处阅读详细信息: http://java.sun.com/j2se/1.5.0/docs/guide/jpda/

    【讨论】:

      【解决方案2】:

      我认为它被称为 JDWP(Java 调试有线协议)-阅读更多 here

      【讨论】:

        【解决方案3】:

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

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

        要将代理库传递给 JVM,您可以通过启动参数来执行此操作,使用

         agentlib:libname[=options] format.
        

        我们实际上是在将一个名为 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 调试器的工作原理。

        【讨论】:

          最近更新 更多