Java远程调试,它在技术上如何工作?

man*_*ana 62 java debugging remote-debugging

我非常喜欢JVM的远程调试工具.但我想知道它是如何在内部工作的.

我的假设:它是通过JVM功能完成的,其中正在运行的进程正在下载/使用附加的远程调试器(如IDE)的源代码.它知道当前堆栈跟踪的行,然后可以跳转到相应的IDE断点.然后通过套接字或共享内存(远程调试器的设置)完成堆栈跟踪和应用程序状态内省的通信.

有没有人有趣的链接/资源?

Vin*_*lds 46

JVM的调试功能通过Java平台调试器架构(JPDA)提供.

JPDA本身由以下内容组成:

  • Java虚拟机工具接口(JVM TI) - 用于工具的本机编程接口.此接口允许状态检查,并有助于控制调试对象内的执行流程.
  • Java调试线协议(JDWP) - 用于定义调试器和调试对象进程之间的通信.
  • Java调试接口(JDI) - 此接口允许工具开发人员编写远程调试器应用程序.

JPDA架构结构中列出的图表是一个很好的起点.其他要查找的地方是JPDA页面中列出指南.

  • @manuel,如果你有时间和耐心,请查看JSwat的源代码(http://code.google.com/p/jswat/).它建立在Netbeans平台之上,就JPDA而言,它是一个前端应用程序.我必须承认,我自己没有考虑过来源. (2认同)

Pri*_*jee 12

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

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

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

agentlib:libname[=options]
Run Code Online (Sandbox Code Playgroud)

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

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

这就是Eclipse调试器的工作原理.

  • 实际上,我了解JVM代理基础知识。但是不清楚开发人员何时在eclipse的某行上设置断点,它是如何工作的?另外,还需要在本地盒中编译代码以调试远程远程应用程序吗? (2认同)

Dan*_*ien 10

Java的调试架构称为JPDA.您可能想阅读JPDA 文档.特别是,Walk-through部分给出了一个IDE与JDI接口的示例,以获取堆栈上的值.