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

发布时间:2018-10-22  栏目:w88优德官网电脑版  评论:0 Comments

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://blog.csdn.net/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+鼠标找到控件

 

 

 

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 模块层次

自,开发人员完全好无以完全的老三独层次,而是根据其中的有一个层次开发好的应用。比如您了可只有依靠通过 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

留下评论