- 浏览: 1840963 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (665)
- 闲话 (17)
- ruby (1)
- javascript (40)
- linux (7)
- android (22)
- 开发过程 (11)
- 哥也读读源代码 (13)
- JVM (1)
- ant (2)
- Hibernate (3)
- jboss (3)
- web service (17)
- https (4)
- java基础 (17)
- spring (7)
- servlet (3)
- 杂记 (39)
- struts2 (10)
- logback (4)
- 多线程 (2)
- 系统诊断 (9)
- UI (4)
- json (2)
- Java EE (7)
- eclipse相关 (4)
- JMS (1)
- maven (19)
- 版本管理 (7)
- sso (1)
- ci (1)
- 设计 (18)
- 戒烟 (4)
- http (9)
- 计划 (4)
- HTML5 (3)
- chrome extensions (5)
- tomcat源码阅读 (4)
- httpd (5)
- MongoDB (3)
- node (2)
最新评论
-
levin_china:
勾选了,还是找不到
用spring annotation声明的bean,当打包在jar中时,无法被扫描到 -
GGGGeek:
我用的maven-3.5.0,还没有遇到这种情况,使用jar ...
用spring annotation声明的bean,当打包在jar中时,无法被扫描到 -
GGGGeek:
受益匪浅,从组织项目结构,到技术细节,讲的很到位,只是博主不再 ...
一个多maven项目聚合的实例 -
Aaron-Joe-William:
<?xml version="1.0" ...
hibernate逆向工程 -
li272355201:
http://archive.apache.org/dist/ ...
tomcat源码阅读(一)——环境搭建
我们平时经常使用的debug功能,其实背后大有文章。本文只是一点总结,要深入了解的话,可以看看这个系列的文章:http://www.ibm.com/developerworks/cn/views/java/libraryview.jsp?search_by=%E6%B7%B1%E5%85%A5+Java+%E8%B0%83%E8%AF%95%E4%BD%93%E7%B3%BB
一、java平台调试的特点
java平台的调试,与其他平台有很大的区别。以C/C++的调试为例,目前比较流行的调试工具是GDB和微软的Visual Studio自带的debugger
首先,必须编译一个“debug”模式的程序,这个会比“release”模式的程序大很多
其次,在调试过程中,debugger将会深层介入程序的运行,获取运行时的信息,并将这些信息返回。这种介入对运行的效率和内存占用都有一定的需求。基于这些需求,这些Debugger本身创建和管理了一个运行态,因此体积都比较大
而Java则不同,由于Java的运行态交给虚拟机管理,因此作为Java的Debugger无需再自己创造一个可控的运行态,而仅仅需要去操作虚拟机就可以了
JPDA就是一套为调试和优化服务的虚拟机的操作工具,其中,JVMTI是整合在虚拟机中的接口,JDWP是一个通讯层,而JDI是前端为开发人员准备好的工具和运行库
二、JPDA简介
JPDA(Java Platform Debugger Architecture)是Java平台调试体系结构的缩写。由3个规范组成,分别是JVMTI(JVM Tool Interface),JDWP(Java Debug Wire Protocol),JDI(Java Debug Interface)
既然是规范,当然就有实现。Sun公司自己在jdk中提供了一套实现,比如java调试工具jdb,就是sun公司提供的JDI实现
其他厂商也可以提供自己的实现。目前,大多数的JDI实现都是通过Java语言编写的。比如,eclipse IDE,它的两个插件org.eclipse.jdt.debug.ui和org.eclipse.jdt.debug与其强大的调试功能密切相关,其中前者是eclipse调试工具界面的实现,而后者则是JDI的一个完整实现
JPDA定义了一个完整独立的体系,它由三个相对独立的层次共同组成,而且规定了它们通信的接口。这三个层次由低到高分别是JVMTI,JDWP以及JDI。这三个模块把调试过程分解成几个概念:调试者(debugger)和被调试者(debuggee),以及它们中间的通信器
被调试者运行于我们想调试的Java虚拟机之上,它可以通过JVMTI这个标准接口,监控当前虚拟机的信息
调试者定义了用户可使用的JDI调试接口,通过这些接口,用户可以对被调试虚拟机发送调试命令,同时调试者接受并显示调试结果
在调试者和被调试者之间,调试命令和调试结果,都是通过JDWP的通讯协议传输的。所有的命令被封装成JDWP命令包,通过传输层发送给被调试者,被调试者接收到JDWP命令包后,解析这个命令并转化为JVMTI的调用,在被调试者上运行。类似的,JVMTI的运行结果,被格式化成 JDWP数据包,发送给调试者并返回给JDI调用
这3个模块的关系和作用如下图:
三、JVMTI简介
JVMTI是一套由虚拟机直接提供的native接口,它处于整个JPDA体系的最底层,所有调试功能本质上都需要通过JVMTI来提供
通过这些接口,开发人员不仅能调试在该虚拟机上运行的Java程序,还能查看它们运行的状态,设置回调函数,控制某些环境变量,从而优化程序性能
JVMTI的前身是JVMDI和JVMPI,它们原来分别被用于提供调试和性能调优的功能。在J2SE 5.0之后JDK取代了JVMDI和JVMPI这两套接口,JVMDI在最新的Java SE 6中已经不提供支持,而JVMPI也计划在Java SE 7后被彻底取代
JVMTI并不一定在所有的Java虚拟机上都有实现,不同的虚拟机的实现也不尽相同。不过在一些主流的虚拟机中,比如Sun和IBM,以及一些开源的如Apache Harmony DRLVM中,都提供了标准JVMTI实现
四、JDWP简介
JDWP是通讯交互协议,它定义了调试器和被调试程序之间传递信息的格式。它详细完整地定义了请求命令、回应数据和错误代码,保证了前端和后端的JVMTI和JDI的通信通畅
比如在Sun公司提供的实现中,它提供了一个名为jdwp.dll(jdwp.so)的动态链接库文件,这个动态库文件实现了一个Agent,它会负责解析前端发出的请求或者命令,并将其转化为JVMTI调用,然后将JVMTI函数的返回值封装成JDWP数据发还给后端
另外,这里需要注意的是JDWP本身并不包括传输层的实现,传输层需要独立实现,但是JDWP包括了和传输层交互的严格的定义。在Sun公司提供的JDK中,在传输层上,它提供了socket方式,以及在Windows上的shared memory方式
这里要说明一下debugger和target vm。target vm中运行着我们希望要调试的程序,它与一般运行的Java虚拟机没有什么区别,只是在启动时加载了Agent JDWP从而具备了调试功能。而 debugger就是调试器,它向运行中的target vm发送命令来获取target vm运行时的状态和控制Java程序的执行。Debugger和target vm分别在各自的进程中运行,他们之间的通信协议就是JDWP
JDWP是语言无关的,也就是说理论上我们可以选用任意语言实现JDWP。然而实际上,在Target vm端,JDWP模块必须以Agent library的形式在JVM启动时加载,并且它必须通过JVM提供的JVMTI接口实现各种debug的功能,所以必须使用C/C++语言编写。而debugger端就没有这样的限制,可以使用任意语言编写,只要遵守JDWP规范即可
JDWP大致分为两个阶段:握手和应答。握手是在传输层连接建立完成后,做的第一件事:
Debugger发送14 bytes的字符串“JDWP-Handshake”到target vm;Target vm回复“JDWP-Handshake”
握手完成之后,debugger就可以向target vm发送命令了。JDWP 是通过命令(command)和回复(reply)进行通信的,这与HTTP有些相似。JDWP本身是无状态的,因此对command出现的顺序并不受限制
JDWP有两种基本的包(packet)类型:命令包(command packet)和回复包(reply packet)
Debugger和target vm都有可能发送command packet。Debugger通过发送command packet获取 target vm的信息以及控制程序的执行;Target vm通过发送command packet通知debugger某些事件的发生,如到达断点或是产生异常
Reply packet是用来回复command packet该命令是否执行成功,如果成功,reply packet还有可能包含command packet请求的数据,比如当前的线程信息或者变量的值;从target vm发送的事件消息是不需要回复的
还有一点需要注意的是,JDWP 是异步的:command packet的发送方不需要等待接收到reply packet就可以继续发送下一个command packet
五、JDI简介
JDI是三个模块中最高层的接口,在多数的JDK中,它是由Java语言实现的。通过它,调试工具开发人员就能通过前端虚拟机上的调试器来远程操控后端虚拟机上被调试程序的运行,JDI不仅能帮助开发人员格式化JDWP数据,而且还能为JDWP数据传输提供队列、缓存等优化服务
从理论上说,开发人员只需使用JDWP和JVMTI即可支持跨平台的远程调试,但是直接编写JDWP程序费时费力,而且效率不高。因此基于Java的JDI层的引入,简化了操作,提高了开发人员开发调试程序的效率
六、一个实际的调试过程
启动一个jboss的时候,如果直接启动,不加参数,则jvm不会挂载JDWP模块,那么前端的debugger就无法连上此jvm
因此需要加上参数:
JAVA_OPTS="-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"
这样jboss启动jvm时,就会挂载上JDWP模块,这样就支持调试了
然后在eclipse里启动debugger,也就是JDI的eclipse实现
这个时候实际上有2个进程,一个是jboss开启的jvm,也就是target jvm(debuggee);另一个是eclipse调试工具开启的jvm,也就是debugger
另外一种情况,考虑在eclipse中把web应用发布到内置的jboss插件里,然后以debug模式启动
eclipse的server plugin会自动开启一个挂载了JDWP的jvm,同时也启动一个debugger,不过传输层我估计应该用的是共享内存的方式,就不需要通过socket了
第三种情况,在eclipse中直接用debug按钮运行一个程序
这样的话,eclipse会以类似jdb的方式运行这个类,同时也启动一个debugger,传输层可能也是用共享内存的方式
总的来说,无论以何种方式,debugger和target vm一定分别在2个不同的进程中,也就是说,处于2个独立的jvm里
一、java平台调试的特点
java平台的调试,与其他平台有很大的区别。以C/C++的调试为例,目前比较流行的调试工具是GDB和微软的Visual Studio自带的debugger
首先,必须编译一个“debug”模式的程序,这个会比“release”模式的程序大很多
其次,在调试过程中,debugger将会深层介入程序的运行,获取运行时的信息,并将这些信息返回。这种介入对运行的效率和内存占用都有一定的需求。基于这些需求,这些Debugger本身创建和管理了一个运行态,因此体积都比较大
而Java则不同,由于Java的运行态交给虚拟机管理,因此作为Java的Debugger无需再自己创造一个可控的运行态,而仅仅需要去操作虚拟机就可以了
JPDA就是一套为调试和优化服务的虚拟机的操作工具,其中,JVMTI是整合在虚拟机中的接口,JDWP是一个通讯层,而JDI是前端为开发人员准备好的工具和运行库
二、JPDA简介
JPDA(Java Platform Debugger Architecture)是Java平台调试体系结构的缩写。由3个规范组成,分别是JVMTI(JVM Tool Interface),JDWP(Java Debug Wire Protocol),JDI(Java Debug Interface)
既然是规范,当然就有实现。Sun公司自己在jdk中提供了一套实现,比如java调试工具jdb,就是sun公司提供的JDI实现
其他厂商也可以提供自己的实现。目前,大多数的JDI实现都是通过Java语言编写的。比如,eclipse IDE,它的两个插件org.eclipse.jdt.debug.ui和org.eclipse.jdt.debug与其强大的调试功能密切相关,其中前者是eclipse调试工具界面的实现,而后者则是JDI的一个完整实现
JPDA定义了一个完整独立的体系,它由三个相对独立的层次共同组成,而且规定了它们通信的接口。这三个层次由低到高分别是JVMTI,JDWP以及JDI。这三个模块把调试过程分解成几个概念:调试者(debugger)和被调试者(debuggee),以及它们中间的通信器
被调试者运行于我们想调试的Java虚拟机之上,它可以通过JVMTI这个标准接口,监控当前虚拟机的信息
调试者定义了用户可使用的JDI调试接口,通过这些接口,用户可以对被调试虚拟机发送调试命令,同时调试者接受并显示调试结果
在调试者和被调试者之间,调试命令和调试结果,都是通过JDWP的通讯协议传输的。所有的命令被封装成JDWP命令包,通过传输层发送给被调试者,被调试者接收到JDWP命令包后,解析这个命令并转化为JVMTI的调用,在被调试者上运行。类似的,JVMTI的运行结果,被格式化成 JDWP数据包,发送给调试者并返回给JDI调用
这3个模块的关系和作用如下图:
三、JVMTI简介
JVMTI是一套由虚拟机直接提供的native接口,它处于整个JPDA体系的最底层,所有调试功能本质上都需要通过JVMTI来提供
通过这些接口,开发人员不仅能调试在该虚拟机上运行的Java程序,还能查看它们运行的状态,设置回调函数,控制某些环境变量,从而优化程序性能
JVMTI的前身是JVMDI和JVMPI,它们原来分别被用于提供调试和性能调优的功能。在J2SE 5.0之后JDK取代了JVMDI和JVMPI这两套接口,JVMDI在最新的Java SE 6中已经不提供支持,而JVMPI也计划在Java SE 7后被彻底取代
JVMTI并不一定在所有的Java虚拟机上都有实现,不同的虚拟机的实现也不尽相同。不过在一些主流的虚拟机中,比如Sun和IBM,以及一些开源的如Apache Harmony DRLVM中,都提供了标准JVMTI实现
四、JDWP简介
JDWP是通讯交互协议,它定义了调试器和被调试程序之间传递信息的格式。它详细完整地定义了请求命令、回应数据和错误代码,保证了前端和后端的JVMTI和JDI的通信通畅
比如在Sun公司提供的实现中,它提供了一个名为jdwp.dll(jdwp.so)的动态链接库文件,这个动态库文件实现了一个Agent,它会负责解析前端发出的请求或者命令,并将其转化为JVMTI调用,然后将JVMTI函数的返回值封装成JDWP数据发还给后端
另外,这里需要注意的是JDWP本身并不包括传输层的实现,传输层需要独立实现,但是JDWP包括了和传输层交互的严格的定义。在Sun公司提供的JDK中,在传输层上,它提供了socket方式,以及在Windows上的shared memory方式
这里要说明一下debugger和target vm。target vm中运行着我们希望要调试的程序,它与一般运行的Java虚拟机没有什么区别,只是在启动时加载了Agent JDWP从而具备了调试功能。而 debugger就是调试器,它向运行中的target vm发送命令来获取target vm运行时的状态和控制Java程序的执行。Debugger和target vm分别在各自的进程中运行,他们之间的通信协议就是JDWP
JDWP是语言无关的,也就是说理论上我们可以选用任意语言实现JDWP。然而实际上,在Target vm端,JDWP模块必须以Agent library的形式在JVM启动时加载,并且它必须通过JVM提供的JVMTI接口实现各种debug的功能,所以必须使用C/C++语言编写。而debugger端就没有这样的限制,可以使用任意语言编写,只要遵守JDWP规范即可
JDWP大致分为两个阶段:握手和应答。握手是在传输层连接建立完成后,做的第一件事:
Debugger发送14 bytes的字符串“JDWP-Handshake”到target vm;Target vm回复“JDWP-Handshake”
握手完成之后,debugger就可以向target vm发送命令了。JDWP 是通过命令(command)和回复(reply)进行通信的,这与HTTP有些相似。JDWP本身是无状态的,因此对command出现的顺序并不受限制
JDWP有两种基本的包(packet)类型:命令包(command packet)和回复包(reply packet)
Debugger和target vm都有可能发送command packet。Debugger通过发送command packet获取 target vm的信息以及控制程序的执行;Target vm通过发送command packet通知debugger某些事件的发生,如到达断点或是产生异常
Reply packet是用来回复command packet该命令是否执行成功,如果成功,reply packet还有可能包含command packet请求的数据,比如当前的线程信息或者变量的值;从target vm发送的事件消息是不需要回复的
还有一点需要注意的是,JDWP 是异步的:command packet的发送方不需要等待接收到reply packet就可以继续发送下一个command packet
五、JDI简介
JDI是三个模块中最高层的接口,在多数的JDK中,它是由Java语言实现的。通过它,调试工具开发人员就能通过前端虚拟机上的调试器来远程操控后端虚拟机上被调试程序的运行,JDI不仅能帮助开发人员格式化JDWP数据,而且还能为JDWP数据传输提供队列、缓存等优化服务
从理论上说,开发人员只需使用JDWP和JVMTI即可支持跨平台的远程调试,但是直接编写JDWP程序费时费力,而且效率不高。因此基于Java的JDI层的引入,简化了操作,提高了开发人员开发调试程序的效率
六、一个实际的调试过程
启动一个jboss的时候,如果直接启动,不加参数,则jvm不会挂载JDWP模块,那么前端的debugger就无法连上此jvm
因此需要加上参数:
JAVA_OPTS="-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"
这样jboss启动jvm时,就会挂载上JDWP模块,这样就支持调试了
然后在eclipse里启动debugger,也就是JDI的eclipse实现
这个时候实际上有2个进程,一个是jboss开启的jvm,也就是target jvm(debuggee);另一个是eclipse调试工具开启的jvm,也就是debugger
另外一种情况,考虑在eclipse中把web应用发布到内置的jboss插件里,然后以debug模式启动
eclipse的server plugin会自动开启一个挂载了JDWP的jvm,同时也启动一个debugger,不过传输层我估计应该用的是共享内存的方式,就不需要通过socket了
第三种情况,在eclipse中直接用debug按钮运行一个程序
这样的话,eclipse会以类似jdb的方式运行这个类,同时也启动一个debugger,传输层可能也是用共享内存的方式
总的来说,无论以何种方式,debugger和target vm一定分别在2个不同的进程中,也就是说,处于2个独立的jvm里
发表评论
-
system properties和environment properties
2013-06-05 17:00 1854原来我一直都混淆了system properties和envi ... -
instance、Class、Object
2013-05-23 13:07 1914一、实例和类 所有实例都有所属的类;所有类都是Class类的 ... -
类初始化顺序,及获取资源
2013-05-22 11:07 1342最近在读tomcat的源码,涉及到各种类继承体系的初始化,还有 ... -
java的方法调用,参数是按值传递还是按引用传递
2013-05-21 16:55 1365各种语言都涉及到方法 ... -
linux下加载文件资源好纠结呀
2012-12-30 08:07 3677为了给自己添堵,我把 ... -
java io基础知识
2012-12-23 01:35 2290一、char[]、String、byte[] ... -
classloader简介
2012-11-05 13:05 1743一、基本classloader体系 默认有3个classlo ... -
System.getProperty()
2012-10-30 16:58 6809最近看tomcat源码,里面有好多System.getProp ... -
java annotation简介
2012-10-26 16:31 1730开发中自定义annotation的场景不太多,但是很多框架的源 ... -
几种常用servlet容器开启调试的方法
2012-10-11 17:52 13781、jboss4.2.3.GA 在%JBOSS_HOME%/ ... -
转载:异常处理最佳实践
2012-08-22 17:30 1576本文系全文转载,原文 ... -
java动态代理
2012-08-16 17:16 1511常见的动态代理有2种: 第一种情况,目标类本身实现了某个接口 ... -
HttpClient的超时,以及jdk的调试
2012-08-02 11:08 5040最近开发一个东西,需要用到HttpClient。这个库目前最新 ... -
classpath
2012-03-25 23:14 1518classpath也是文件系统中的路径,作用是告诉类加载器要到 ... -
java集合
2011-11-27 10:28 11911、集合是一种数据结构,虽然种类不少,但是本质上就是2种,一种 ... -
JAVA类的初始化过程
2011-11-13 21:05 18111、java类中的字段,第 ...
相关推荐
标题中的"JPDA.rar"可能是指Java Platform Debugger Architecture(Java平台调试架构)的压缩文件,而"JPDA数据关联_jpda_jpda关联_数据关联JPDA_跟踪波门"这部分描述了与JPDA相关的特定应用或概念,特别是关于数据...
多目标跟踪JPDA算法实现,是学习JPDA算法的经典代码,建议下载下来看看。
【标题】"JPDA_suanfa_jpda_航迹关联_JPDAmatlab仿真_" 涉及的核心概念是“JPDA”(Joint Probabilistic Data Association)算法,这是一种在多目标跟踪领域广泛使用的算法,主要处理传感器数据中的目标关联问题。...
这些调试工具提供了直观简单的调试界面,方便开发人员进行调试。 ###独立调试工具 通过 JPDA,可以开发出独立的调试工具,例如 jdb 工具。这些独立调试工具提供了文本命令的形式,方便开发人员进行调试。 JPDA 的...
总结来说,数据关联的JPDA算法是一种解决多目标跟踪中数据关联问题的有效工具,它基于概率理论,通过预测和更新步骤来估计目标状态,并处理观测数据的不确定性。理解和熟练掌握JPDA算法,对于从事雷达系统、传感器...
matlab简单实现多目标跟踪的JPDA算法,供初学者参考
【远程调试JPDA详解】 在IT开发过程中,尤其是在部署Java应用程序到Linux服务器后,由于环境差异或数据不一致,我们可能会遇到需要远程调试的情况。此时,利用Java Platform Debugger Architecture(JPDA)可以实现...
**标题与描述解析** ...总结,这个资源包对于理解和应用JPDA算法,特别是在杂波环境中进行多目标跟踪,提供了宝贵的工具和参考。用户可以通过分析和运行"standard_jpda.m"来学习和实践这一经典算法。
标题"JPDA算法程序.zip"中提到的关键信息是"JPDA算法",这指的是Joint Probability Data Association(联合概率数据关联)算法,一种常用于多目标跟踪的数学方法。"程序"表明这里包含的是用某种编程语言实现的JPDA...
本资源主要涉及的是Java Platform Debugger Architecture (JPDA) 的学习,配合MATLAB代码以及相关论文,为深入理解JPDA目标跟踪提供了一个实践性的学习平台。JPDA是Java平台的一部分,它允许开发者调试运行在任何...
采用JPDA数据关联算法实现两个个匀速运动目标的点迹与航迹的关联。上传的为压缩文件,解压后有两个m文件,一个是Data_JPDAF.m,另一个是JPDAF.m。将两个文件放到Matlab的同一个目录下,直接运行文件Data_JPDAF.m即可...
采用JPDA数据关联算法实现两个匀速运动目标的点迹与航迹的关联
联合概率数据互联JPDA是数据关联算法之一,它的基本思想是:对应于观测数据落入跟踪门相交区域的情况,这些观测数据可能来源于多个目标。JPDA的目的在于计算观测数据与每一个目标之间的关联概率,且认为所有的有效...
进行JPDA概率数据关联及kalman滤波。 模型为假设两运动目标在x-y平面做匀速直线运动。初始位置是(4000,1200)(300,1500)速度分别是(200,200)(400,200),并在运动的位置叠加噪声。 代码有较详细的注释。
Adaptation (JPDA) approach, to replace the frequently-used joint maximum mean discrepancy metric in transfer learning. During the distribution adaptation, JPDA improves the transferability between ...
在给定的压缩包文件"NNDA PDA JPDA IMM数据关联算法matlab代码.rar"中,包含了四个关键算法的MATLAB实现:Nearest Neighbor Data Association (NNDA)、Probabilistic Data Association (PDA)、Joint Probabilistic ...
JPDA(Joint Probabilistic Data Association)算法,全称为联合概率数据关联算法,是一种在多目标跟踪领域广泛应用的算法。它主要用于解决雷达、传感器等设备在检测多个动态目标时,由于噪声、遮挡等因素导致的目标...
总结来说,JPDA算法是一种在多目标跟踪中解决数据关联问题的强大工具,它基于概率模型和贝叶斯理论,能够有效地处理传感器观测数据。该压缩包提供了一种MATLAB实现,对于学习和理解JPDA算法及其应用具有很高的价值。
标题中的"JPDA"全称为"Joint Probabilistic Data Association",这是一种在多目标跟踪领域广泛应用的算法。该算法旨在解决雷达、传感器网络等系统中如何准确地关联不同时间点或不同传感器检测到的目标,从而实现对多...