首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

JDI Java软件工程师的高级玩具

2014-01-03 
JDI Java程序员的高级玩具JDI,Java程序员的高级玩具?黄奕鹏(2013-08-30)?http://fly-hyp.iteye.com/?Word

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

?

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

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

?

2.?跟踪方法的执行时间

?

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

例如

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

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

?

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

?

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

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

?

4.?动态代码替换

VirtualMachine类中有如下方法

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

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

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

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

热点排行