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相关推荐

  1. [转载]eclipse的远程调试功能配置

    原文地址:eclipse的远程调试功能配置作者:我的 用途:web应用部署并运行于外部(区别于eclipse环境中启动的)应用服务器中,当出现问题时,可以使用eclipse工程的源代码进行跟踪调试. ...

  2. Java Eclipse进行断点调试

    Java Eclipse进行断点调试 如何调试Java程序? 大家最开始学习Java,都会觉得IDE调试好高端有木有,其实很简单了. 下文会尽量简单直观的教会你在Eclipse中调试,其他的IDE调试 ...

  3. 在没有复杂插件的情况下从Eclipse启动和调试Tomcat

    像Eclipse这样的现代IDE提供了各种插件来简化Web开发. 但是,我相信将Tomcat作为"常规" Java应用程序启动仍然可以提供最佳的调试体验. 大多数时候,这是因为这些 ...

  4. 无需复杂插件即可从Eclipse启动和调试Tomcat

    像Eclipse这样的现代IDE提供了各种插件来简化Web开发. 但是,我相信将Tomcat作为"常规" Java应用程序启动仍然可以提供最佳的调试体验. 大多数情况下,这是因为这 ...

  5. tomcat开发远程调试端口以及利用eclipse进行远程调试

    一.tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里:  SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compi ...

  6. Eclipse 真机调试检测不到手机解决方案

    Eclipse 真机调试检测不到手机解决方案 参考文章: (1)Eclipse 真机调试检测不到手机解决方案 (2)https://www.cnblogs.com/gamedaybyday/p/753 ...

  7. 使用Eclipse进行远程调试 外加 ant 直接打包到服务器

    今天决定做件有意义的事,写篇图文并茂的blog,为什么要图文并茂?因为很多事可能用语言也说不明白,从以前我发表的一篇文章可以看得出来,http://blog.csdn.net/sunyujia/arc ...

  8. eclipse进行远程调试教程,轻松搞定生产环境问题

    首先你本地Eclipse上要有和部署在远程服务器一至的项目,否则debug的时候会出现代码行错位,难以达到debug的效果.例如:如果你本地的代 码加了行,修改了,或减了一行.而远程服务器上的项目没有 ...

  9. 【链接】Eclipse的Debug调试技巧

    Eclipse的Debug调试技巧大全 https://mp.weixin.qq.com/s/bORg9YxJiby2WenYRrXY-w 使用Eclipse调试Java程序的10个技巧 https: ...

最新文章

  1. nagios+mysql+ndo2安装总结
  2. iBATIS配置文件的特殊使用方法
  3. 094、Swarm 中最重要的概念(Swarm01)
  4. goland http proxy 代理设置
  5. python课程费用-深圳python课程费用
  6. c语言跑马灯实验报告,单片机跑马灯实验
  7. cookie的expires属性和max-age属性
  8. 从入门到入土:Python爬虫学习|Selenium自动化模块学习|简单入门|轻松上手|自动操作浏览器进行处理|chrome|PART01
  9. java微服务实战.pdf_Spring微服务实战 ([美]约翰·卡内尔) 中文完整pdf扫描版[172MB]...
  10. mc java 连接超时_Java进程CPU占用高导致的网页请求超时的故障排查
  11. petshop架构分析
  12. 论模式在领域驱动设计中的重要性
  13. db2的jdbc驱动
  14. 【学习笔记】Java工程师成神之路-基础篇
  15. java语言算阴影梯形面积_例1.2 在梯形中阴影部分面积是150平方厘米,求梯形面积。(《信息学奥赛一本通》)...
  16. 【基于Centos】驱动安装
  17. 现如今市场竞争激烈,语音交友陪玩APP源码如何适配用户?
  18. 编写程序,根据输入的n,输出如下例所示的图形。
  19. 【图文详解】SpringBoot项目启动报错:The bean ‘xxxServiceImpl‘ could not be injected as a ‘xxxServiceImpl‘ ...
  20. 我的2020年记-大浪潮下的小小打工人

热门文章

  1. 安全数据分析理念的变化
  2. CentOS系统配置solr
  3. Linux系统之更改默认块大小
  4. shopt_Linux命令
  5. Linux编译安装Python3
  6. windows下bash终端--git-bash总汇
  7. pandas-数据分析
  8. TCP与UDP在socket编程中的区别
  9. Linux Shell编程(4)——shell特殊字符(上)
  10. ubuntu kylin 14.04编译openjdk-7u40