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

Posted

技术标签:

【中文标题】远程调试如何工作?代码需要在本地机器上编译吗?【英文标题】:How does remote debugging work? Does code need to be compiled on the local box? 【发布时间】:2012-05-24 05:54:53 【问题描述】:

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

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

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

【问题讨论】:

是的,这是正确的。您的代码也需要在本地编译。 链接到:[java远程调试如何工作][1][1]:***.com/questions/3591497/… 【参考方案1】:

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

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

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

 agentlib:libname[=options] format.

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

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

【讨论】:

代码需要在客户端编译吗?是强制性的吗?

以上是关于远程调试如何工作?代码需要在本地机器上编译吗?的主要内容,如果未能解决你的问题,请参考以下文章

PyCharm 上的远程调试

使用 Android 模拟器进行远程调试

如何使用不同的目录设置远程调试

Intellij IDEA远程调试java控制台程序

如何使用 Idea 远程调试 Java 代码

使用Idea工具 在本地代码上远程调试 生产或测试环境的代码