`
fly_hyp
  • 浏览: 302225 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

JDI Java程序员的高级玩具

 
阅读更多

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 以外调试代码

 

以下是一个方案可以解决JavaVSCM中调试VSCM外代码的问题  

调试工具在VSCM外面,可以不受VSCM限制的连接各个环境的虚拟机。在调试工具需要查看源代码时,再访问VSCM中的源代码服务程序,然后在VSCM中查看相关的源代码。

 

2. 跟踪方法的执行时间

 

通过直接使用JDI记录相关方法的执行时间,是没有侵入性的,而且简单。

例如

可以跟踪某个包下所有方法的运行时间

可以跟踪实现某个Interface的所有方法的运行时间

 

3. 添加方法的传入参数日志

 

一般使用调试工具,只能在方法入口处设置断点,然后查看传入参数的情况。这样必须长时间的中断线程的运行。

如果通过程序的方式,就可以几乎不中断线程执行,记录关注的方法的传入参数,记入日志。通过查看日志的方式对于某些开发问题的调试。

 

4. 动态代码替换

VirtualMachine类中有如下方法

 redefineClasses(Map<? extends ReferenceType,byte[]> classToBytes)

可以将用编译后的.class文件替换远程虚拟中的运行类。

这个是eclipse调试器中已有的功能,直接使用JDI也是挺简单的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    sa-jdi.jar.zip

    标题中的"sa-jdi.jar.zip"是一个压缩文件,它包含了名为"sa-jdi.jar"的Java可执行 jar 文件。在Java开发中,JAR(Java Archive)文件是用于打包类库、资源文件以及应用程序的二进制文件。这种格式允许将多个文件组合...

    java并发编程

    【标题】:“Java并发编程”涉及的是Java编程中关于多线程和并发处理的重要概念,是Java程序员在开发高效率、高性能系统时必须掌握的关键技能。这个主题涵盖了许多子领域,包括线程创建、同步机制、并发工具类、并发...

    jdivisitor:Java库,用于使用Java调试接口(JDI)和访问者设计模式来构建自定义调试器应用程序

    JDIVisitor JDIVisitor是一个Java库,用于使用Java调试接口(JDI)和访问者设计模式来构建自定义调试器应用程序。 它从的项目中汲取了灵感。 但是,JDIVisitor避开了jdiscript的类似脚本的设计,而改用了更具Java...

    JDI, JDI是用于UI测试自动化的测试框架.zip

    JDI, JDI是用于UI测试自动化的测试框架 用户界面测试自动化框架 JavaCI 软件包 版权所有( c ) 2017,EPAM系统许可证:GPL版本的GPL许可。简介JDI - 是UI测试自动化的测试框架。 它扩展了页面对

    jbe 查看java bytecode的工具

    6. **调试支持**:JBE与Java调试接口(JDI)集成,允许用户在字节码级别设置断点,进行调试,这对于分析和修复错误非常有用。 7. **插件扩展**:JBE支持插件系统,允许开发人员根据需求扩展其功能,例如添加对新...

    JAVA GUI反编译工具

    JAVA GUI反编译工具是一种专门用于查看和理解Java字节码的软件,它允许开发者将已编译的JAR包或CLASS文件转换回源代码的形式。这种工具在软件逆向工程、代码分析、学习第三方库的工作原理或者修复二进制代码错误时...

    java 19下载,版本 19.0.1, windows各版本

    4. **Java调试接口**(JDI)和**Java调试工具**(jdb):用于调试Java应用程序,查找并修复代码中的问题。 5. **Java性能分析器**(JFR)和**Java Mission Control**(JMC):这些工具帮助开发者监控和分析应用程序...

    JAVA-api.rar_2017java中文api_java pro_java API_java api_java在线a

    对于`java.pro`的专业开发者,他们可能更关注高级特性,如并发编程(`java.util.concurrent`包)、JVM内存管理、Java虚拟机调试接口(JDI)、Java数据库连接(JDBC)以及Java应用程序接口(Swing或JavaFX)等。...

    Java调试体系及协议

    1. **Java Debug Interface (JDI)**: JDI是调试器与Java虚拟机之间的API,提供了丰富的调试功能,如设置断点、检查和修改变量、调用方法、跟踪线程等。开发者可以通过JDI来构建自定义的调试工具。 2. **Java ...

    java js引擎调试js代码

    然而,使用JDI直接调试JavaScript代码需要编写额外的Java代码来实现,这可能对新手来说较为复杂。 **第三方库:JSDT** Eclipse有一个名为JavaScript Development Tools (JSDT) 的插件,它可以提供对JavaScript代码...

    JDK1.6源码 JAVA

    JDK(Java Development Kit)是Oracle公司提供的Java开发工具包,其中包含了Java运行环境、编译器、调试器以及其他工具,是Java程序员进行开发的基础。JDK1.6版本是Java历史上的一个重要里程碑,它的源码对于我们...

    Java1.7源码包,包含sun

    总的来说,这个Java 1.7源码包对于学习和研究Java平台的内部工作、理解JVM行为、以及开发高级的Java工具和框架都有着无价的价值。通过阅读源码,开发者可以提升自己的技能,更好地解决实际问题,同时也能为向更高...

    jdi一个JavaScript的文档生成器

    jdi - 一个JavaScript的文档生成器

    Windows Java SE Development Kit 11.0.15.1 x64 Installer

    5. **Java调试接口(JDI)**:提供了一套API,用于创建调试工具和服务。 6. **Java打包工具(jar)**:用于创建和管理Java归档文件,便于分发和部署Java应用程序。 7. **Java性能分析工具**,如JConsole和VisualVM,...

    Java常用指令大全.7z

    这个名为"Java常用指令大全.7z"的压缩包文件包含了一个文档,很可能是为了帮助初学者或经验丰富的Java程序员熟悉和掌握在Java开发过程中经常用到的命令行工具和操作指令。 在Java开发中,了解并熟练使用一些基本的...

    JavaAgent例子-agentmain方式 demo

    总结起来,"JavaAgent-agentmain方式 demo"涵盖了JavaAgent的核心概念,包括如何创建和加载JavaAgent,如何使用Javaassist进行字节码操作,以及如何通过`Instrumentation`和JDI实现运行时代码织入。这些技术在性能...

    解决java远程调试ClosedConnectionException错误

    解决Failed to connect to remote VM com.sun.jdi.connect.spi.ClosedConnectionException错误,tomcat远程调试

Global site tag (gtag.js) - Google Analytics