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

使用 Dalvik 调试监控服务 (DDMS) 工具的更多相关文章

  1. Android Studio中怎么使用DDMS工具?

    随着android studio的广泛使用,开发人员对相关工具的使用需求更加凸显.昨天在一个android studio教程网站上,看到一篇有关DDMS工具使用的相关知识,感觉很不错,分享给大家,一起 ...

  2. Android Studio中怎么使用DDMS工具

    随着android studio的广泛使用,开发人员对相关工具的使用需求更加凸显.昨天在一个android studio教程网站上,看到一篇有关DDMS工具使用的相关知识,感觉很不错,分享给大家,一起 ...

  3. DDMS工具使用(转)

    DDMS工具使用   一.查看进程的堆栈使用情况1.选中你要查看的进程:2.点击“ Update Heap”按钮开启该进程的该项功能,如果单独打开ddms工具,按钮名为“Show heap updat ...

  4. LoadRunner+Android模所器实现抓包并调试本地服务端

    步骤就是 1:新建LR脚本.协议选择Mobile Application - HTTP/HTML 2:在record里选择第三个:Record Emulator........ 3:  选择下一步后, ...

  5. Linux内核调试的方式以及工具集锦【转】

    转自:https://blog.csdn.net/gatieme/article/details/68948080 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  6. Linux内核调试的方式以及工具集锦

    原文:https://blog.csdn.net/gatieme/article/details/68948080 CSDN GitHubLinux内核调试的方式以及工具集锦 LDD-LinuxDev ...

  7. jvm监控和诊断工具

    大牛写的Java的OOM Killer:https://www.jianshu.com/p/4645254be259 强烈推荐 总的参考链接:https://cloud.tencent.com/dev ...

  8. 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具

    上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...

  9. Windows服务二:测试新建的服务、调试Windows服务

    一.测试Windows服务 为了使Windows服务程序能够正常运行,我们需要像创建一般应用程序那样为它创建一个程序的入口点.像其他应用程序一样,Windows服务也是在Program.cs的Main ...

随机推荐

  1. Android -- 与WEB交互在同一个会话Session中通信

    Session与Cookie Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. Session可以用Cookie来实现, ...

  2. nodejs笔记三--url处理、Query String;

    URL--该模块包含用以 URL 解析的实用函数. 使用 require('url') 来调用该模块. 一.parse函数的基础用法 parse函数的作用是解析url,返回一个json格式的数组,请看 ...

  3. 常用EXE文件反编译工具

    PE Explorer V1.99 R5 绿色汉化特别版_强大的可视化汉化集成工具 功能极为强大的可视化汉化集成工具,可直接浏览.修改软件资源,包括菜单.对话框.字符串表等: 另外,还具备有 W32D ...

  4. Drools规则加载变量冲突问题分析

    问题现象说明 在个别环境下加载规则时出现:rule/trade/hg/Rule_FY_*.java (53:3948) : Duplicate local variable paraMap,出现此问题 ...

  5. HDU 5151 Sit sit sit 区间dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5151 题解: 有n个椅子,编号为1到n. 现在有n个同学,编号为1到n,从第一个同学开始选择要坐的位 ...

  6. 【BZOJ】【3282】Tree

    LCT 喜闻乐见的Link-Cut-Tree…… srO zyf http://www.cnblogs.com/zyfzyf/p/4149109.html 目测我是第222个?………………不要在意这些 ...

  7. POI中设置Excel单元格格式

    引用:http://apps.hi.baidu.com/share/detail/17249059 POI中可能会用到一些需要设置EXCEL单元格格式的操作小结: 先获取工作薄对象: HSSFWork ...

  8. Using Hooks

    The following code examples demonstrate how to perform the following tasks associated with hooks: In ...

  9. .NET设计模式(11):组合模式(Composite Pattern)(转)

    概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 意图 将对 ...

  10. HTML5中表单验证的8种方法(转)

    在深人探讨表单验证之前,让我们先思考一下表单验证的真实含义.就其核心而言,表单验证是一套系统,它为终端用户检测无效的控件数据并标记这些错误.换言之,表单验证就是在表单提交服务器前对其进行一系列的检查并 ...