- 浏览: 31534 次
- 性别:
- 来自: 厦门
最新评论
在无法访问运行中的实例时,调试一个Java程序可能相当麻烦;当应用程序在远程环境下运行,并且不会在控制台或日志文件中输出任何结果时,调试工作变得更加困难。如果你需要对一个运行中的Java应用程序进行全方位调试,Sun的Java平台调试构架(JPDA)可为您提供帮助。
JPDA是一组API集合,旨在帮助你调试Java代码。J2SE自1.2.2版开始推出JPDA工具集,并在1.3.x版中将它直接包含在J2SE软件包中。
JPDA并非一个应用程序或调试工具,而是一组精心设计的接口与协议,了解这点很重要。Sun设计这一标准的目的是提供一个基础构架,以便第三方工具和调整器能够高效利用它。还有许多利用JPDA的优秀调试器和IDE,包括一些获得广泛认可的工具,如Borland JBuilder、Oracle JDeveloper、IntelliJ IDEA、Sun NetBeans、IBM Eclipse等等。不过,Sun在它的传统命令行式调试器jdb中提供了一个参考实例。Java 1.3重新编写了jdb以支持JPDA。在本文中,我将讨论JPDA技术及它的一些实际应用。
工作原理
JPDA由三个接口构成,这些接口为桌面系统的开发环境而设计。Java虚拟机工具接口(JVMTI)定义虚拟机(VM)在调试时必须提供的服务。(在Java 5.0中,JVMTI替代已被删除的Java虚拟机调试接口)。Java调试线协议(JDWP)定义在调试过程和调试器前端之间传输的信息和请求的格式。它执行Java调试接口(JDI)。JDI定义用户代码级信息和请求。
JPDA概念将调试过程分为两部分:被调试的程序(被调试者-debuggee)和JDI。JDI一般为一个调试应用程序的用户接口(或Java IDE的一部分)。被调试的应用程序在后端运行,而JDI在前端运行。在前端与后端之间有一个通信通道运行JDWP协议;因此,被调试程序与调试器可以位于同一个系统内,也可位于不同的系统中。
从开发者的角度,一个调试应用程序可进入任何JPDA层面。因为JDI是最高层,也最容易使用,我们推荐使用这个接口。假设一家公司用JDI开发了一个调试器。公司能够把它用于参考实例中,它将自动与VM和Sun支持的平台协同工作,因此大多数IDE供应商采用这种方式。还可以这样,例如,参考实例在前端运行,被调试者运行另一家公司执行JDWP(它可能运行或忽略JVMTI)的VM。
一些调试器可能建立在较低层面之上,如JDWP(例如,如果Java没有编写前端)或JVMTI(针对需要低级功能的专用调试器)。
调试器的后端负责由调试器前端向被调试者VM传输请求,如“告诉我变量X的值”;它还负责向前端传输对这些请求(包括像到达断点之类的预计事件)的响应。后端与前端利用JDWP通过一个通信通道进行通信。后端与被调试者VM利用JVMTI进行通信。
通信通道连接调试器的前端与后端。可以认为它由两个装置组成:一个连接器和一个传送器。连接器是一个JDI对象,它在前端与后端建立连接;可能有三种类型的连接器:
收听型:前端从后端收听一个进入的连接。
依附型:前端依附到一个已运行的后端上。
发布型:前端发布运行被调试者代码和后端的Java过程。
传送器是在前端和后端传输信息的基本装置。在JPDA规范中没有指定必须使用的传送器装置。可能的装置包括:套接字、串行线路和共享内存。但是,JDWP指定了流经通道的连续化位流的格式与语义。许多IDE和调试器都支持两种类型的传送器(Sun的参考实例就是如此):共享内存(如果被调试者和调试器位于同一系统)和套接字(被调试者和调试器可位于任何地方,包括同一系统)。
从J2SE 5.0开始,JPDA包括了服务提供器接口,允许对连接器与传送器实例进行开发与配置。这些服务提供器服务接口允许调试器和其它工具供应商开发新的连接器实例,并提供除Sun的套接字和共享内存以外的其它传送器装置。
被调试者与调试器之间的通信以连接为导向。因此,一方必须作为服务器,收听一个连接;另一方作为一个客户端连接到服务器。JPDA允许以调试应用程序和目标VM为服务器。
如果你需要使用套接字传送器,在对应的JVM中以dt_socket为名确定自变量的类型。如果被调试者和调试器位于同一机器之中,且运行的是Windows系统,你可以使用名为dt_schmem的共享内存连接器。如果你希望用一个与JPDA兼容的调试器调试应用程序,你应在调试模式下运行调试器,并提交其它参数,如传送器类型、主机名称、端口号及其它信息。所有JPDA和调试参数必须在启动应用程序时作为自变量提交。
要进行调试,你必须将调试JDWP代理加载到应用程序的JVM中。从Java 5.0开始,你可以用-agentlib:jdwp选项来完成加载。5.0以前版本则使用-Xdebug和-Xrunjdwp选项(5.0也支持-Xdebug和-Xrunjdwp选项,不过新的-agentlib:jdwp选项更加好用。因为5.0中的JDWP代理使用JVMTI接口连接VM,而非旧的JVMDI接口)。你应该向-agentlib:jdwp(Java 5.0中)或-Xrunjdwp(Java 5.0以前版本) 参数提供子选项;两组可能的子选项相同。
以下列方式指定子选项:
-agentlib:jdwp=<name1>[=<value1>],<name2>[=<value2>]...
或
-Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...
你可以使用这些选项:
help:打印如何应用它的简单信息,并退出VM。
server:(是”y”或否”n”):如“server=y”,收到一个要依附的调试应用程序;如“server=n”,依附到指定地址的调试应用程序。
address:连接传送地址。如果server=n,尝试依附到这个地址的调试应用程序;如server=y,收到这个地址的连接。
timeout:如果server=y,它以毫秒为单位指定等待调试器依附的时间;如server=n,它以毫秒为单位指定依附到调试器所用的时间。
suspend:如“是”,JVM延缓执行,直到调试器与被调试JVM建立连接。
以下是命令行实例:
-agentlib:jdwp=transport=dt_socket,server=y,address=8000
在端口8000收听一个套接字连接。在主类加载前延缓这个VM(默认suspend=y)。一旦连接上调试应用程序,它发送一个JDWP命令恢复VM。
-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
选择一个有效的共享内存传输地址并将它打印出来。在那个地址收听一个共享内存连接。在调试应用程序依附之前,允许VM开始执行。
-agentlib:jdwp=transport=dt_socket,address=myhost:8000
通过myhost主机端口8000的套接字依附到一个运行的调试应用程序。在主类加载前延缓这个VM
JPDA是一组API集合,旨在帮助你调试Java代码。J2SE自1.2.2版开始推出JPDA工具集,并在1.3.x版中将它直接包含在J2SE软件包中。
JPDA并非一个应用程序或调试工具,而是一组精心设计的接口与协议,了解这点很重要。Sun设计这一标准的目的是提供一个基础构架,以便第三方工具和调整器能够高效利用它。还有许多利用JPDA的优秀调试器和IDE,包括一些获得广泛认可的工具,如Borland JBuilder、Oracle JDeveloper、IntelliJ IDEA、Sun NetBeans、IBM Eclipse等等。不过,Sun在它的传统命令行式调试器jdb中提供了一个参考实例。Java 1.3重新编写了jdb以支持JPDA。在本文中,我将讨论JPDA技术及它的一些实际应用。
工作原理
JPDA由三个接口构成,这些接口为桌面系统的开发环境而设计。Java虚拟机工具接口(JVMTI)定义虚拟机(VM)在调试时必须提供的服务。(在Java 5.0中,JVMTI替代已被删除的Java虚拟机调试接口)。Java调试线协议(JDWP)定义在调试过程和调试器前端之间传输的信息和请求的格式。它执行Java调试接口(JDI)。JDI定义用户代码级信息和请求。
JPDA概念将调试过程分为两部分:被调试的程序(被调试者-debuggee)和JDI。JDI一般为一个调试应用程序的用户接口(或Java IDE的一部分)。被调试的应用程序在后端运行,而JDI在前端运行。在前端与后端之间有一个通信通道运行JDWP协议;因此,被调试程序与调试器可以位于同一个系统内,也可位于不同的系统中。
从开发者的角度,一个调试应用程序可进入任何JPDA层面。因为JDI是最高层,也最容易使用,我们推荐使用这个接口。假设一家公司用JDI开发了一个调试器。公司能够把它用于参考实例中,它将自动与VM和Sun支持的平台协同工作,因此大多数IDE供应商采用这种方式。还可以这样,例如,参考实例在前端运行,被调试者运行另一家公司执行JDWP(它可能运行或忽略JVMTI)的VM。
一些调试器可能建立在较低层面之上,如JDWP(例如,如果Java没有编写前端)或JVMTI(针对需要低级功能的专用调试器)。
调试器的后端负责由调试器前端向被调试者VM传输请求,如“告诉我变量X的值”;它还负责向前端传输对这些请求(包括像到达断点之类的预计事件)的响应。后端与前端利用JDWP通过一个通信通道进行通信。后端与被调试者VM利用JVMTI进行通信。
通信通道连接调试器的前端与后端。可以认为它由两个装置组成:一个连接器和一个传送器。连接器是一个JDI对象,它在前端与后端建立连接;可能有三种类型的连接器:
收听型:前端从后端收听一个进入的连接。
依附型:前端依附到一个已运行的后端上。
发布型:前端发布运行被调试者代码和后端的Java过程。
传送器是在前端和后端传输信息的基本装置。在JPDA规范中没有指定必须使用的传送器装置。可能的装置包括:套接字、串行线路和共享内存。但是,JDWP指定了流经通道的连续化位流的格式与语义。许多IDE和调试器都支持两种类型的传送器(Sun的参考实例就是如此):共享内存(如果被调试者和调试器位于同一系统)和套接字(被调试者和调试器可位于任何地方,包括同一系统)。
从J2SE 5.0开始,JPDA包括了服务提供器接口,允许对连接器与传送器实例进行开发与配置。这些服务提供器服务接口允许调试器和其它工具供应商开发新的连接器实例,并提供除Sun的套接字和共享内存以外的其它传送器装置。
被调试者与调试器之间的通信以连接为导向。因此,一方必须作为服务器,收听一个连接;另一方作为一个客户端连接到服务器。JPDA允许以调试应用程序和目标VM为服务器。
如果你需要使用套接字传送器,在对应的JVM中以dt_socket为名确定自变量的类型。如果被调试者和调试器位于同一机器之中,且运行的是Windows系统,你可以使用名为dt_schmem的共享内存连接器。如果你希望用一个与JPDA兼容的调试器调试应用程序,你应在调试模式下运行调试器,并提交其它参数,如传送器类型、主机名称、端口号及其它信息。所有JPDA和调试参数必须在启动应用程序时作为自变量提交。
要进行调试,你必须将调试JDWP代理加载到应用程序的JVM中。从Java 5.0开始,你可以用-agentlib:jdwp选项来完成加载。5.0以前版本则使用-Xdebug和-Xrunjdwp选项(5.0也支持-Xdebug和-Xrunjdwp选项,不过新的-agentlib:jdwp选项更加好用。因为5.0中的JDWP代理使用JVMTI接口连接VM,而非旧的JVMDI接口)。你应该向-agentlib:jdwp(Java 5.0中)或-Xrunjdwp(Java 5.0以前版本) 参数提供子选项;两组可能的子选项相同。
以下列方式指定子选项:
-agentlib:jdwp=<name1>[=<value1>],<name2>[=<value2>]...
或
-Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...
你可以使用这些选项:
help:打印如何应用它的简单信息,并退出VM。
server:(是”y”或否”n”):如“server=y”,收到一个要依附的调试应用程序;如“server=n”,依附到指定地址的调试应用程序。
address:连接传送地址。如果server=n,尝试依附到这个地址的调试应用程序;如server=y,收到这个地址的连接。
timeout:如果server=y,它以毫秒为单位指定等待调试器依附的时间;如server=n,它以毫秒为单位指定依附到调试器所用的时间。
suspend:如“是”,JVM延缓执行,直到调试器与被调试JVM建立连接。
以下是命令行实例:
-agentlib:jdwp=transport=dt_socket,server=y,address=8000
在端口8000收听一个套接字连接。在主类加载前延缓这个VM(默认suspend=y)。一旦连接上调试应用程序,它发送一个JDWP命令恢复VM。
-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
选择一个有效的共享内存传输地址并将它打印出来。在那个地址收听一个共享内存连接。在调试应用程序依附之前,允许VM开始执行。
-agentlib:jdwp=transport=dt_socket,address=myhost:8000
通过myhost主机端口8000的套接字依附到一个运行的调试应用程序。在主类加载前延缓这个VM
发表评论
-
装饰模式与代理模式的区别(转载)
2013-04-22 11:28 612学习AOP时,教材上面都说使用的是动态代理,可是在印 ... -
《转》Java入门-高手对 CLASSPATH 的详解
2012-12-05 09:54 0Java入门-高手对 CLASSPATH 的详解 来源: 作者 ... -
java并发中Lock和Synchronized的异同
2011-11-27 14:15 7794java中可以使用Lock和Synchronized的可以实现 ... -
《转》再说final变量
2011-11-23 09:36 739再说final变量 分类: 【 ... -
<转>XFire生火指南(下)
2011-11-09 13:44 784<转>XFire生火指南(下) 请先阅读:XFi ... -
myeclipse7.0注册码算法
2011-09-19 21:25 828package com.edj.sessionbean; ... -
(转)cursor 与refcursor及sys_refcursor的区别
2011-09-14 08:56 0(转)cursor 与refcursor及sys_refcur ... -
BigDecimal不整除的一个异常
2011-09-13 09:37 2864BigDecimal不整除的一个异 ... -
(转)由MyEclipse内存不足谈谈JVM内存
2011-09-06 09:07 701原文出处: http://www.javatang.com/a ... -
Property文件的六种读取发放
2011-08-26 16:41 1106Java读取properties文件 【转】 使用J2SE ... -
Eclipse debug 的五个技巧
2011-08-26 16:38 1351Logical Structure The logical s ... -
tomcat端口被占用
2011-08-25 16:02 794关于tomcat端口占用的问题,怎么在myeclipse中启动 ... -
java中标签跳转
2011-08-23 14:02 1020continue语句 1.continue语句用来结束本次 ... -
java一些书籍
2011-08-23 08:56 800深入理解java虚拟机 第二版 深入理解Java虚拟机:JVM ... -
主从表中从主表保存修改的子表
2011-08-22 18:09 1128我们从数据库中查出主表Class,连带它的子表Set<S ... -
java序列化深度克隆
2011-08-18 09:24 784publicObject copy() throwsI ...
相关推荐
本文将详细介绍如何使用JPDA进行Java程序的远程调试。 首先,为了使用JPDA进行远程调试,你需要确保目标Java应用程序在启动时已经启用了调试模式。在Windows环境下,这通常意味着在Java命令行参数中添加特定的选项...
JPDA(Java Platform Debugger Architecture)是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程序。 JPDA 主要由三个部分组成:Java 虚拟机工具接口(JVMTI),...
通过 JPDA,开发人员可以根据特定需求,扩展定制 Java 调试应用程序,开发出吸引开发人员使用的调试工具。 ### 丰富的 API JPDA 提供了丰富的 API,提供了许多实用的功能,例如,监控当前 Java 虚拟机的状态,设置...
"JPDA学习笔记.docx"文档很可能是详细阐述JPDA工作原理、使用方法和实际应用的教程,包括如何配置调试环境、启动调试器、连接到目标虚拟机以及如何进行各种调试操作。建议先从这份笔记开始,了解JPDA的基础知识和...
JPDA是Java平台调试架构,它由Java虚拟机后端和调试平台前端两部分构成,使得调试平台可以通过调试交互协议向Java虚拟机请求服务,从而对运行在虚拟机中的程序进行调试。 具体到本文中,我们的应用服务器是Tomcat ...
`JPDA的matlab程序.doc`这个文档很可能是详细介绍了如何用MATLAB编写JPDA算法的代码,包括数据结构设计、概率计算、数据关联矩阵的建立以及滤波器的迭代过程等。具体实现通常会涉及以下步骤: 1. **数据预处理**:...
采用JPDA数据关联算法实现两个个匀速运动目标的点迹与航迹的关联。上传的为压缩文件,解压后有两个m文件,一个是Data_JPDAF.m,另一个是JPDAF.m。将两个文件放到Matlab的同一个目录下,直接运行文件Data_JPDAF.m即可...
在基于JPDA的Java软件性能测试中,JPDA即Java平台调试技术,是一类检验Java运行性能的平台之一。JPDA将程序前端的层次进行简化测试,有效提高认软件运行的准确性和稳定性。并且由此可知程序前端层次的测试非常重要,...
标题中的"JPDA.rar"可能是指Java Platform Debugger Architecture(Java平台调试架构)的压缩文件,而"JPDA数据关联_jpda_jpda关联_数据关联JPDA_跟踪波门"这部分描述了与JPDA相关的特定应用或概念,特别是关于数据...
2. **目标状态估计**:使用JPDA算法来估计每个目标的运动状态,如位置、速度等。JPDA的核心在于通过贝叶斯滤波(如扩展卡尔曼滤波EKF)来更新目标的状态估计,并通过数据关联矩阵来处理观测数据的不确定性。 3. **...
多目标跟踪JPDA算法实现,是学习JPDA算法的经典代码,建议下载下来看看。
在使用Java调试时,了解JPDA的工作原理能够帮助开发者更有效地定位问题。例如,通过JDWP,开发者可以捕获到详细的线程堆栈信息,找出死锁或者阻塞的原因;通过JDI,可以动态修改代码并立即生效,进行现场测试。 总...
在给定的压缩包文件"NNDA PDA JPDA IMM数据关联算法matlab代码.rar"中,包含了四个关键算法的MATLAB实现:Nearest Neighbor Data Association (NNDA)、Probabilistic Data Association (PDA)、Joint Probabilistic ...
本篇文章将深入探讨如何使用Eclipse进行远程调试Java应用程序。 首先,确保你已经安装了Eclipse的最新版本,例如Ganymede(V3.4)。Ganymede引入了套接字监听连接器,使得远程调试变得更加灵活。在创建启动配置时,...
"程序"表明这里包含的是用某种编程语言实现的JPDA算法代码。 描述中提到"雷达多目标跟踪JPDA联合数据互联方法MATLAB程序",说明这个程序是针对雷达系统设计的,旨在解决在复杂环境中,如杂波干扰,如何有效地跟踪多...
这通常涉及使用Java Debug Wire Protocol (JDWP) 来实现调试器和运行中的JVM之间的通信。 1. **基于JVM的远程调试** 在Java命令行中,我们可以通过添加`-agentlib:jdwp`参数来启用远程调试。例如,对于Java 1.5及...
2. **代码示例**:展示了如何在实际项目中应用JPDA进行目标跟踪的Java代码片段。 3. **配置文件**:可能包含用于配置JPDA连接的参数和脚本。 4. **演示应用程序**:用于演示JPDA功能的简单应用程序,便于学习和实践...
- 在文件中添加以下行以启用 JPDA(Java Platform Debugger Architecture)调试功能: - `set JAVA_OPTS=%JAVA_OPTS% -Xnoagent -Xdebug -Xrunjdwp:transport=dt_socket,address=8002,server=y,suspend=n` 这条...