设为首页 加入收藏

TOP

Dalvik虚拟机调试监视器
2014-11-24 12:00:17 来源: 作者: 【 】 浏览:0
Tags:Dalvik 虚拟 调试 监视器

CR:


2、协议
为了利用已有的接口,DDM协议建立在JDWP协议之上(CR:piggy-back类似于在卡车后面挂车的意思)(java debug wire protocol,通常运行在vm和调试器之间)。这样,对于一个无DDM的客户端来说,DDM作用其实就像一个调试器。
JDWP协议和我们想要实现的功能很像,特别的:
(1)它允许vender-defined包,因此没有必要改变JDWP细则;
(2)VM可能在任何时间传出事件,这些事件不会导致调试器输出一个响应,这意味着客户端可以传出数据并且立刻继续工作而不需要等待事件响应;
(3)基本的协议是无状态、异步的,调试器端的请求包包含了一串数字,而vm则包含在了响应包中,这就实现了同时同步会话,意味着DDM通信和调试器通信可以交错进行。
下面是我们使用JDWP的一些情形:
(1)VM只等待和调试器的一个连接,因此你不能同时连接监视器和调试器。为此,就要将调试器和监视器连起来然后传输数据(我们目前可以通过jdwpspy传输数据,尽管还需要管理我们需要的ID)。连接了设备之后,通过这种方式比现在的方法(猜测传输端口号)更加方便;
(2)当调试器连接后,VM运行会不一样。它会更慢,任何传向监视器或者调试器的对象都不会产生GC;对此,我们可以通过直到监测到无DDM通信再激活慢路径(CR:slow path,不懂)。另外,我们还希望能产生“调试器已经断开/连接”的信息,从而使VM释放调试相关资源并且不断开连接;
(3)无DDM的vm在DDM连接后不应该出错,事实上三方vm并没有对此保证(例如某种主流vm会立刻崩溃),但是老式的JanVM会拒绝“hello”包。


2.1、建立连接
可以通过两种基本方法:DDM连接vm,vm连接DDM。前者没有后者“精确”,因为你必须扫描客户端,但是它也有自己的优点。
有三种有趣的情形:
(1)DDM开启,然后boot USB连接的设备或者启动模拟器;(DDM,设备)
(2)设备或模拟器在运行DDM之前已经在运行;(设备,DDM)
(3)DDM已经在运行了,当一个已经启动的设备通过USB连接的时候。(DDM,USB连接运行中的设备)
如果设备连接上了已经启动的DDM,我们只要处理情形1;如果DDM在它开启的时候扫描VM,我们只要处理情形2;没有处理情形3,而它可能是随着设备的运行最重要的一支。
因此可以设计一个下拉菜单,它有两个选项:扫描服务器、扫描设备。前者使得DDM扫描“本地主机”(localhost)上的vm,后者使得它查询adb连接另一边的vm。DDM会每隔几秒就扫描vm,或者检测已知vm端口序列(例如8000——8040),或者和设备上的某些数据库交互。改变模式会导致已有的连接中断。
当DDM第一次启动时,它会尝试运行“adb usb”来确保adb可以运行(注意:确保DDM从可以在该路径中运行adb的shell中启动很重要)。如果失败,和设备的交互很可能会等到adb守护进程运行才开始。


2.2、连接调试器
当DDM在所有vm的JWDP端口运行时,通过DDM连接调试器很重要。每个要调试的vm会有一个等待DDM监听的端口,这使得你可以将一个调试器和多个vm同时相连。
更常见的是,程序员只想将一个调试器和一个vm相连。一个端口会被DDM监听(例如8700),然后任何和它相连的东西会被“当前vm”连接(从UI中选择)。这使得程序员可以关注单个应用,而不需要每次重启设备时调整IDE设置以适应不同端口号,如果不是这样,序号就会不停变动。


2.3、包格式
信息以块(chunk)的形式传递,每个块开头如下:
U4 type
U4 length
然后包含了不同数量的特定类型(type)的数据。不识别的类型会导致客户端的空响应,这在DDM会被安静地忽略。(一般是返回ERROR,需要一个ERROR块类型及DDM端的handler)
同样的块类型可能在传递方向不同时有不同的含义,例如,同样的数据类型可能被用在询问和对应的响应上,为了清晰明了,特定的类型必须用在对应的功能上。
上面的包格式对于JDWP框架有些冗余,JDWP框架有4字节的length和2字节的类型码(“命令集”和“命令”,一组命令集用于“vendor-defined命令和扩展”)。
使用块的形式允许潜在传递(underlying transport)的独立性,避免了和JDWP客户端码元的插入集成(intrusive integration),提供了在单个传输单元中发送多个块的方法。(包含多个块的包是可以设计的,这里不讨论)
因为我们可能通过慢的USB连接发送数据,块会被压缩。压缩块也是块类型,但是指明了被压缩,压缩后的长度紧跟其后,最后是原来的块类型和未压缩的长度。例如,zlib的压缩算法而言,块类型是ZLIB。
基于JDWP模型,DDM到客户端的包都会被确认,但从客户端到DDM的包却不会,JDWP错误码码域总是被设为“no error”,因此特定请求未响应的情形一定要被编码到DDM信息中。
所谓的U4,是一个无符号32bit的值,U1是无符号的8bit的值。数据是大印第安序列形式以匹配JDWP。===================================CUT==========================


Dalvik VM
Debug Monitor


Status:Draft (as of March 6, 2007)


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Dalvik虚拟机和一般JAVA虚拟机(J.. 下一篇ARM指令集 VS thumb指令集

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)
·[ Linux运维学习 ] (2025-12-26 02:52:27)
·HTTPS 详解一:附带 (2025-12-26 02:20:37)
·TCP/IP协议到底在讲 (2025-12-26 02:20:34)