JDI,Java程序员的高级玩具
黄奕鹏(2013-08-30) http://fly-hyp.iteye.com/
Word里面贴出来的格式不太正确,需要仔细看文章的网友,请看附件
JDI 即Java Debug Interface的简称,是JDK提供的调试接口,各种开发工具都是使用这个接口实现远程调试的。几个月前好好学习了一下,真的受益匪浅。JDI功能简单,接口简单,可以对开放调试端口的运行虚拟机做各种操作。直接使用JDI,与使用Eclipse 调试器比起来,它可以实现更有创意的功能。本文主要介绍一下JDI的基本使用,以及利用JDI可以完成的创意功能。
JDI的基本使用
1. 如何连接远程的Java虚拟机
1.1 为被调试的Java程序设置启动参数:
-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
1.2 使用JDI连接远程虚拟机
使用Java JDI 连接远程虚拟机,首先要得到VirtualMachine 对象
AttachingConnector attacher=(AttachingConnector) conn;
VirtualMachine vm=attacher.attach(arguments);
不想贴大片的代码了,这里只想说连接成功以后就获得了VirtualMachine 对象。(详细代码请访问:http://www.ibm.com/developerworks/cn/java/j-lo-jpda4/index.html)
然后,通过 vm. eventRequestManager() 得到EventRequestManager对象
2. JDI API的内部关系
JDI API 是基于消息的,和Java 的 AWT 和 Swing的编程有点类似。主要是三个过程。
例如断点调试的过程
a. 注册一个特定断点的侦听事件。
EventRequestManager有下面这个方法
BreakpointRequest createBreakpointRequest(Location location)
建立BreakpointRequest就相当于注册了这个位置断点的侦听事件
b. 远程虚拟机就会将相应的事件发送过来。
c. 轮询vm.eventQueue()就可以得到断点的事件。其中包含远程JVM当前执行位置的线程信息,局部变量等信息。通过这些运行上下文信息就可以加入各种的处理逻辑了。
3. 各种的Request以及处理关系图
EventRequestManager 可以各种创建Request。每一种Request代表一种特殊的调试的能力。
4. Request的各种Filter
Request包含各种Filter 由于限制消息的范围,消息多了必然会影响性能,通过各种Filter可以仅关注有用的消息。下面列出Filter的一些例子。
MethodEntryRequest 有下列Filter
voidaddClassExclusionFilter(String classPattern)
哪些类发生的事件,不被包含
voidaddClassFilter(ReferenceType refType)
包含哪些类,通过接口或类的实例区分
voidaddClassFilter(String classPattern)
包含哪些类
voidaddInstanceFilter(ObjectReference instance)
实例过滤
voidaddThreadFilter(ThreadReference thread)
线程过滤
因为Filter 非常灵活,各种Filter类型是不能通过界面型Java调试工具完全驾驭的。直接使用JDI将更加灵活和强大。
JDI JavaDoc 地址:
http://docs.oracle.com/javase/7/docs/jdk/api/jpda/jdi/index.html
JDI可以实现的创意功能
1. VSCM 以外调试代码
以下是一个方案可以解决Java在VSCM中调试VSCM外代码的问题
调试工具在VSCM外面,可以不受VSCM限制的连接各个环境的虚拟机。在调试工具需要查看源代码时,再访问VSCM中的源代码服务程序,然后在VSCM中查看相关的源代码。
2. 跟踪方法的执行时间
通过直接使用JDI记录相关方法的执行时间,是没有侵入性的,而且简单。
例如
可以跟踪某个包下所有方法的运行时间
可以跟踪实现某个Interface的所有方法的运行时间
3. 添加方法的传入参数日志
一般使用调试工具,只能在方法入口处设置断点,然后查看传入参数的情况。这样必须长时间的中断线程的运行。
如果通过程序的方式,就可以几乎不中断线程执行,记录关注的方法的传入参数,记入日志。通过查看日志的方式对于某些开发问题的调试。
4. 动态代码替换
VirtualMachine类中有如下方法
redefineClasses(Map<? extends ReferenceType,byte[]> classToBytes)
可以将用编译后的.class文件替换远程虚拟中的运行类。
这个是eclipse调试器中已有的功能,直接使用JDI也是挺简单的。
相关推荐
JDIVisitor JDIVisitor是一个Java库,用于使用Java调试接口(JDI)和访问者设计模式来构建自定义调试器应用程序。 它从的项目中汲取了灵感。 但是,JDIVisitor避开了jdiscript的类似脚本的设计,而改用了更具Java...
JDI, JDI是用于UI测试自动化的测试框架 用户界面测试自动化框架 JavaCI 软件包 版权所有( c ) 2017,EPAM系统许可证:GPL版本的GPL许可。简介JDI - 是UI测试自动化的测试框架。 它扩展了页面对
直接在桌面适用的JAVA反编译工具。将JAR包或者CLASS文件拖进去即可以反编译成JAVA代码。
git-2.19.0-64-bit,
jdi - 一个JavaScript的文档生成器
JPDA 主要由三个部分组成:Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP),以及 Java 调试接口(JDI),本系列将会详细介绍这三个模块的内部细节、通过实例为读者揭开 JPDA 的面纱。本文是该系列的第一篇...
解决Failed to connect to remote VM com.sun.jdi.connect.spi.ClosedConnectionException错误,tomcat远程调试
JDI JDI 让Android开发更简单 一.概述 JDI为一组android开发过程中可复用的组件和模式组成 二.JDI能做什么 目标:让开发人员只关注业务逻辑.加快开发速度 1.控件和事件动态绑定 jdi借鉴了ios输出口的概念,与其他框架...
利用JDI的接口,在不修改现有程序代码的情况,可以跟踪java Thread中的method 调用及exception的工具,使用方式很简单,先使用以下方式启动要跟踪调试的JAVA 应用 * java -classpath %JAVA_HOME%/lib/tools.jar;. -...
JPDA 主要由三个部分组成:Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP),以及 Java 调试接口(JDI),本系列将会详细介绍这三个模块的内部细节、通过实例为读者揭开 JPDA 的面纱。
Sbt Tools Jar插件查找并将JDK tools.jar添加到sbt的非托管jar中,从而可以访问Java调试器接口(JDI)。安装sbt 1.0 将以下内容添加到project/plugins.sbt : addSbtPlugin( " org.scala-debugger " % " sbt-jdi-...
JDI LT070ME05000 规格书 Datasheet 通用LT070ME05111
JDI黑暗测试自动化框架 文献资料 为了快速入门,您可以阅读 更多链接: 文档: : 从介绍和教程到技术方法文档的不同类型的文档亮点+快速入门示例: : 教程: : 有助于获得实践的主要思想项目模板: : 用于快速启动...
sa-jdi-1.8.0.jar 位图BitMap
JPDA主要由三个部分组成:Java虚拟机工具接口(JVMTI),Java调试线协议(JDWP),以及Java调试接口(JDI),本系列将会详细介绍这三个模块的内部细节、通过实例为读者揭开JPDA的面纱。本文是该系列的第一篇,将会...
jdi反编译工具(class到java)简单,清晰,直接运行就可以使用。
java-svc 该存储库包含一组小示例,可用于演示各种流行的Java可维护性技术。 这些示例着重于使各种可维护性技术更容易上手。 请注意,标准Java演示中的大多数技术已经有技术演示者。 但是,此存储库中的演示集中在...
JDI的LCD屏 ,可用于VR设计,型号LPM035M407
C#源码 绘制工作流程图解,可以自由拖动绘图区域,部分源码