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

JDI Java程序员的高级玩具相关推荐

  1. Java程序员的发展前景

    不知道什么时候开始,IT业初级程序员的工作性质与进城打工的"农民工"变得如此惊人的相似.很多IT公司的高管认为"人便宜,就是要用到坏掉,然后再找更便宜.更年轻的" ...

  2. Java程序员总结出必看的初级~高级技术面试题

    1换位思考下,如果你面试官,你会怎么做 1只能通过简历和面试来衡量,别无他法.如果某位大牛确认能力很行,但面试时无法充分地自证能力,那对不起了,过不了,现实就这样. 2如果面试官由于能力不行,招进来一 ...

  3. 高级 Java 程序员都在学什么?

    我曾在某乎的一条回答下看到这样一条评论: 确实,Netty 大家肯定都会,不会的绝对是初级或者XX 上面的说有失偏颇,学习技术没必要上升到人身攻击,更重要的是如何学会技术,面好的大厂,拿到高的薪资. ...

  4. java面向对象程序练习_5本面向经验丰富的程序员的高级Java书籍

    java面向对象程序练习 Sometimes back I wrote an article for Best Core Java Books for beginners, today I am sh ...

  5. 如何成为一个高级java程序员

        如何成为高级程序员 section 1 1.Core Java,就是Java基础.JDK的类库,很多童鞋都会说,JDK我懂,但是懂还不足够,知其然还要知其所以然,JDK的源代码写的非常好,要经 ...

  6. 高级Java程序员值得拥有的10本书

    本文是码农网原创翻译,转载请看清文末的转载要求,谢谢合作! Java是时下最流行的编程语言之一.市面上也出现了适合初学者的大量书籍.但是对于那些在Java编程上淫浸多时的开发人员而言,这些书的内容未免 ...

  7. 如何才能进阶高级Java程序员?

    身为程序员,一旦进入技术行列,就开启了持续学习的道路,更迭迅速的互联网时代,技术自然也是一代一代的更新,在技术进阶的道路上,要不断吸收新的想法和技术知识.进阶高级Java程序员要怎么做,不如跟着千锋重 ...

  8. 月薪25K的高级Java程序员的面试题是怎么样的?

    1-5年的Java程序员,薪资区间大致是在15-25K左右,那有没有可能提前达到30K的薪资呢?有人说这只能是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿30K的不太可能是初 ...

  9. Java 高级软件工程师面试题,java 教程多态,Java 程序员面试笔记 pdf

    正文 梳理知识点,是快速提升技术的关键 前面讲过,快速提升自己的技术硬实力其实是有方法的.大致就是梳理知识点+夯实基础+进阶深入学习+实战,下面我会一点点跟大家剖析,本文干货满满,大家仔细阅读. 梳理 ...

最新文章

  1. 计算机网络知到马惜平答案,计算机网络实习用Dreamweaver搭建个人网站
  2. springboot 读取配置文件内容的几种方式
  3. 斯坦福CS229机器学习课程的数学基础(概率论)翻译完成
  4. 彩虹浏览器使用技巧:页签自动切换
  5. MySql与SqlServer的一些常用用法的差别
  6. RocketMQ : UpdateTopicSubCommand command failed connect to xxx:10909 failed
  7. 90 行代码,15 个元素教你如何实现无限滚动!
  8. 学python电脑硬件_2020 python学习第一天————编程语言及计算机介绍
  9. 去除地址栏带#的问题
  10. C#反射Assembly 详细说明
  11. bzoj2339: [HNOI2011]卡农
  12. 华为鸿蒙生态伙伴,华为鸿蒙生态加速 市场相关板块再度活跃
  13. OTC场外交易平台源码/虚拟场外交易源码
  14. 统一认证 ldap mysql_LDAP简述及统一认证说明
  15. 非对称密钥/对称密钥加解密工具
  16. Telink TLSR9213 使用JTag方式不能正确连接,烧写失败的问题
  17. HbuilderX开发App调用手机支付宝支付
  18. oracle快照点,Oracle快照(snapshot)管理
  19. Grand Prix of Saratov - D. Elevator - DP
  20. 出版java类的书籍需要多少钱,出版一本书需要花费多少资金?

热门文章

  1. Python轻量级Web框架:Bottle库
  2. 什么是Kubernetes? 一文了解K8s是什么_红帽
  3. TestComplete下载安装
  4. 百度老年搜索:毫无意义
  5. Vue 组件封装之 Tab 切换
  6. 怎样健康的使用计算机,S健康怎么用 三星S健使用图文教程
  7. matlab篮球队需要五名队员,2016年数学建模暑期训练题目
  8. 程序员公司合作保密协议范本
  9. 【Unity】讲解如何在Unity的Inspector面板中用滑动条来控制变量的大小
  10. c语言设计乘车调度,数学建模论文校园公交车调度问题-—本科毕业设计.doc