zoukankan      html  css  js  c++  java
  • 使用 Dalvik 调试监控服务 (DDMS) 工具

    Android 附带一个叫Dalvik 调试监控服务 (DDMS) 的调试工具,它提供端口转发服务、在设备上的屏幕捕获,设备上的线程和堆栈信息, logcat,进程, 和无线状态信息,接收呼叫和SMS 欺骗,位置数据欺骗 和更多功能。 这篇仅介绍DDMS一般特性,不是对它的特性和功能做详细的说明。

    DDMS 位于SDK的 tools/ 目录。从一个终端或控制口进入此目录并键入 ddms (或 ./ddms 在 Mac/Linux上) 以运行它, DDMS 将运行在模拟器上或一个连接的设备上,如果模拟器和连接的设备都在运行,DDMS默认运行在模拟器上。

    DDMS如何工作

    DDMS作为一个中间人,连接IDE到运行在设备上的应用程序。在 Android上,每个应用程序运行在他自己的进程中,管理它们自己的虚拟机 (VM),并且每个进程在不同的端口监听调试器。

    当它启动时, DDMS连到 adb 上并在他们之间建立一个设备监控服务,当设备连接或断开时将通知DDMS,一个虚拟监视服务在adb和DDMS之间建立,当一个在设备上的虚拟机开始或终止时,它将通知DDMS,一旦虚拟机运行, DDMS通过adb获得进程的ID, 并且建立一个到虚拟机调试器的连接,通过设备上adb daemon (adbd)程序. DDMS 能够使用自定义的有线协议和虚拟机通信。

    在设备上的每个虚拟机, DDMS 打开一个端口监听调试器。对于第一个虚拟机, DDMS在 8600端口监听调试器,下一个在 8601端口, 并且等等。当一个调试器连接到这些端口中的其中一个后,所有的通信量被转到调试器和相应的虚拟机之间。DDMS能够像一个远程调试会话那样进行调试工作。

    DDMS也打开另一个本地端口,DDMS的 "基本端口" (8700,默认情况下), 它也作为调试器的监听端口,当一个调试器连接到这个端口,所有当前在DDMS中选择的通信量被转发到虚拟机中,所以他作为调试器的默认连接端口。

    关于DDMS端口转发的更多信息,请阅读 配置你的IDE以绑定到8700端口调试.

    提示: 你可以在File > Preferences菜单里设置DDMS配置端口。配置被保存在 "$HOME/.ddmsrc"文件中。

    了解关于Dalvik的调试知识
    在Dalvik 虚拟机上调试应用程序和在其它的虚拟机上一样,但是,当单步步出同步代码时,“当前行”的光标跳到这个方法的的最后一行。

    左边框架

    调试监控器的左侧显示每个模拟器/设备的当前运行状况,用一个列表显示每个模拟器/设备上的虚拟机,虚拟机被运行在它上面的应用程序的包名唯一标识。

    用这个列表来查找和捆绑你要调试的进程到虚拟机上,列表中靠近虚拟机名的是一个“调试通信”端口(在最右边的列),如果你连接调试器到列表中的一个端口,你将被连接到设备上相应的虚拟机上。但是,当使用DDMS时,仅仅需要连接到8700端口,这时DDMS转发这里所有的流量到当前所选的虚拟机上,(注意:当你在列表中选择一个虚拟机时,列出的端口包含8700)这样,你每次在切换虚拟机时,就不需要重新配置调试器的端口。

    当一个运行在设备上的应用程序调用waitForDebugger()(或者你在开发者选项里选择这个选项)时,一个红色的图标将显示在客户端名字的边上,当它等待调试器捆绑到虚拟机时,并且一个调试器连接上时,这个图标将变成绿色。

    如果你看到一个带删除线的小虫图标,它的意思是:DDMS不能在调试器和虚拟机之间建立一个连接,原因是它不能打开虚拟机的本地端口,如果你在这个设备上的所有虚拟机上都看到这个图标,很可能是因为还有另一个DDMS实例正在运行(这里包含Eclipse插件)。

    如果你看到一个问号标记在一个应用程序包空间里,这意味着,DDMS从adb中接收到应用程序的pid,它不知何故的不能和虚拟机的进程握手,这时可以试试重启DDMS。

    右边框架

    在右侧,调试监控器通过制表符显示有用的信息和一些相当酷的工具。

    信息

    这个视图显示当前选择虚拟机相关的一般信息,包含进程ID、包名、和虚拟机版本。

    线程

    线程视图有一个运行在目标虚拟机上的线程列表,为了减少数据的发送量,当按下在工具栏的“线程”按钮时,仅仅线程更新信息被发送,这个按钮对应着每个虚拟机,这个列表包含以下信息:,

    • ID - 一个虚拟机分配的唯一的线程ID。在Dalvik中,这些奇数号码从3开始。
    • Tid - Linux线程ID。 作为一个进程的主线程,它等于进程的ID。
    • Status - 虚拟机线程状态,守护线程显示时带有一个星号,它将是下面的状态之一:
      • running - 执行应用程序代码
      • sleeping - 调用 Thread.sleep()
      • monitor - 等待获取一个监视锁
      • wait - 在 Object.wait()
      • native - 执行本地代码
      • vmwait - 等待一个虚拟机资源
      • zombie - 在死进程中的线程
      • init - 线程正在初始化 (你将看不到这步)
      • starting - 线程准别运行 (在这你将也看不到)
    • utime - 执行用户代码的总时间, 在 "jiffies" (通常是 10ms),仅在Linux下可用。
    • stime - 执行系统代码的总时间,在 "jiffies" (通常是 10ms)。
    • Name - 线程的名字。

    "ID" and "Name" 在线程启动时被设置,保留的区域被定时更新 (默认是4秒一次)。

    VM 堆

    显示一些堆状态,在垃圾回收时更新,如果当一个虚拟机被选中,虚拟机堆视图提示禁止堆更新。单击位于左上侧工具栏的“显示堆更新”按钮,返回到虚拟机堆视图,点击Cause GC进行垃圾回收和更新堆状态。

    分配跟踪

    在这个视图,你可以跟踪每个虚拟机的内存分配。在左边选择一个虚拟机,然后点击 开始跟踪,再点击 获取分配 以查看从开始跟踪后的内存分配信息,相应的数据将显示在下面的表格中,再次点击它以刷新列表。

    竞争控制

    通过这些控制,你可以模拟特殊的设备状态和活动,包含以下特性:

    • 电话状态 - 改变语音电话的状态和数据计划(本地、漫游,搜索,等等),并能模拟不同种类的网络速度和延时(GPRS, EDGE, UTMS, 等等)
    • 电话活动 - 模拟到模拟器的电话呼叫和SMS短消息
    • 位置控制 -发送虚假的位置数据到模拟器 ,这样你能够形成一个像GPS映射那样的定位操作。

      要使用位置控制,启动你在 Android模拟器中的应用程序并打开DDMS,点击模拟器控制标签并按下位置控制,从这以后,你可以:

      • 手动发送单独的经度/纬度坐标到设备。

        单击手动,选择坐标格式,在字段里填上数据并点击发送。

      • 使用一个GPX文件描述在设备上的路径的回放。

        选择GPX文件并载入此文件,一旦载入,点击播放按钮回放定位操作程序的路径。

        当从GPX开始回放时,你可以在DDMS面板上调节回放的速度和通过暂停、跳过按钮控制回放,DDMS将解析轨迹点(<wpt>, 在第一个表中),和轨迹(<trk>,在第二个表中,通过<trkseg>字段的简单组合以支持多段),仅仅轨迹可以播放,在第一个列表中点击轨迹点仅发送它的坐标到设备,当选择一个轨迹后,就可以播放它。

      • 使用一个KML文件描述设备上的顺序回放的位置点

        单击并打开一个KML文件,一旦文件载入,单击播放按钮以发送坐标到你的定位程序中。

        当使用一个KML文件,它解析一个<coordinates>元素,它的值由一套经度、纬度、高度值组成。例如:

        <coordinates>-122.084143,37.421972,4</coordinates>

        在你的文件中,你可以包含多个<Placemark> 元素,每个包含一个 <coordinates>元素。当你这样做的时候,位置标记集合将被添加到轨迹上,DDMS将每秒发送一个位置标记到设备。

        生成一个合适的KML文件的方法是:在Google Earth上找到一个位置,右键单击这个位置点,在左边弹出的菜单上选择“位置另存为”菜单项,并选择存储格式为Kml。

        注意:DDMS不支持通过<MultiGeometry><LineString>lat1, long1, lat2, long2, ....</LineString></MultiGeometry>方法创建路经。同样当前也不支持<TimeStamp>节点在<Placemark>中,未来的版本可能支持时间位置和路径拥有一个单独的位置元素。

      获取更多的基于定位数据的欺骗方法,可查看 基于位置服务的 APIs 文档。

    文件浏览器

    通过文件浏览器,你能够浏览设备文件系统和进行基本的管理,像拖和拉文件,这些操作围绕着adb的拖拉命令,提供一个GUI的体验。

    打开DDMS,选择设备>文件浏览器... 菜单打开文件浏览器窗口,你可以把文件拖入设备目录,但是不能拖出设备。从设备拷贝文件时,选择文件并单击工具栏上的从设备取出文件按钮,删除文件时,使用工具栏的删除按钮。

    如果你对模拟器上的SD卡映像感兴趣,你可以用mksdcard 命令建立一个映像,并在模拟器启动的时候加载它。例如,在/tools目录,执行:

    $ mksdcard 1024M ./img
    $ emulator -sdcard ./img
    

    现在,当模拟器运行时,DDMS文件浏览器将能读和写sdcard目录。但是,你的文件不会自动显示。例如,如果你添加一个MP3文件到sdcard 目录,媒体播放器将看不到这个文件,直到你重启模拟器后才能看到。(当从命令行重启模拟器时,确保再一次加载sdcard 。)

    获取更多关于建立SD卡映像的信息,请查看 其它工具 文档。

    屏幕捕获

    你能够通过选择设备>屏幕捕获菜单以捕获设备或模拟器上的屏幕图像,或者按下CTRL-S快捷键。

    浏览进程

    你能够通过在菜单条中选择设备>显示进程状态得到和在特定虚拟机上使用ps -x 命令相同的输出结果。

    致使GC产生

    按下工具栏的垃圾桶按钮可以进行垃圾回收。

    在设备(logcat)运行 Dumpsys and Dumpstate

    • 从Dalvik运行 dumpsys (logcat), 选择在菜单栏上的 设备 > 运行 logcat...
    • 从Dalvik运行 dumpstate , 选择在菜单栏上的 设备显示设备状态...

    测试无线状态

    默认情况下,在一个标准的logcat(包含很多信息)上,无线状态没有输出。要查看无线信息,可以点击设备>显示无线状态...菜单,或者运行描述在 记录无线信息 的logcat。

    停止一个虚拟机

    你可以选择动作>挂起虚拟机菜单以停止一个虚拟机,按下这个菜单致使虚拟机调用 System.exit(1)

    了解关于DDMS的缺陷

    DDMS有如下已知的缺陷:

    • 如果你连接和断开一个调试器,ddms放弃和重连到客户上后,这时虚拟机却以为调试器已经关闭。这将最终被修复。

    关于翻译作者

    andriodin论坛用户名:zxg1982

    联系方式:abit123@163.com

  • 相关阅读:
    win2K/win2003终端服务器超出最大允许连接数解决之道
    DOM与SAX读取xml文件例程
    ubuntu安装配置telnet
    SCTP 简介
    groovy 脚本中文乱码问题解决
    编码问题研究
    gvim支持utf8
    ctags使用方法
    我家猫病了。。
    小朋友搞笑造句
  • 原文地址:https://www.cnblogs.com/kluan/p/4462164.html
Copyright © 2011-2022 走看看