引入:
关于JPDA(Java Platform Debugger Architecture) 网上有很多讲解,例子。我也不重复发明轮子了,这组文章主要从实践的代码分析角度,仔细剖析这个平台的特点,以及这其中的一些问题澄清和误区。
实践:
如果我们从利用Java Remote Debug的功能来看待JPDA ,并且使用socket的通信方式的话,那么整个过程应该如下:
首先,你在要被调试的服务器上开启远程调试功能。以tomcat 为例:
你要么用命令catalina jpda start,它会启用JPDA_OPTS命令行选项:
JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
要么直接添加JAVA_OPTS为
SET JAVA_OPTS=-Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
其中%JPDA_TRANSPORT"被解析为dt_socket %JPDA_ADDRESS%是要连接到的远程VM的机器地址和端口
然后在eclipse中Debug As "Remote Java Application",然后把上述的参数填入即可。
分析:
事实上,我们这个过程利用了JPDA进行远程调试,JPDA架构分为3层。
JVMTI: JAVA虚拟工具接口.它是一套由虚拟机直接提供的 native 接口。通过这些接口,开发人员不仅调试在该虚拟机上运行的 Java 程序,还能查看它们运行的状态,设置回调函数,控制某些环境变量,从而优化程序性能。
JDWP:JAVA调试交互协议。它定义了调试器和被调试程序之间传递的信息的格式。它详细完整地定义了请求命令、回应数据和错误代码,保证了前端和后端的 JVMTI 和 JDI 的通信通畅。
JDI: JAVA调试接口。通过它,调试工具开发人员就能通过前端虚拟机上的调试器来远程操控后端虚拟机上被调试程序的运行,JDI 不仅能帮助开发人员格式化 JDWP 数据,而且还能为 JDWP 数据传输提供队列、缓存等优化服务。
它们之间的关系如下图所示:
后面我会专门用很多篇幅来详细介绍,这里只是简单概括。