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


69

我真的很喜欢JVM的远程调试功能。但是我不知道它在内部如何工作。

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

有没有人对此感兴趣的链接/资源?

Answers:


50

JVM的调试功能是通过Java平台调试器体系结构(JPDA)提供的

JPDA本身由以下部分组成:

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

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


谢谢,值得一读。出于兴趣,我将尝试使用jdi.jar库直接查看正在运行的调试。
曼努埃尔·奥尔丹娜2010年

2
@manuel,如果您有时间和耐心,请查看JSwat的源代码(code.google.com/p/jswat)。它基于Netbeans平台构建,就JPDA而言,它充当前端应用程序。我必须承认,我本人并未调查消息来源。
Vineet Reynolds 2010年

15

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

运行已编译的“ .class”源的JVM具有一项功能,该功能允许在运行时将外部库(用Java或C ++编写)注入到JVM中。这些外部库称为代理,它们可以修改已运行的.class文件的内容。这些代理可以访问JVM的功能,而JVM的功能无法在JVM内运行的常规Java代码中访问,它们可以用来做有趣的事情,例如注入和修改正在运行的源代码,分析等。某些工具,例如JRebel(used (用于热替换代码)利用此功能来实现其魔力。

要将Agent Lib传递给JVM,您可以使用-

agentlib:libname[=options]

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

那怎么办呢?简单来说,我们传递的jdwp代理基本上是充当运行应用程序的JVM实例与调试器(可以位于远程或本地)之间的链接的功能。由于它是一个代理库,因此它确实具有拦截正在运行的代码,在JVM和调试器之间建立桥梁以及将调试器的功能应用于JVM的能力。由于在JVM体系结构中,调试功能不在JVM本身内,而是被抽象为外部工具(适当地称为调试器),因此这些工具可以驻留在运行要调试的JVM的本地计算机上,也可以运行从外部机器。正是这种解耦的模块化架构使我们能够使JVM在远程计算机上运行并使用JDWP,

简而言之,这就是Eclipse调试器的工作方式。


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

显然,调试信息已嵌入到.class文件中。当遇到断点时,调试器后端从JVM获取它,并将其转发到前端(调试器应用程序)。
2000年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.