JDI 架构研究21 - JDI的Debugger的UI部分

引入:

前面揭示了JDI的Debugger如何建立连接,发送和处理请求,这里我们专注于人机交互部分,Debugger的UI,它主要负责如何把人发出的操作转为请求,以及把请求操作反映在调试器的界面上。

分析:

这个插件主要都定义在org.eclipse.jdt.debug.ui_<Version>.jar中的plugin.xml中,它提供了各种人机交互的插件功能。打的比方,我们看编辑器功能:

<extension
         point="org.eclipse.ui.editorActions">
      <editorContribution
            targetID="org.eclipse.jdt.ui.CompilationUnitEditor"
            id="org.eclipse.jdt.debug.CompilationUnitEditor.BreakpointRulerActions">
         <action
               label="%AddBreakpoint.label"
               class="org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
               actionID="RulerDoubleClick"
               id="org.eclipse.jdt.debug.ui.actions.ManageBreakpointRulerAction">
         </action>
      </editorContribution>
      <editorContribution
            targetID="org.eclipse.jdt.ui.ClassFileEditor"
            id="org.eclipse.jdt.debug.ClassFileEditor.BreakpointRulerActions">
         <action
               label="%AddBreakpoint.label"
               class="org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
               actionID="RulerDoubleClick"
               id="org.eclipse.jdt.debug.ui.actions.ManageBreakpointRulerAction">
         </action>
      </editorContribution>
      <editorContribution
            targetID="org.eclipse.jdt.debug.ui.SnippetEditor"
            id="org.eclipse.jdt.debug.ui.JavaSnippetToolbarActions">
         <action
               toolbarPath="evaluationGroup"
               id="org.eclipse.jdt.debug.ui.SnippetExecute"
               hoverIcon="$nl$/icons/full/etool16/run_sbook.gif"
               class="org.eclipse.jdt.internal.debug.ui.actions.ExecuteAction"
               disabledIcon="$nl$/icons/full/dtool16/run_sbook.gif"
               enablesFor="+"
               icon="$nl$/icons/full/etool16/run_sbook.gif"
               helpContextId="execute_action_context"
               label="%Execute.label"
               tooltip="%Execute.tooltip">
            <selection
                  class="org.eclipse.jface.text.ITextSelection">
            </selection>
         </action>
         <action
               toolbarPath="evaluationGroup"
               id="org.eclipse.jdt.debug.ui.SnippetDisplay"
               hoverIcon="$nl$/icons/full/etool16/disp_sbook.gif"
               class="org.eclipse.jdt.internal.debug.ui.actions.PopupDisplayAction"
               disabledIcon="$nl$/icons/full/dtool16/disp_sbook.gif"
               enablesFor="+"
               icon="$nl$/icons/full/etool16/disp_sbook.gif"
               helpContextId="display_action_context"
               label="%Display.label"
               tooltip="%Display.tooltip">
            <selection
                  class="org.eclipse.jface.text.ITextSelection">
            </selection>
         </action>
         <action
               toolbarPath="evaluationGroup"
               id="org.eclipse.jdt.debug.ui.SnippetInspect"
               hoverIcon="$nl$/icons/full/etool16/insp_sbook.gif"
               class="org.eclipse.jdt.internal.debug.ui.actions.PopupInspectAction"
               disabledIcon="$nl$/icons/full/dtool16/insp_sbook.gif"
               enablesFor="+"
               icon="$nl$/icons/full/etool16/insp_sbook.gif"
               helpContextId="inspect_action_context"
               label="%Inspect.label"
               tooltip="%Inspect.tooltip">
            <selection
                  class="org.eclipse.jface.text.ITextSelection">
            </selection>
         </action>
      </editorContribution>
   </extension>

从这里看出,它支持好几个操作:如CompilationUnitEditor的打断点 ,ClassFileEditor的打断点等。

每个操作都有用到的图标,用到的action响应类等,有兴趣的可以看下。

时间: 2024-10-13 15:45:28

JDI 架构研究21 - JDI的Debugger的UI部分的相关文章

JPDA 架构研究20 - JDI的事件请求和处理模块

引入: 上文主要讲解了JDI的连接模块来建立Debugger到Target VM之间的连接,这里主要讲解事件请求和处理模块.它们都在com.sun.jdi.event和com.sun.jdi.request包中. 分析: Part 1:查看JDI中定义的事件类型 JDI中事件的接口叫Event . public abstract interface Event extends Mirror {   public abstract EventRequest request(); } 它定义了18种

JPDA 架构研究17 - JDI概览

引入: 前面用了很多篇幅来讨论JVMTI和JDWP部分,现在终于来看最靠近用户端部分了,JDI. 分析: a. JDI的基础知识 和JVMTI和JDWP不一样的是,JDI提供了一组接口,这些接口是纯JAVA编写的.他们主要是给开发环境IDE用的,虽然调试器的实现可以直接利用JDWP或者JVMTI,但是多了这一层则可以从用户的代码级别来定义要发送的请求和获取的信息. 本质上,Eclipse的调试器与目标VM之间的双向通信如下: 调试器将用户的操作转化为调试命令,命令通过链接被发送到前端运行目标程序

JPDA 架构研究19 - JDI的连接模块

引入: 上文提到了JDI的Mirror机制,把整个目标虚拟机上的所有数据.类型.域.方法.事件.状态和资源,以及调试器发向目标虚拟机的事件请求等都映射成Mirror 对象.这里进一步讨论JDI的链接模块. 分析: 连接模块其主要目的是提供调试器(Debugger)到目标虚拟机(Target VM)之间的交互通道. 从连接的发起方来看:连接的发起方可以是调试器,也可以是目标虚拟机. 从连接的数量来看,一个调试器可以连接多个目标VM, 但是一个目标VM只可以连接一个调试器. 我们从调试器(Debug

JPDA 架构研究18 - JDI的Mirror机制

引入: 上篇文章从整体上来看待JDI协议,这里结合Eclipse的实现代码来讨论下JDI的Mirror机制. 分析: 镜像机制是将目标虚拟机上的所有数据.类型.域.方法.事件.状态和资源,以及调试器发向目标虚拟机的事件请求等都映射成 Mirror 对象.其思想和我们经常说的O/R Mapping一样,其主要思想就是把2个异构的系统中的事物统一起来. Mirror接口是JDI规范中定义的主接口,它位于com.sun.jdi包中: public abstract interface Mirror {

JPDA 架构研究1- 整体架构

引入: 关于JPDA(Java Platform Debugger Architecture) 网上有很多讲解,例子.我也不重复发明轮子了,这组文章主要从实践的代码分析角度,仔细剖析这个平台的特点,以及这其中的一些问题澄清和误区. 实践: 如果我们从利用Java Remote Debug的功能来看待JPDA ,并且使用socket的通信方式的话,那么整个过程应该如下: 首先,你在要被调试的服务器上开启远程调试功能.以tomcat 为例: 你要么用命令catalina jpda start,它会启

JPDA 架构研究3 - JDWP层的数据包

引入: 现在我们来看JDWP层的数据包.源码在JDK中很容易找到,它定义$JAVA_HOME/include/jdwpTransport.h 头文件中. 分析: Part 1: 握手过程 (handshake ) 握手包发生在Debugger(JDI端)和Target VM(JVMTI端)的传输层连接建立,并且在发送任何实际数据报之前完成的.它过程如下: a. Debugger会发送14个字节的握手请求到Target VM,这个包的内容是14字节的ASCII字符串 "JDWP-Handshake

JPDA 架构研究2 - JDWP代理

引入: 我们先从最重要的通信层讲起.通信层(JDWP) ,它的全称是Java Debug Wire Protocol.从"Wire"这词就可以看出,它主要是起到"连线"的作用,也就是说,它主要是起到把最靠近程序员的JDI(也就是调试器)和最靠近运行在虚拟机中的程序的JVMTI 连接在一起.因为彼此之间语言不通.比如说JDI这层,我们主要用的eclipse,它是JAVA语言编写的.而JVMTI是用来查询虚拟机状态的,而JAVA虚拟机是用C/C++写的,所以在语言不通的

即时通讯架构研究

1    系统架构 1.1 概述 即时通讯:允许两人或多人跨多样网络即时传递文字.档案.语音和视频交流的终端服务. 1.2 逻辑架构 即时通讯软件的主要功能有: 即时会话:两人或多人之间,文字.视音频的交流,包括在线消息与离线消息的发送接收,耳机.话筒音量的控制等. 组织机构:包括部门.用户.群组等级别的管理,好友列表的增删与维护,个性化名片.图标的定制与修改等. 文件目录:在线文件传输.目录共享以及离线文件存储与下载:协同浏览.播放以及远程共享等. 注册登录:注册管理,用户的登录与退出记录,消

JPDA 架构研究4 - JDWP的传输接口

引入: 上一篇文章主要分析JDWP层传输的数据包的格式,这篇文章我们主要关注于JDWP层是如何传输的. 分析: 传输的具体实现是根据各个JVM自己实现,但是他们有个共同点就是都是用C/C++实现的,并且都实现了jdwpTransport.h (和上篇一样的这个文件).实现根据我们的知识可以得知是以dll文件(或者Unix平台下是so文件)的形式存在.因为我们从前面了解到,JDWP层有Agent负责在数据包和JVMTI的函数调用之间转换,所以顺理成章知道,传输层的DLL文件也必定会有一个onloa