远程调试如何工作?代码需要在本地框上编译吗?

M S*_*ach 6 java debugging jvm remote-debugging

我在远程服务器上部署了一个 Java Web 应用程序。我想从 Eclipse 的本地机器上进行远程调试。它们是相同的版本。代码是否需要由我的本地机器编译才能进行远程调试,还是不需要?我的理解是代码应该由我的本地工具编译。

接下来是我认为远程调试的工作方式。如果我错了,请纠正我。

当我将调试器放在 Eclipse 中第 250 行的某个源文件上时,它会在类文件中查找相应的字节码并注意这一点(假设它是类文件中的第 200 行,因为它删除了所有注释和死代码) . 它还将在远程服务器上的类文件中的第 200 行放置一种断点。当执行到第 200 行时,调试器将停止,但在 Eclipse 中,为了开发人员的方便,它会在源代码的第 250 行停止。(它必须进行内部计算以确定与字节码对应的源代码中的确切行。)

Pri*_*jee 2

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

\n\n

运行编译源代码的 JVM.class有一个功能,允许将外部库(用 Java 或 C++ 编写)注入到 JVM 中(仅在运行时)。这些外部库称为代理,它们能够修改.class已运行的文件的内容。这些代理可以访问 JVM 的功能,而这些功能是无法从 JVM 内运行的常规 Java 代码访问的,并且它们可用于执行有趣的操作,例如注入和修改正在运行的源代码、分析等。(像JRebel这样的工具可以使用这个功能来实现他们的魔力。)

\n\n

要将代理库传递给 JVM,您可以使用启动参数来完成此操作

\n\n
 agentlib:libname[=options] format.\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们实际上将一个名为jdwp的代理库传递给运行 Tomcat 的 JVM。jdwp是JDWP(Java 调试线协议)的 JVM 特定的可选实现,用于定义调试器和正在运行的 JVM 之间的通信。It\xe2\x80\x99s 实现(如果存在)作为 JVM 的本机库提供,或者jdwp.sojdwp.dll

\n\n

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

\n