调剂类别

Atitit.获取swing ui 按钮控件的id 与名字 与JPDA 调试体系

 

1. Swing Inspector是一个Java Swing/AWT用户界面分析和调节工具,效用与firebug类似,2

2. 类似spylite ,firebug3

3. Eclipse  vm param3

4. Cltr+f12来得主界面3

5. Ctrl+鼠标找到控件3

6. JPDA(Java Platform Debugger Architecture)是 Java 平台调试系列布局的缩写。4

6.1. Java 调试接口的特点4

6.2. JPDA 组成模块5

6.3. JVMTI 的简介6

6.4. Agent 的行事过程7

6.4.1. 启动7

6.5. JVMTI 基本效用7

6.5.1. 事件处理和回调函数7

6.5.2. 内存控制和对象拿到8

6.5.3. 线程和锁8

6.5.4. 调剂效率9

6.6. 重大部分9

6.6.1. Java 虚拟机工具接口(JVMTI)9

6.6.2. Java 调试线协议(JDWP)9

6.6.3. Java 调试接口(JDI)10

7. 找到源码10

 

1. Swing Inspector是一个Java Swing/AWT用户界面分析和调节工具,效用与firebug类似,

具备强大的Swing/AWT用户界面分析和调试相关职能。 适用于从java swing初级到高级的具备开发人士,可以高效定位问题,UI急迅调试,分析其他软件界面的实现原理,能够给开发工作功能带来大幅升级。

特点:

1. 具备UI组件联动效应,在用户界面中Ctrl+移动鼠标(Mac OSX ⌘+F12),可以在Swing Inspector主界面中显示对应组件音信,并高亮当前Component。

2. 足以在Swing Inspector组件树中联动到用户界面,即双向联动,且不需要提供界面的源代码。

3. Applet扶助,可以一定嵌入到其它网页中的applet界面。

4. 强劲的window捕获效用,可以捕获加载agent的jvm创立的所有Swing/AWT窗口(网页中的applet,浏览器加载appet/webstart后启动的console窗口),形式对话框等。

5. 红色,无需安装,只需给java命令添加一行参数,即可启动Swing Inspector。

6. 支撑所有的AWT/Swing程序,netbeans、visualvm等。

7. 有力的表明式补助,允许对选定组进执行表明式运算,实时展现总结结果,运算结果辅助属性浏览和编排。

8. 精锐的Javascript援助功能,援助用javascript实时修改用户界面中的组件,执行脚本后随即生效。

9. 高性能,焦点效能应用c/c++实现,间接操纵jvm,对性能影响很小,主界面选用lazy机制,刷新组件时只更新可见viewer。属性编辑器可一直改动选定的机件属性,且直接生效。

10. 足以记录组件添加到parent时的stacktrace,可以连忙稳定到相应的代码行。

11. 简单易用,赶快键与常用软件一致(F5刷新、Alt+Left后退,Alt+Right前进等),界面非凡简单、直观,没有读书成本。

12. 免费,为软件行业发展尽一份力量是大家的宏旨

 

 

笔者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注脚来源: http://www.cnblogs.com/attilax/

 

2. 类似spylite ,firebug

3. Eclipse  vm param

 

-agentpath:E:\swing-inspector-windows-1.2.2_beta7\Win32\swing-inspector-agent.dll

4. Cltr+f12展现主界面

 

5. Ctrl+鼠标找到控件

 

 

发展历史 1 

Create StackTrace – javax.swing.JLabel@7293796
    com.openbravo.pos.sales.JPanelTicket.initComponents(JPanelTicket.java:1226)
    com.openbravo.pos.sales.JPanelTicket.(JPanelTicket.java:187)
    com.openbravo.pos.sales.JPanelTicketSales.(JPanelTicketSales.java:18)
    aaaAtiDslParser.aaa33.main(aaa33.java:29

 

 

6. javaagent的关键效率如下:

· 可以在加载class文书往日做阻止,对字节码做修改 

· 可以在运转期对已加载类的字节码做改变,不过那种状况下会有不少的界定,后边会详细说 

· 还有任何部分小众的效益 

o 获取具有曾经加载过的类 

o 获取具有曾经最先化过的类(执行过clinit方法,是下边的一个子集) 

o 获取某个对象的大小 

o 将某个jar参与到bootstrap classpath里当作高优先级被bootstrapClassloader加载 

o 将某个jar加入到classpath里供AppClassloard去加载 

o 设置某些native方法的前缀,紧要在搜索native方法的时候做规则匹配 

 

 

7. JPDA(Java Platform Debugger Architecture)是 Java 平台调试系列布局的缩写。

经过 JPDA 提供的 API,开发人士可以便宜灵活的搭建 Java 调试应用程序。 JPDA 紧要由两个部分组成:Java 虚拟机工具接口(JVMTI)、Java 调试线协议(JDWP),以及 Java 调试接口(JDI)。

 

 

7.1. Java 调试接口的性状

Java 语言是第一个利用虚拟机概念的流行的编程语言,正是因为虚拟机的留存,使成千上万事务变得简单而轻松,领会了虚拟机,就领会了内存分配、线程管理、即时优化等等运行态。同样的,Java 调试的原形,就是和虚拟机打交道,通过操作虚拟机来达到观察调试大家团结代码的指标。那一个特性决定了 Java 调试接口和以前其他编程语言的顶天立地区别。

以 C/C++ 的调节为例,近年来可比流行的调试工具是 GDB 和微软的 Visual Studio 自带的 debugger,在这种 debugger 中,首先,大家亟须编译一个“ debug ”形式的先后,这么些会比其实的 release 情势先后大过多。其次,在调节过程中,debugger 将会深层接入程序的周转,领悟和控制运行态的部分消息,并将这一个音信及时回到。这种加入对运作的功能和内存占用都有自然的要求。基于这么些要求,那个 Debugger 本身其实是提供了,或者说,创立和保管了一个运行态,因而他们的次序算法相比较复杂,个头都相比大。对于远端的调试,GDB 也尚未很好的默认实现,当然,C/C++ 在这地点也并未特意大的需要。

 

 

而 Java 则不同,由于 Java 的运行态已经被虚拟机所很好地管理,由此作为 Java 的 Debugger 无需再自己成立一个可控的运行态,而单独需要去操作虚拟机就足以了。 Java 的 JPDA 就是一套为调试和优化服务的虚拟机的操作工具,其中,JVMTI 是整合在虚拟机中的接口,JDWP 是一个通讯层,而 JDI 是前者为开发人士准备好的工具和运行库。

从构架上说,大家得以把 JPDA 看作成是一个 C/S 系列布局的施用,在这些构架下,咱们得以便宜地经过网络,在肆意的地点调试此外一个虚拟机上的程序,这一个就很好地解决了部署和测试的题材,尤其满足解决了重重网络时代中的开发使用的需求。前端和后端的诀别,也便于用户支付适合于自己的调剂工具。

从效用上看,由于 Java 程序本身就是编译成字节码,运行在虚拟机上的,因而调试前后的次第、内存占用都不会有大变迁(仅仅是开行一个 JDWP 所急需的内存),任意档次都得以很好地调试,异常便利。而 JPDA 构架下的多少个组成部分,JDWP 和 JDI 都相比较小,紧要的工作可以让虚拟机自己完成。

从灵活性上,Java 调试工具是建立在强硬的虚拟机上的,由此,很多前敌的行使,比如动态编译运行,字节码的实时替换等等,都能够因此对虚拟机的精益求精而取得实现。随着虚拟机技术的逐步发展和深刻,各样不同连串,不同应用领域中虚拟机的出现,各个强大的效应的投入,给大家的调节工具也带动许多新的施用。

不言而喻,一个先天性的,可控的运行态给 Java 的调节工作,给 Java 调试接口带来了庞然大物的优势和方便。通过 JPDA 这多少个正式,我们可以从虚拟机中收获我们所急需的信息,完成我们所企盼的操作,更好地付出大家的次序。

 

7.2. JPDA 组成模块

JPDA 定义了一个完完全全独立的系统,它由三个相对独立的层系共同构成,而且确定了它们三者之间的交互模式,或者说定义了它们通信的接口。这多少个层次由低到高分别是 Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP)以及 Java 调试接口(JDI)。这两个模块把调试过程分解成多少个很当然的定义:调试者(debugger)和被调试者(debuggee),以及她们当中的通信器。被调试者运行于我们想调试的 Java 虚拟机之上,它可以经过 JVMTI 这一个标准接口,监控当前虚拟机的音讯;调试者定义了用户可拔取的调节接口,通过这么些接口,用户可以对被调剂虚拟机发送调试命令,同时调试者接受并显示调试结果。在调试者和被调剂着之间,调试命令和调节结果,都是透过 JDWP 的报导协议传输的。所有的命令被封装成 JDWP 命令包,通过传输层发送给被调试者,被调试者接收到 JDWP 命令包后,解析这么些命令并转化为 JVMTI 的调用,在被调试者上运行。类似的,JVMTI 的周转结果,被格式化成 JDWP 数据包,发送给调试者并赶回给 JDI 调用。而调试器开发人士就是通过 JDI 拿到数码,发出指令。图 2 出示了这些过程:

7.2.1.1.1. 图 2. JPDA 模块层次

发展历史 2

自然,开发人士完全可以不利用完整的多少个层次,而是基于其中的某一个层次开发协调的施用。比如你完全可以独自凭借通过 JVMTI 函数开发一个调剂工具,而不使用 JDWP 和 JDI,只利用自己的报导和指令接口。当然,除非是有新鲜的需要,利用已部分实现会使您事半功倍,防止重复发明轮子。

那两个模块我们会在后续文章中分别详细介绍,这里大家简要介绍它们的最首要成效:

 

7.3. JVMTI 的简介

JVMTI(JVM Tool Interface)是 Java 虚拟机所提供的 native 编程接口,是 JVMPI(Java Virtual Machine Profiler Interface)和 JVMDI(Java Virtual Machine Debug Interface)的换代版本。从这些 API 的进化历史轨迹中我们就足以清楚,JVMTI 提供了可用来 debug 和 profiler 的接口;同时,在 Java 5/6 中,虚拟机接口也平添了监听(Monitoring),线程分析(Thread analysis)以及覆盖率分析(Coverage Analysis)等效能。正是出于 JVMTI 的雄强功能,它是兑现 Java 调试器,以及其余 Java 运行态测试与分析工具的功底。

JVMTI 并不一定在具备的 Java 虚拟机上都有落实,不同的虚拟机的兑现也不尽相同。不过在有些主流的虚拟机中,比如 Sun 和 IBM,以及部分开源的如 Apache Harmony DRLVM 中,都提供了专业 JVMTI 实现。

JVMTI 是一套本地代码接口,由此接纳 JVMTI 需要我们与 C/C++ 以及 JNI 打交道。事实上,开发时相似采纳建立一个 Agent 的主意来利用 JVMTI,它应用 JVMTI 函数,设置有些回调函数,并从 Java 虚拟机中拿到当前的运行态消息,并作出自己的判定,最后还可能操作虚拟机的运行态。把 Agent 编译成一个动态链接库之后,大家就足以在 Java 程序启动的时候来加载它(启动加载情势),也得以在 Java 5 之后拔取运行时加载(活动加载情势)。

· -agentlib:agent-lib-name=options

· -agentpath:path-to-agent=options

 

发展历史, 

7.4. Agent 的干活历程

7.4.1. 启动

Agent 是在 Java 虚拟机启动之时加载的,这些加载处于虚拟机初叶化的早期,在这一个时辰点上:

· 所有的 Java 类都未被先河化;

· 所有的对象实例都未被创设;

· 因此,没有任何 Java 代码被执行;

但在这么些时候,我们早就足以:

· 操作 JVMTI 的 Capability 参数;

· 使用系统参数;

动态库被加载之后,虚拟机会先物色一个 Agent 入口函数:

JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved)

在这多少个函数中,虚拟机传入了一个 JavaVM 指针,以及命令行的参数。通过 JavaVM,我们可以取得 JVMTI 的指针,并获取 JVMTI 函数的应用力量,所有的 JVMTI 函数都经过这多少个 jvmtiEnv 获取,不同的虚拟机实现提供的函数细节或许不一致,然而使用的章程是统一的。

jvmtiEnv *jvmti; 

(*jvm)->GetEnv(jvm, &jvmti, JVMTI_VERSION_

7.5. JVMTI 基本功效

JVMTI 的效果分外充足,包含了虚拟机中线程、内存 / 堆 / 栈,类 / 方法 / 变量,事件 / 定时器处理等等 20 多类效用,上面我们介绍一下,并举一些简单易行列子。

7.5.1. 事件处理和回调函数

从上文我们知晓,使用 JVMTI 一个中央的办法就是安装回调函数,在某些事件暴发的时候接触并作出相应的动作。因而这一部分的效果卓殊基本,当前版本的 JVMTI 提供了过多风波(伊芙(Eve)nt)的回调,包括虚拟机开首化、起先运行、截至,类的加载,方法出入,线程始末等等。如若想对这一个事件举行拍卖,我们需要首先为该事件写一个函数,然后在 jvmti伊夫(Eve)ntCallbacks 这些布局中指定相应的函数指针。比如,大家对线程启动感兴趣,并写了一个 HandleThreadStart 函数,那么我们需要在 Agent_OnLoad 函数里进入:

 

7.5.2. 内存控制和目的拿到

内存控制是漫天运行态的基本效率。 JVMTI 除了提供最简便的内存申请和撤消之外(这块内存不受 Java 堆管理,开发人士需要活动举办清理工作,不然会造成内存泄漏),也提供了对 Java 堆的操作。众所周知,Java 堆中储存了 Java 的类、对象和中坚项目(Primitive),通过对堆的操作,开发人士可以很容易的摸索任意的类、对象,甚至足以强行推行垃圾收集工作。 JVMTI 中对 Java 堆的操作特别,它从不提供一个一贯拿到的方法(总而言之,虚拟机对目的的管制并非是哈希表,而是某种树 / 图形式),而是利用一个迭代器(iterater)的主意遍历:

7.5.3. 线程和锁

线程是 Java 运行态中丰裕重大的一个有的,在 JVMTI 中也提供了成百上千 API 举办相应的操作,包括查询当前线程状态,暂停,苏醒或者极端线程,还是可以对线程锁举办操作。开发者可以拿走一定线程所怀有的锁:

jvmtiError GetOwnedMonitorInfo(jvmtiEnv* env, 

    jthread thread, 

    jint* owned_monitor_count_ptr, 

    jobject** owned_monitors_ptr)

也足以赢得当前线程正在等候的锁:

jvmtiError GetCurrentContendedMonitor(jvmtiEnv* env, 

    jthread thread, 

    jobject* monitor_ptr)

 

7.5.4. 调试效用

调剂功用是 JVMTI 的基本效用之一,这第一概括了设置断点、调试(step)等,在 JVMTI 里面,设置断点的 API 本身很简短:

jvmtiError SetBreakpoint(jvmtiEnv* env, 

    jmethodID method, 

    jlocation location)

 

7.6. 首要部分

7.6.1. Java 虚拟机工具接口(JVMTI)

JVMTI(Java Virtual Machine Tool Interface)即指 Java 虚拟机工具接口,它是一套由虚拟机直接提供的 native 接口,它地处整个 JPDA 系列的最底部,所有调试效用本质上都急需通过 JVMTI 来提供。通过这个接口,开发人士不仅调试在该虚拟机上运行的 Java 程序,还是可以查看它们运行的情景,设置回调函数,控制某些环境变量,从而优化程序性能。我们通晓,JVMTI 的前身是 JVMDI 和 JVMPI,它们原来分别被用于提供调试 Java 程序以及 Java 程序调节性能的效率。在 J2SE 5.0 之后 JDK 取代了 JVMDI 和 JVMPI 这两套接口,JVMDI 在最新的 Java SE 6 中一度不提供支撑,而 JVMPI 也计划在 Java SE 7 后被彻底取代。

7.6.2. Java 调试线协议(JDWP)

JDWP(Java Debug Wire Protocol)是一个为 Java 调试而计划的一个报道交互协议,它定义了调试器和被调试程序之间传递的音信的格式。在 JPDA 体系中,作为前端(front-end)的调试者(debugger)进程和后端(back-end)的被调试程序(debuggee)进程之间的竞相数据的格式就是由 JDWP 来讲述的,它详细完整地定义了请求命令、回应数据和错误代码,保证了前者和后端的 JVMTI 和 JDI 的通信通畅。比如在 Sun 公司提供的贯彻中,它提供了一个名为 jdwp.dll(jdwp.so)的动态链接库文件,那多少个动态库文件落实了一个 Agent,它会担当解析前端发出的请求或者命令,并将其转会为 JVMTI 调用,然后将 JVMTI 函数的重回值封装成 JDWP 数据发还给后端。

另外,这里需要小心的是 JDWP 本身并不包括传输层的落实,传输层需要独自实现,不过 JDWP 包括了和传输层交互的严俊的概念,就是说,JDWP 共商即使不确定我们是透过 EMS 仍然快递运输货物的,可是它规定了我们传递的货品的布置的法子。在 Sun 集团提供的 JDK 中,在传输层上,它提供了 socket 模式,以及在 Windows 上的 shared memory 情势。当然,传输层本身只是就是本机内经过间通信格局和远端通信格局,用户有趣味也足以按 JDWP 的标准自己实现。

7.6.3. Java 调试接口(JDI)

JDI(Java Debug Interface)是两个模块中最高层的接口,在大多数的 JDK 中,它是由 Java 语言实现的。 JDI 由针对前者定义的接口组成,通过它,调试工具开发人士就能经过前端虚拟机上的调试器来远程操控后端虚拟机上被调试程序的运作,JDI 不仅能帮忙开发人士格式化 JDWP 数据,而且还是能为 JDWP 数据传输提供队列、缓存等优化服务。从理论上说,开发人士只需利用 JDWP 和 JVMTI 即可匡助跨平台的长途调试,然而一贯编写 JDWP 程序费时寸步难行,而且效能不高。因而遵照 Java 的 JDI 层的引入,简化了操作,提升了开发人士开发调试程序的频率。

表 1 总括了六个模块的不同点:

7.6.3.1.1. 表 1. JPDA 层次相比较

 

模块

层次

编程语言

作用

JVMTI

底层

C

获取及控制当前虚拟机状态

JDWP

中介层

C

定义 JVMTI 和 JDI 交互的数据格式

JDI

高层

Java

提供 Java API 来远程控制被调试虚拟机

 

 

8. 找到源码

   this.m_jTotalEuros = new JLabel();

    this.m_jLblTotalEuros1 = new JLabel();

this.m_jSubtotalEuros = new JLabel();

 

 

参考

深深 Java 调试体系,第 2 有的  JVMTI 和 Agent 实现.htm

JVMTI开发教程之一个粗略的Agent – 飞鸟Blog – 博客频道 – CSDN.NET.htm

JVM的动态agent机制 在main函数启动之后运行agent – CSDN博客.htm

JVM源码分析之javaagent原理完全解读.htm

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注