远程调试如何工作?代码是否需要在本地盒子上编译



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

以下是我认为远程调试的工作原理。如果我错了,请纠正我。

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

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

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

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

 agentlib:libname[=options] format.

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

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

最新更新