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

3. Eclipse  vm param

 

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

6.6.3. Java 调试接口(JDI)10

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

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

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

 

 

 

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

7.4. Agent 的劳作进度

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

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.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.5.2. 内存控制和对象得到

内存控制是成套运行态的基本功效。 JVMTI 除了提供最简便易行的内存申请和裁撤之外(那块内存不受 Java 堆管理,开发人士须要活动举行清理工作,不然会招致内存泄漏),也提供了对 Java 堆的操作。众所周知,Java 堆中蕴藏了 Java 的类、对象和骨干项目(Primitive),通过对堆的操作,开发人士可以很简单的搜寻任意的类、对象,甚至足以强行推行垃圾收集工作。 JVMTI 中对 Java 堆的操作尤其,它并未提供一个直接得到的点子(不言而喻,虚拟机对目标的管住并非是哈希表,而是某种树 / 图格局),而是选用一个迭代器(iterater)的章程遍历:

7.5. JVMTI 基本成效

JVMTI 的功能格外丰硕,包括了虚拟机中线程、内存 / 堆 / 栈,类 / 方法 / 变量,事件 / 定时器处理等等 20 多类成效,上面我们介绍一下,并举一些简练列子。

7. 找到源码10

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.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)

 

2. 类似spylite ,firebug3

7.6.3. Java 调试接口(JDI)

JDI(Java Debug Interface)是七个模块中最高层的接口,在大部分的 JDK 中,它是由 Java 语言完毕的。 JDI 由针对前者定义的接口组成,通过它,调试工具开发人员就能通过前端虚拟机上的调试器来远程操控后端虚拟机上被调试程序的运作,JDI 不仅能支持开发人士格式化 JDWP 数据,而且还是可以为 JDWP 数据传输提供队列、缓存等优化服务。从理论上说,开发人士只需利用 JDWP 和 JVMTI 即可辅助跨平台的中远距离调试,不过一贯编写 JDWP 程序费时吃力,而且效用不高。由此按照 Java 的 JDI 层的引入,简化了操作,升高了开发人员开发调试程序的功效。

表 1 计算了两个模块的不一样点:

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

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 总括了多个模块的差距点:

4. Cltr+f12彰显主界面3

7.5. JVMTI 基本功效

JVMTI 的功力极度丰硕,包罗了虚拟机中线程、内存 / 堆 / 栈,类 / 方法 / 变量,事件 / 定时器处理等等 20 多类作用,上边大家介绍一下,并举一些简单易行列子。

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.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.5.1. 事件处理和回调函数

从上文大家了解,使用 JVMTI 一个主导的主意就是设置回调函数,在一些事件时有暴发的时候接触并作出相应的动作。由此这一有些的功力非常基本,当前版本的 JVMTI 提供了很多事件(伊芙nt)的回调,包蕴虚拟机开头化、初始运行、截止,类的加载,方法出入,线程始末等等。假设想对这个事件展开处理,大家必要首先为该事件写一个函数,然后在 jvmti伊芙ntCallbacks 这一个协会中指定相应的函数指针。比如,大家对线程启动感兴趣,并写了一个 HandleThreadStart 函数,那么大家必要在 Agent_OnLoad 函数里进入:

 

6.4. Agent 的办事进度7

6.5.2. 内存控制和目的得到8

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

 

3. Eclipse  vm param

 

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

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

5. Ctrl+鼠标找到控件3

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

透过 JPDA 提供的 API,开发人士可以一本万利灵活的搭建 Java 调试应用程序。 JPDA 首要由三个部分构成:Java 虚拟机工具接口(JVMTI)、Java 调试线协议(JDWP),以及 Java 调试接口(JDI)。

 

 

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

6.5.2. 内存控制和目的获得8

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

6. javaagent的要紧职能如下:

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

· 可以在运行期对已加载类的字节码做更改,但是那种情景下会有众多的范围,后边会详细说 

· 还有其余部分小众的效劳 

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

o 获取具有曾经伊始化过的类(执行过clinit方法,是上面的一个子集) 

o 获取某个对象的大小 

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

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

o 设置某些native方法的前缀,主要在寻找native方法的时候做规则匹配 

 

 

6.6.3. Java 调试接口(JDI)10

3. Eclipse  vm param3

6.1. Java 调试接口的风味4

2. 类似spylite ,firebug

4. Cltr+f12显得主界面3

7.6.3.1.1. 表 1. JPDA 层次比较

模块

层次

编程语言

作用

JVMTI

底层

C

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

JDWP

中介层

C

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

JDI

高层

Java

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

 

6.4.1. 启动7

7.2.1.1.1. 图 2. JPDA 模块层次

当然,开发人员完全可以不选用完全的多少个层次,而是根据其中的某一个层次开发自己的选用。比如您完全可以单独凭借通过 JVMTI 函数开发一个调剂工具,而不拔取 JDWP 和 JDI,只使用自己的简报和下令接口。当然,除非是有卓绝的急需,利用已有的已毕会使你一矢双穿,幸免再度发明轮子。

这多少个模块我们会在后续小说中分头详细介绍,那里我们简要介绍它们的第一作用:

 

6.5. JVMTI 基本功效7

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/

 

6.2. JPDA 组成模块5

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

 

 

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.2.1.1.1. 图 2. JPDA 模块层次

图片 2

本来,开发人士完全可以不行使完全的七个层次,而是基于其中的某一个层次开发协调的使用。比如您完全可以独自凭借通过 JVMTI 函数开发一个调试工具,而不拔取 JDWP 和 JDI,只使用自己的电视发布和下令接口。当然,除非是有独特的需要,利用已有的已毕会使你一箭双雕,防止重复发明轮子。

那多少个模块大家会在此起彼伏小说中分别详细介绍,那里大家简要介绍它们的机要意义:

 

6.3. JVMTI 的简介6

2. 类似spylite ,firebug

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) 

 

 

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

6. javaagent的严重性意义如下:

· 能够在加载class文书从前做阻止,对字节码做修改 

· 能够在运转期对已加载类的字节码做改变,不过那种情景下会有诸多的限定,后边会详细说 

· 还有任何一些小众的功效 

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

o 获取具有曾经开端化过的类(执行过clinit方法,是地点的一个子集) 

o 获取某个对象的大小 

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

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

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

 

 

7.2. JPDA 组成模块

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

2. 类似spylite ,firebug3

6.6. 要害部分9

6.4. Agent 的工作经过7

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 后被彻底取代。

4. Cltr+f12来得主界面

 

5. Ctrl+鼠标找到控件3

7.2. JPDA 组成模块

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

6.5.3. 线程和锁8

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

7.6.3.1.1. 表 1. JPDA 层次相比

 

模块

层次

编程语言

作用

JVMTI

底层

C

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

JDWP

中介层

C

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

JDI

高层

Java

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

 

 

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

 

6.3. JVMTI 的简介6

6.4.1. 启动7

6.2. JPDA 组成模块5

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

7.5.1. 事件处理和回调函数

从上文大家清楚,使用 JVMTI 一个着力的法子就是安装回调函数,在少数事件时有暴发的时候接触并作出相应的动作。因而这一有的的功用分外基本,当前版本的 JVMTI 提供了重重事件(伊芙nt)的回调,包蕴虚拟机初叶化、初始运行、为止,类的加载,方法出入,线程始末等等。假设想对那么些事件开展处理,我们须要首先为该事件写一个函数,然后在 jvmti伊芙ntCallbacks 那几个社团中指定相应的函数指针。比如,我们对线程启动感兴趣,并写了一个 HandleThreadStart 函数,那么我们需求在 Agent_OnLoad 函数里进入:

 

6.5.4. 调剂成效9

7.5.4. 调节成效

调节功效是 JVMTI 的基本作用之一,那关键不外乎了安装断点、调试(step)等,在 JVMTI 里面,设置断点的 API 本身很简短:

jvmtiError SetBreakpoint(jvmtiEnv* env, 

    jmethodID method, 

    jlocation location)

 

7.4. Agent 的工作经过

7.6. 要害部分

6.5.3. 线程和锁8

3. Eclipse  vm param3

6.1. Java 调试接口的特征4

6.5.4. 调节功能9

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

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

6.6. 主要部分9

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.2. 内存控制和对象得到

内存控制是全体运行态的基本作用。 JVMTI 除了提供最简便的内存申请和注销之外(那块内存不受 Java 堆管理,开发人士要求活动开展清理工作,不然会导致内存泄漏),也提供了对 Java 堆的操作。众所周知,Java 堆中贮存了 Java 的类、对象和着力类型(Primitive),通过对堆的操作,开发人士可以很不难的物色任意的类、对象,甚至可以强行推行垃圾收集工作。 JVMTI 中对 Java 堆的操作极度,它从未提供一个一贯拿走的主意(不问可知,虚拟机对目标的治本并非是哈希表,而是某种树 / 图方式),而是利用一个迭代器(iterater)的措施遍历:

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 这么些标准,大家可以从虚拟机中获取大家所急需的新闻,达成大家所企盼的操作,更好地付出大家的次第。

 

 

4. Cltr+f12显得主界面

 

6.5. JVMTI 基本作用7

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

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.6. 紧要部分

 

相关文章