发展历史Atitit.获取swing ui 按钮控件的id 与名 与JPDA 调试体系

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 提供了诸多事变(Event)的回调,包括虚拟机初始化、开始运行、结束,类的加载,方法出入,线程始末等等。如果想对这些事件开展拍卖,我们用首先为该事件写一个函数,然后以 jvmtiEventCallbacks 这个布局面临指定相应的函数指针。比如,我们针对线程启动感兴趣,并形容了一个 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

 

发表评论

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