Eclipse通过JDWP调试Dalvik
Eclipse发送各种JDWP命令包,DalvikVM收到命令包(command package),响应并发送回复包(reply package),通过缓冲区交换数据
JDWP:调试协议
(一)Android Dalvik实现的JDWP响应:
static const JdwpHandlerMap gHandlerMap[] = {
/* VirtualMachine command set (1) */
{ 1, 1, handleVM_Version, "VirtualMachine.Version" },
{ 1, 2, handleVM_ClassesBySignature,
"VirtualMachine.ClassesBySignature" },
//1, 3, VirtualMachine.AllClasses
{ 1, 4, handleVM_AllThreads, "VirtualMachine.AllThreads" },
{ 1, 5, handleVM_TopLevelThreadGroups,
"VirtualMachine.TopLevelThreadGroups" },
{ 1, 6, handleVM_Dispose, "VirtualMachine.Dispose" },
{ 1, 7, handleVM_IDSizes, "VirtualMachine.IDSizes" },
{ 1, 8, handleVM_Suspend, "VirtualMachine.Suspend" },
{ 1, 9, handleVM_Resume, "VirtualMachine.Resume" },
{ 1, 10, handleVM_Exit, "VirtualMachine.Exit" },
{ 1, 11, handleVM_CreateString, "VirtualMachine.CreateString" },
{ 1, 12, handleVM_Capabilities, "VirtualMachine.Capabilities" },
{ 1, 13, handleVM_ClassPaths, "VirtualMachine.ClassPaths" },
{ 1, 14, HandleVM_DisposeObjects, "VirtualMachine.DisposeObjects" },
//1, 15, HoldEvents
//1, 16, ReleaseEvents
{ 1, 17, handleVM_CapabilitiesNew,
"VirtualMachine.CapabilitiesNew" },
//1, 18, RedefineClasses
//1, 19, SetDefaultStratum
{ 1, 20, handleVM_AllClassesWithGeneric,
"VirtualMachine.AllClassesWithGeneric"},
//1, 21, InstanceCounts
/* ReferenceType command set (2) */
{ 2, 1, handleRT_Signature, "ReferenceType.Signature" },
{ 2, 2, handleRT_ClassLoader, "ReferenceType.ClassLoader" },
{ 2, 3, handleRT_Modifiers, "ReferenceType.Modifiers" },
//2, 4, Fields
//2, 5, Methods
{ 2, 6, handleRT_GetValues, "ReferenceType.GetValues" },
{ 2, 7, handleRT_SourceFile, "ReferenceType.SourceFile" },
//2, 8, NestedTypes
{ 2, 9, handleRT_Status, "ReferenceType.Status" },
{ 2, 10, handleRT_Interfaces, "ReferenceType.Interfaces" },
//2, 11, ClassObject
{ 2, 12, handleRT_SourceDebugExtension,
"ReferenceType.SourceDebugExtension" },
{ 2, 13, handleRT_SignatureWithGeneric,
"ReferenceType.SignatureWithGeneric" },
{ 2, 14, handleRT_FieldsWithGeneric,
"ReferenceType.FieldsWithGeneric" },
{ 2, 15, handleRT_MethodsWithGeneric,
"ReferenceType.MethodsWithGeneric" },
//2, 16, Instances
//2, 17, ClassFileVersion
//2, 18, ConstantPool
/* ClassType command set (3) */
{ 3, 1, handleCT_Superclass, "ClassType.Superclass" },
{ 3, 2, handleCT_SetValues, "ClassType.SetValues" },
{ 3, 3, handleCT_InvokeMethod, "ClassType.InvokeMethod" },
//3, 4, NewInstance
/* ArrayType command set (4) */
//4, 1, NewInstance
/* InterfaceType command set (5) */
/* Method command set (6) */
{ 6, 1, handleM_LineTable, "Method.LineTable" },
//6, 2, VariableTable
//6, 3, Bytecodes
//6, 4, IsObsolete
{ 6, 5, handleM_VariableTableWithGeneric,
"Method.VariableTableWithGeneric" },
/* Field command set (8) */
/* ObjectReference command set (9) */
{ 9, 1, handleOR_ReferenceType, "ObjectReference.ReferenceType" },
{ 9, 2, handleOR_GetValues, "ObjectReference.GetValues" },
{ 9, 3, handleOR_SetValues, "ObjectReference.SetValues" },
//9, 4, (not defined)
//9, 5, MonitorInfo
{ 9, 6, handleOR_InvokeMethod, "ObjectReference.InvokeMethod" },
{ 9, 7, handleOR_DisableCollection,
"ObjectReference.DisableCollection" },
{ 9, 8, handleOR_EnableCollection,
"ObjectReference.EnableCollection" },
{ 9, 9, handleOR_IsCollected, "ObjectReference.IsCollected" },
//9, 10, ReferringObjects
/* StringReference command set (10) */
{ 10, 1, handleSR_Value, "StringReference.Value" },
/* ThreadReference command set (11) */
{ 11, 1, handleTR_Name, "ThreadReference.Name" },
{ 11, 2, handleTR_Suspend, "ThreadReference.Suspend" },
{ 11, 3, handleTR_Resume, "ThreadReference.Resume" },
{ 11, 4, handleTR_Status, "ThreadReference.Status" },
{ 11, 5, handleTR_ThreadGroup, "ThreadReference.ThreadGroup" },
{ 11, 6, handleTR_Frames, "ThreadReference.Frames" },
{ 11, 7, handleTR_FrameCount, "ThreadReference.FrameCount" },
//11, 8, OwnedMonitors
{ 11, 9, handleTR_CurrentContendedMonitor,
"ThreadReference.CurrentContendedMonitor" },
//11, 10, Stop
//11, 11, Interrupt
{ 11, 12, handleTR_SuspendCount, "ThreadReference.SuspendCount" },
//11, 13, OwnedMonitorsStackDepthInfo
//11, 14, ForceEarlyReturn
/* ThreadGroupReference command set (12) */
{ 12, 1, handleTGR_Name, "ThreadGroupReference.Name" },
{ 12, 2, handleTGR_Parent, "ThreadGroupReference.Parent" },
{ 12, 3, handleTGR_Children, "ThreadGroupReference.Children" },
/* ArrayReference command set (13) */
{ 13, 1, handleAR_Length, "ArrayReference.Length" },
{ 13, 2, handleAR_GetValues, "ArrayReference.GetValues" },
{ 13, 3, handleAR_SetValues, "ArrayReference.SetValues" },
/* ClassLoaderReference command set (14) */
{ 14, 1, handleCLR_VisibleClasses,
"ClassLoaderReference.VisibleClasses" },
/* EventRequest command set (15) */
{ 15, 1, handleER_Set, "EventRequest.Set" },
{ 15, 2, handleER_Clear, "EventRequest.Clear" },
//15, 3, ClearAllBreakpoints
/* StackFrame command set (16) */
{ 16, 1, handleSF_GetValues, "StackFrame.GetValues" },
{ 16, 2, handleSF_SetValues, "StackFrame.SetValues" },
{ 16, 3, handleSF_ThisObject, "StackFrame.ThisObject" },
//16, 4, PopFrames
/* ClassObjectReference command set (17) */
{ 17, 1, handleCOR_ReflectedType,"ClassObjectReference.ReflectedType" },
/* Event command set (64) */
//64, 100, Composite <-- sent from VM to debugger, never received by VM
{ 199, 1, handleDDM_Chunk, "DDM.Chunk" },
};
(二)具体的请求和响应:
Eclipse进入debug状态
(1)发送JDWP的ReferenceType.FieldsWithGeneric命令包, dalvik响应调用handleRT_FieldsWithGeneric->dvmDbgOutputAllFields将某个类的所有域信息放入缓冲,Eclipse读取以显示
(2)发送JDWP的ObjectReference.GetValues命令包,dalvik响应调用handleOR_GetValues->dvmDbgGetFieldValue将域值放入缓冲区
Eclipse通过JDWP调试Dalvik相关推荐
- [转载]eclipse的远程调试功能配置
原文地址:eclipse的远程调试功能配置作者:我的 用途:web应用部署并运行于外部(区别于eclipse环境中启动的)应用服务器中,当出现问题时,可以使用eclipse工程的源代码进行跟踪调试. ...
- Java Eclipse进行断点调试
Java Eclipse进行断点调试 如何调试Java程序? 大家最开始学习Java,都会觉得IDE调试好高端有木有,其实很简单了. 下文会尽量简单直观的教会你在Eclipse中调试,其他的IDE调试 ...
- 在没有复杂插件的情况下从Eclipse启动和调试Tomcat
像Eclipse这样的现代IDE提供了各种插件来简化Web开发. 但是,我相信将Tomcat作为"常规" Java应用程序启动仍然可以提供最佳的调试体验. 大多数时候,这是因为这些 ...
- 无需复杂插件即可从Eclipse启动和调试Tomcat
像Eclipse这样的现代IDE提供了各种插件来简化Web开发. 但是,我相信将Tomcat作为"常规" Java应用程序启动仍然可以提供最佳的调试体验. 大多数情况下,这是因为这 ...
- tomcat开发远程调试端口以及利用eclipse进行远程调试
一.tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里: SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compi ...
- Eclipse 真机调试检测不到手机解决方案
Eclipse 真机调试检测不到手机解决方案 参考文章: (1)Eclipse 真机调试检测不到手机解决方案 (2)https://www.cnblogs.com/gamedaybyday/p/753 ...
- 使用Eclipse进行远程调试 外加 ant 直接打包到服务器
今天决定做件有意义的事,写篇图文并茂的blog,为什么要图文并茂?因为很多事可能用语言也说不明白,从以前我发表的一篇文章可以看得出来,http://blog.csdn.net/sunyujia/arc ...
- eclipse进行远程调试教程,轻松搞定生产环境问题
首先你本地Eclipse上要有和部署在远程服务器一至的项目,否则debug的时候会出现代码行错位,难以达到debug的效果.例如:如果你本地的代 码加了行,修改了,或减了一行.而远程服务器上的项目没有 ...
- 【链接】Eclipse的Debug调试技巧
Eclipse的Debug调试技巧大全 https://mp.weixin.qq.com/s/bORg9YxJiby2WenYRrXY-w 使用Eclipse调试Java程序的10个技巧 https: ...
最新文章
- nagios+mysql+ndo2安装总结
- iBATIS配置文件的特殊使用方法
- 094、Swarm 中最重要的概念(Swarm01)
- goland http proxy 代理设置
- python课程费用-深圳python课程费用
- c语言跑马灯实验报告,单片机跑马灯实验
- cookie的expires属性和max-age属性
- 从入门到入土:Python爬虫学习|Selenium自动化模块学习|简单入门|轻松上手|自动操作浏览器进行处理|chrome|PART01
- java微服务实战.pdf_Spring微服务实战 ([美]约翰·卡内尔) 中文完整pdf扫描版[172MB]...
- mc java 连接超时_Java进程CPU占用高导致的网页请求超时的故障排查
- petshop架构分析
- 论模式在领域驱动设计中的重要性
- db2的jdbc驱动
- 【学习笔记】Java工程师成神之路-基础篇
- java语言算阴影梯形面积_例1.2 在梯形中阴影部分面积是150平方厘米,求梯形面积。(《信息学奥赛一本通》)...
- 【基于Centos】驱动安装
- 现如今市场竞争激烈,语音交友陪玩APP源码如何适配用户?
- 编写程序,根据输入的n,输出如下例所示的图形。
- 【图文详解】SpringBoot项目启动报错:The bean ‘xxxServiceImpl‘ could not be injected as a ‘xxxServiceImpl‘ ...
- 我的2020年记-大浪潮下的小小打工人