加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:34:20 所属栏目:Java 来源:网络整理
导读:我在远程服务器上部署了一个 Java Web应用程序.我想从 Eclipse的本地机器进行远程调试.它们的版本相同.代码是否需要由本地mchine编译才能进行远程调试,或者是不是必需的?我的理解是代码应该由我的本地工具编译. 以下是我认为远程调试的工作原理.如果我错了,
我在远程服务器上部署了一个 Java Web应用程序.我想从 Eclipse的本地机器进行远程调试.它们的版本相同.代码是否需要由本地mchine编译才能进行远程调试,或者是不是必需的?我的理解是代码应该由我的本地工具编译.

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

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

解决方法

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

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

要将Agent Lib传递给JVM,可以通过启动参数,使用

agentlib:libname[=options] format.

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

那它是做什么的?简单来说,我们传递的jdwp代理基本上是服务于运行应用程序的JVM实例和调试器(可以位于远程或本地)之间的链接的功能.由于它是一个代理库,它确实能够拦截正在运行的代码,在JVM和调试器之间创建桥梁,并且具有在JVM上应用调试器的功能.由于在JVM体系结构中,在JVM本身中找不到调试功能,而是将其抽象为外部工具(适当地称为调试器),这些工具可以驻留在运行正在调试的JVM的本地计算机上,也可以运行来自外部机器.正是这种去耦合的模块化架构允许我们在远程机器上运行JVM并使用JDWP,让远程调试器能够与之通信.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读