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也是挺简单的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

java spring 服务使用JDI工具远程调试 在开发或者进行业务测试的时候,可能会遇到当前某些场景需要远程调试来定位或者跳过某些逻辑进行操作。以上代码可打印当前断点的变量和对变量是bool、string类的进行重写。 阅读详情

相关推荐

java调试体系之Java 调试接口(JDI

文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!” />

2401_83916355的博客 1278

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

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

使用JDI监听Java程序运行

va虚拟机提供了一套用于调试(JVMDI)和监视(JVMPI)的接口,Java5之后统一为JVMTI: http://docs.oracle.com/javase/1.5.0/docs/guide/jvmti/ 。   其中JVMDI分为三个部分:JVMDI,JDWP和JDI . http://docs.oracle.com/javase/1.4.2/docs/guide/jpda/a

阳光下的立人 1215

Java Debug Interface(JDI)介绍和使用JDI调试程序

Java Debug Interface(JDI)介绍 An Intro to the Java Debug Interface (JDI) | Baeldung 1. 概述 我们可能会想像IntelliJ IDEA和Eclipse这样大的IDE是如何实现调试特征的。这些工具极大依赖于Java平台调试架构(JPDA)。 在本文中,我们将讨论Java Debug Interface API(JDI),这种可以在JPDA向下获得的接口。 同时,我们会一步步写一个自定义的调试程序,让我们熟悉JDI接口。 2. 介

阿达King哥的博客 4054

编程是什么——写给编程的初学者

 编程是什么?作者:陈跃峰出自:http://blog.csdn.net/mailbomb        对于初学者来说,编程是一件很神秘的工作,使很多人对于这个工作充满了向往,但是编程工作不适合所有的人,现在就使没有学过程序的人对于编程有个基本的认识。       编程就如写文章!写文章,需要学习一种语言,例如汉语、英语等,编程也需要学习一种语言,例如Java、C等。

爪哇米工作室陈跃峰的移动开发博客 1万+

成长轨迹:写给编程初学者

本文面向的读者:刚接触计算机编程的朋友、学了一段时间的编程但是感觉仍然在门外排徊的朋友,通常这些朋友都没有足够编程的经验。本文假设读者是正真对计算机科学感兴趣而想要知其所以然的学,如果你学编程只是为了就业或者通过各种乱七八糟的考试,我仍然欢迎你,但是不保证我的观点一点适合你。PS:老师在集体面前讲的观点一般是针对后一种情况的朋友,与你面对面交流的观点一般才是你更应该考虑的。当然这个因学校而异、因老

暴龙之影 3348

写给编程初学者的话

1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么。当你自己想出来再参考别人的提示,你就知道自己和别人思路的差异。 2.初学者请不要看太多太多的书那会误人子弟的,先找本系统的学,很多人用了很久都是只对部分功能熟悉而已,不系统还是不够的。 3.看帮助,不要因为很难而自己是初学者所以就不看;帮助永远是最好的参考手册,虽然帮助的文字有时候很难看懂,总觉得不够直观。 4.不要被对象、...

weixin_34301132的博客 117

什么是 npm —— 写给初学者的编程教程

自 2009 年以来,Node.js 一直席卷全球。成千上万个系统基于 Node.js 构建,促使开发者在社区宣称“JavaScript 正在吞噬软件”。Node 成功的主要因素之一是它广受欢迎的软件包管理器——npm,因为 npm 使 JavaScript 开发人员可以快速方便地共享软件包, 例如 lodash 和 moment。在我撰写这篇文章时,npm 已帮助发布了 130 万个软件包,每周下载量超过 160 亿次!这些数字对于任何软件工具来说都非常厉害。

weixin_52268321的博客 1841
上一篇: 异构云操作系统需要具备的18总特性和3类支持
下一篇: 阿里大数据架构
fly_hyp
博客等级 码龄24年 8粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值