我在远程服务器上部署了一个Java Web应用程序。我想从Eclipse的本地机器进行远程调试。它们的版本相同。代码是否需要由本地mchine编译才能进行远程调试,或者是不是必需的?我的理解是代码应该由我的本地工具编译。
以下是我认为远程调试的工作原理。如果我错了,请纠正我。
当我将调试器放在Eclipse的第250行的某个源文件中时,它将在类文件中查找相应的字节代码并注意该点(比如它是类文件中的第200行,因为它删除了所有注释和死代码)。它还会在远程服务器上的类文件中的第200行放置一种断点。当执行到第200行时,调试器将停止,但在Eclipse中,为了方便开发人员,它将停在源代码的第250行。 (必须进行内部计算以确定源代码中与字节代码对应的确切行。)
答案 0 :(得分:2)
Eclipse调试从所谓的代理开始。
运行已编译的.class
源的JVM具有允许将外部库(用Java或C ++编写)注入JVM的功能,几乎就是运行时。这些外部库称为代理,它们可以修改已运行的.class
个文件的内容。这些代理可以访问JVM的功能,这些功能无法在JVM内部运行的常规Java代码中访问,它们可用于执行有趣的操作,如注入和修改正在运行的源代码,分析等。(像这样的工具JRebel 利用这一功能来实现他们的魔力。)
要将Agent Lib传递给JVM,可以通过启动参数,使用
来实现 agentlib:libname[=options] format.
我们实际上是将名为 jdwp 的Agent Lib传递给运行Tomcat的JVM。 jdwp 是 JVM特定的JDWP(Java调试线协议)的可选实现,用于定义调试器和正在运行的JVM之间的通信。它的实现(如果存在)作为JVM的本机库提供为jdwp.so
或jdwp.dll
那又做什么?
简单来说,我们传递的jdwp
代理基本上是服务于运行应用程序的JVM实例和调试器(可以位于远程或本地)之间的链接的功能。由于它是一个代理库,它确实能够拦截正在运行的代码,在JVM和调试器之间创建一个桥接器,并在JVM上应用调试器的功能。
由于在 JVM 体系结构中,在JVM本身中找不到调试功能,而是将其抽象为外部工具(通常称为调试器),这些工具可以驻留在运行的本地计算机上正在调试的JVM或从外部机器运行的JVM。 正是这种解耦模块化架构允许我们在远程计算机上运行JVM并使用JDWP,让远程调试器能够与之通信。