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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

相关推荐

使用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

阳光下的立人 1217

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哥的博客 4069

Java通过JDI实现对远程虚拟机的操作

最近weblogic服务器的一个线程挂起了,需要将其杀掉,不然可能导致整个weblogic服务器瘫痪。没办法,只能通过远程调试的方法来处理了。这里使用的JDI(Java Debug Interface)来实现的。 在被调试的JVM上添加如下启动参数 -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n 具体的参数

ksqqxq的专栏 1833

JDI 开源项目使用教程

JDI 开源项目使用教程 1. 项目介绍 JDI(Java Development Infrastructure)是一个开源的测试自动化框架,旨在简化UI测试的开发和维护。该项目由EPAM Systems维护,支持多种编程语言(如Java、C#、Python等),并提供了丰富的API和工具来帮助开发者快速构建和执行UI测试。 JDI的主要特点包括: 跨平台支持:支持多种编程语言和测试环境。 丰富...

gitblog_00982的博客 952

Java Debug Interface(JDI)调试多线程应用程序

项目中遇到500多个线程并发执行,并将线程执行所生成的数据插入MySql数据库,按设想,500个线程,数据库中应有序号连续的500条记录。然而,郁闷的是数据库中的记录在第450条左右就开始不连续,部分记录缺失。500多个线程几乎是独立的,它们之间存在的资源竞争已经做好同步了,因此,由于资源而阻塞的情况排除。再者,500个线程间优先级均等同,我中间做了sleep操作,让线程sleep时间与序号成正比

maritimesun的专栏 8229

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

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

JDI简介

JDI(Java Debug Interface)是 JPDA 三层模块中最高层的接口,定义了调试器(Debugger)所需要的一些调试接口。基于这些接口,调试器可以及时地了解目标虚拟机的状态,例如查看目标虚拟机上有哪些类和实例等。另外,调试者还可以控制目标虚拟机的执行,例如挂起和恢复目标虚拟机上的线程,设置断点等。 目前,大多数的 JDI 实现都是通过 Java 语言编写的。比如,Java 开

阳光下的立人 2068

服务器被矿工入侵记录

一次服务器被矿工入驻的处理记录

王瑞的技术专栏 1333

java调试体系之Java 调试接口(JDI),字节跳动历年校招Java面试真题解析

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。有帮助,可以添加V获取:vip1024b (备注Java)**[外链图片转存中…(img-EKiwaVno-1711697873909)]

m0_62261166的博客 840

Python实战:5分钟搞定高德地图API批量地址转经纬度(附完整代码)

本文提供了一套完整的Python解决方案,利用高德地图Web服务API,实现批量地址到经纬度坐标的自动化转换。文章包含从API申请、核心代码编写到错误处理与性能优化的全流程实战指南,并附赠数据可视化方法,帮助数据分析师和开发者快速提升地理信息处理效率。

weixin_29047919的博客 582

[Ethernet in CANoe]4--CANoe工程中SOME/IP报文的详细介绍(二)

介绍了SOME/IP报文的SD报文(ServiceDiscovery),本片文章开始继续介绍SOME/IP报文。

汽车ECU自动化测试 1113

【JDI】at com.sun.tools.jdi.ConcreteMethodImpl.getVariables1(ConcreteMethodImpl.java:495)

import com.sun.jdi.*; import com.sun.jdi.connect.Connector; import com.sun.jdi.connect.LaunchingConnector; import com.sun.jdi.event.*; import com.sun.jdi.request.BreakpointRequest; import com.sun.j...

qfzhangwei的专栏 452

南邮-软件设计实验(C++版)

南邮软件设计 A档 一、分数统计 课题内容:   设计一个分数统计程序。包括学生信息的输入输出以及排序。通过该课题全面熟悉数组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。 课题要求: (1)输入某班级学生的姓名、分数; (2)对(1)的分数进行降幂排列并输出; (3)具有输入输出界面。 示例代码: #include<bits/stdc++.h> using...

Dainelcw 1万+

什么是Java虚拟机的调试接口(JDI)?

Java调试接口(Java Debug Interface,JDI)是Java平台提供的一个高级接口,用于支持远程调试。它属于Java Platform, Standard Edition (Java SE)的一部分,特别是Java Management Extensions (JMX)和Java Virtual Machine Tool Interface (JVMTI)等工具接口中的一员。然而,对于那些需要开发自定义调试工具或者深入理解Java调试机制的人来说,了解JDI是非常有帮助的。

Pmyx_wyh的博客 605

Oracle数据库的内存管理优化技巧

Oracle数据库作为企业级数据库管理系统,广泛应用于各种业务场景。内存管理是Oracle数据库性能优化的关键环节,合理的内存管理可以显著提高数据库的响应速度和吞吐量。本文的目的是深入探讨Oracle数据库内存管理的优化技巧,涵盖了系统全局区(SGA)和程序全局区(PGA)的管理、内存分配算法、内存参数调整等方面。通过详细的讲解和实际案例分析,帮助读者掌握优化Oracle数据库内存使用的方法,提高数据库的性能和稳定性。

2502_91592937的博客 996

CCF编程培训师资认证(PTA)标准(教学能力T)

随着计算机科学的不断发展,计算机相关技术应用到社会各个行业,越来越多的青少年参加到了计算机程序设计的学习中,这对编程培训教师提出了更高的专业要求和职业要求。CCF开展编程培训师资认证项目(Programming Trainer Accreditation,PTA),旨在建立一个规范的、科学的、权威且有公信力的三方认证。认证考试分编程专业能力(P)和教学能力(T)两部分。本标准根据《CCF编程培训师资认证条例》第十条制定,旨在明确教学能力(T)的测试标准。

lan_in的博客 1712

深入 Java 调试体系,第 4 部分: Java 调试接口(JDI)

JPDA(Java Platform Debugger Architecture) 是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程序。JPDA 主要由三个部分组成:Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP),以及 Java 调试接口(JDI),本系列将会详细介绍这三个模块的内部细节、通过实例为读者揭

tterminator的专栏 4572

YOLOv11来了,使用YOLOv11训练自己的数据集和推理(附YOLOv11网络结构图)

YOLOv11 由 Ultralytics 在 2024 年 9 月 30 日发布, 最新的 YOLOv11 模型在之前的 YOLO 版本引入了新功能和改进,以进一步提高性能和灵活性。YOLO11 在快速、准确且易于使用,使其成为各种对象检测和跟踪、实例分割、图像分类和姿态估计任务的绝佳选择。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 28万+

JDI tutorial (trace example)

Components Debugger Interfaces / |--------------| / | VM | debuggee ----( |--------------| <----...

dianmi2675的博客 109

44位abogus补环境与纯算逆向分析

44位ab参数补环境与纯算加密流程逆向分析

吴秋霖的博客 2779

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值