引入:

上文提到了JDI的Mirror机制,把整个目标虚拟机上的所有数据、类型、域、方法、事件、状态和资源,以及调试器发向目标虚拟机的事件请求等都映射成Mirror 对象。这里进一步讨论JDI的链接模块。

分析:

连接模块其主要目的是提供调试器(Debugger)到目标虚拟机(Target VM)之间的交互通道。

从连接的发起方来看:连接的发起方可以是调试器,也可以是目标虚拟机。

从连接的数量来看,一个调试器可以连接多个目标VM, 但是一个目标VM只可以连接一个调试器。

我们从调试器(Debugger)的角度,可以把连接分为主动连接和被动连接。

分类1:主动连接 (它表示调试器主动去连接Target VM)

又分两种情况:

a. 当Target VM还没启动时,则使用LaunchingConnector这种形式的连接器,它会启动目标VM并连接。

Step 1: 调试器调用 VirtualMachineManager 的 launchingConnectors()方法获取所有的LaunchingConnector的实例。

public List<LaunchingConnector> launchingConnectors(){ArrayList list = new ArrayList(2);list.add(new SocketLaunchingConnectorImpl(this));list.add(new SocketRawLaunchingConnectorImpl(this));return list;}

Step 2:根据传输方式或其他特征选择一个LaunchingConnector,调用其 launch() 方法启动并且连接目标虚拟机 。启动后,返回目标虚拟机的实例。

比如说,如果选用SocketLaunchingConnectorImpl,则它的launch()方法如下:

public VirtualMachine launch(Map<String, ? extends Connector.Argument> connectionArgs)throws IOException, IllegalConnectorArgumentsException, VMStartException{getConnectionArguments(connectionArgs);SocketListeningConnectorImpl listenConnector = new SocketListeningConnectorImpl(virtualMachineManager());Map args = listenConnector.defaultArguments();((Connector.IntegerArgument)args.get("timeout")).setValue(10000);String address = listenConnector.startListening(args);String slash = System.getProperty("file.separator");String execString = this.fHome + slash + "bin" + slash + this.fLauncher;execString = execString + " -Xdebug -Xnoagent -Djava.compiler=NONE";execString = execString + " -Xrunjdwp:transport=dt_socket,address=" + address + ",server=n,suspend=" + (this.fSuspend ? "y" : "n");if (this.fOptions != null) {execString = execString + " " + this.fOptions;}execString = execString + " " + this.fMain;String[] cmdLine = DebugPlugin.parseArguments(execString);Process proc = Runtime.getRuntime().exec(cmdLine);try{virtualMachine = (VirtualMachineImpl)listenConnector.accept(args);}catch (InterruptedIOException localInterruptedIOException){VirtualMachineImpl virtualMachine;proc.destroy();String message = NLS.bind(ConnectMessages.SocketLaunchingConnectorImpl_VM_did_not_connect_within_given_time___0__ms_1, new String[] { ((Connector.IntegerArgument)args.get("timeout")).value() });throw new VMStartException(message, proc);}VirtualMachineImpl virtualMachine;virtualMachine.setLaunchedProcess(proc);return virtualMachine;}

b.当Target VM已经启动时,则使用AttachingConnector这种形式的连接器,它会挂接到目标虚拟机上。

前提是,Target VM必须以以下方式启动  -agentlib:jdwp=transport=xxx,server=y 参数启动,并根据传输方式生成监听地址。

Step1:调试器启动,调用 VirtualMachineManager 的 attachingConnectors()  方法获取所有的AttachingConnector的实例。

 public List<AttachingConnector> attachingConnectors(){ArrayList list = new ArrayList(1);list.add(new SocketAttachingConnectorImpl(this));return list;

Step 2: 根据目标虚拟机采用的传输方式选择一个AttachingConnector,调用其 attach() 方法挂接到目标虚拟机上。完成连接后,返回目标虚拟机的实例。

 public VirtualMachine attach(Map<String, ? extends Connector.Argument> connectionArgs)throws IOException, IllegalConnectorArgumentsException{getConnectionArguments(connectionArgs);Connection connection = null;try {connection = ((SocketTransportImpl)this.fTransport).attach(this.fHostname, this.fPort, this.fTimeout, 0L);} catch (IllegalArgumentException e) {List args = new ArrayList();args.add("hostname");args.add("port");throw new IllegalConnectorArgumentsException(e.getMessage(), args);}return establishedConnection(connection);}

分类2:被动连接(它表示Debugger被动地等待或者监听由Target VM发起的连接)

前提是,Target VM必须以以下方式启动  -agentlib:jdwp=transport=xxx,address=yyy 参数启动,并根据传输方式生成监听地址。

Step 1:调试器通过 VirtualMachineManager 的 listeningConnectors() 方法获取所有的ListeningConnector实例。

 public List<ListeningConnector> listeningConnectors(){ArrayList list = new ArrayList(1);list.add(new SocketListeningConnectorImpl(this));return list;}

Step 2:调用ListeningConnector的 startListening() 方法让连接器进入监听状态。通过 accept() 方法通知连接器开始等待正确的入站链接,该方法将返回调试器正在监听的地址描述符;目标虚拟机会自动地 attach 到调试器上建立连接,然后返回目标虚拟机的实例。

 public String startListening(Map<String, ? extends Connector.Argument> connectionArgs)throws IOException, IllegalConnectorArgumentsException{getConnectionArguments(connectionArgs);String result = null;try {result = ((SocketTransportImpl)this.fTransport).startListening(this.fPort);} catch (IllegalArgumentException localIllegalArgumentException) {throw new IllegalConnectorArgumentsException(ConnectMessages.SocketListeningConnectorImpl_ListeningConnector_Socket_Port, "port");}return result;}

转载于:https://blog.51cto.com/supercharles888/1588011

JPDA 架构研究19 - JDI的连接模块相关推荐

  1. JPDA 架构研究5 - Agent利用环境指针访问VM (内存管理篇)

    引入: 我们在前面说到JVMTI的客户端Agent,又提到Agent通过环境指针来访问VM.这里就来看看环境指针到底有多大的访问VM的能力. 分类1:内存管理 a.Allocate. 分配内存 jvm ...

  2. JPDA 架构研究14 - Agent利用环境指针访问VM(对象管理篇)

    引入: 上文讨论了Agent如何利用环境指针访问VM(管理类),这里讨论如何管理对象. 分类9:对象管理 a.GetObjectSize.  获取对象的大小, jvmtiError GetObject ...

  3. 数字图书馆系统架构研究评述

    [题]数字图书馆系统架构研究评述 [作者]侯三军.严明 [出处]<数字图书馆论坛>2011年9期 摘要:软件系统架构设计处于软件系统开发的早期,是系统开发的重要组成部分.是否有一个稳定的软 ...

  4. 架构,框架,模式,模块、组件、插件的含义和区别

    架构.框架.模式.模块.组件.插件.控件.中间件的含义和区别.经常看到这些概念,但是有些含糊,花点儿功夫整理一下,结果还是有些地方理解的不透彻,先将整理的内容写下来,以供交流.左侧英文栏中有些单词被分 ...

  5. 城市地下综合管廊安全运营与智慧管控的分层架构研究

    安科瑞 李亚俊 1.引言 1833年,市政管线综合管廊在巴黎城市地下建成至今,经过百年来的探索.研究.改良和实践,法国.英国.德国.俄罗斯.日本.美国等发达国家的管廊规划建设与安全运维体系已经日臻完善 ...

  6. (19)System Verilog模块设计示例

    (19)System Verilog模块设计示例 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog模块设计示例 5)结语 1.2 FPG ...

  7. 通信、网络、计算融合的天地一体化信息网络体系架构研究

    摘要 随着人类活动范围从大陆向海洋.太空的不断扩展,世界各国纷纷开始布局全球无缝覆盖.连接无处不在的天地一体化信息网络建设.天地一体化信息网络是天基网络与地面网络的深度融合,不是简单的地面向空间的拓展 ...

  8. Nginx源码研究之nginx限流模块详解

    这篇文章主要介绍了Nginx源码研究之nginx限流模块详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 高并发系统有三把利器:缓存.降级和限流: 限流的目的是通过对并 ...

  9. 企业架构研究总结(24)——TOGAF架构开发方法(ADM)之机会及解决方案阶段

    企业架构研究总结(24)--TOGAF架构开发方法(ADM)之机会及解决方案阶段 参考文章: (1)企业架构研究总结(24)--TOGAF架构开发方法(ADM)之机会及解决方案阶段 (2)https: ...

  10. 设计一个高性能三维渲染服务器,第一人称视角三维实景漫游系统渲染流水线架构研究.pdf...

    文档介绍: 同济大学 硕士学位论文 第一人称视角三维实景漫游系统渲染流水线架构研究 姓名:张岩 申请学位级别:硕士 专业:结构工程 指导教师:谢步瀛 20040301 关键词摘要计算机辅助三维实景漫游 ...

最新文章

  1. Selenium3自动化测试——8.定位一组元素
  2. WF,WPF,Silverlight的DependencyProperty 附加属性
  3. guava中 graphs 六
  4. 图解Oracle RMAN备份入门
  5. ajax error 400 4,jquery - ajax error 400 bad request - Stack Overflow
  6. 从身体扮演到身份确认:谈谈EMI的人体自拍作品
  7. 聚合项目访问后台接口失败_聚合支付系统和免签支付系统对未来支付市场有哪些影响...
  8. java多客户端请求响应_Java实现服务器端对多个客户端请求响应
  9. 第一周冲刺第二天博客
  10. knn算法java版_KNN算法的实现详解
  11. .htaccess更改目录下的默认主页
  12. docker搭建upload-labs
  13. 【数学建模笔记 22】数学建模的模糊数学模型
  14. 微信淘宝客机器人分享
  15. 深圳自己做网站 服务器,深圳自己做网站 服务器
  16. 下拉列表支持拼音简拼、全拼、汉字搜索。
  17. oracle hot patch david,Hotpatch文件介绍
  18. C语言中lwr是谁的缩写,C语言中关于字符串的操作(转)
  19. 宏文件下载_EPLAN~宏资源获取
  20. linux ln命令详解

热门文章

  1. 推荐一本好书《应用框架的设计与实现 .NET平台》电子工业出版社
  2. H264 视频文件 帧格式
  3. Linux--内核Uevent事件机制 与 Input子系统
  4. 平滑阴影blender_【Blender笔记】简单的创建一个平平无奇的石头
  5. 动画演示Sunday字符串匹配算法——比KMP算法快七倍!极易理解!
  6. 字符串函数---atof()函数详解及实现
  7. java axis2 开发webservice_一、Axis2 WebService开发准备工作
  8. android tab 选中变色,Android 底部导航栏的Tab选中不变色?
  9. imu 里程计融合_多传感器融合 RLINS概述
  10. nfc卡模式与标准模式_马苏开启年后减肥模式,素颜自拍打卡,皮肤光滑香汗淋漓惹人注目...