使用 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

联系方式:[email protected]

时间: 2024-10-12 02:33:15

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

Android Studio中怎么使用DDMS工具?

随着android studio的广泛使用,开发人员对相关工具的使用需求更加凸显.昨天在一个android studio教程网站上,看到一篇有关DDMS工具使用的相关知识,感觉很不错,分享给大家,一起来看看吧,新技能get走起~~ 首先,我们需要了解的是DDMS工具是个什么鬼? 其实,DDMS(Dalvik Debug Monitor Service),是 Android 开发环境中的Dalvik虚拟机调试监控服务.可以进行的操作有:为测试设备截屏,查看特定行程中正在运行的线程以及堆信息.Log

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

CSDN GitHub Linux内核调试的方式以及工具集锦 LDD-LinuxDeviceDrivers/study/debug 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作 因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 也欢迎大家提供一些其他好的调试工具以供收录, 鄙人在此谢谢啦 "调试难度本来就是写代码的两倍. 因此, 如果你写代码的时候聪明用尽, 根据定义, 你就没有能耐去调试它了.&qu

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

步骤就是 1:新建LR脚本.协议选择Mobile Application - HTTP/HTML 2:在record里选择第三个:Record Emulator........ 3:  选择下一步后,在emulator to record选择模拟器tools目录下的emulator.exe                     command line 里输入avd虚拟机的名称:用@连接  如@test      working directory 随便选个路径就行了 4:然后运行,就会自动启

DDMS工具使用(转)

DDMS工具使用 一.查看进程的堆栈使用情况1.选中你要查看的进程:2.点击“ Update Heap”按钮开启该进程的该项功能,如果单独打开ddms工具,按钮名为“Show heap updates”:3.点击“Cause GC”按钮来进行垃圾回收,当操作完成后,您会看到一组对象类型和为每种类型已分配的内存:4.点击列表中的一个对象类型,为该种特定内存大小的对象分配的数量. 二.跟踪对象的内存分配1.在“设备”选项卡中,选择要启用的分配跟踪的进程:2.在“分配跟踪”选项卡上,单击“开始跟踪”按

如何分析、调试微服务系统的故障?

基于研究论文<Fault Analysis and Debugging of Microservice Systems: Industrial Survey, Benchmark System, and Empirical Study>(作者:周翔.彭鑫.谢涛.孙军.冀超.李文海.丁丹)形成本文.该论文由复旦大学计算机科学技术学院彭鑫教授领导的智能化软件开发 CodeWisdom 团队与北京大学谢涛教授.新加坡管理大学孙军副教授合作完成,并被评选为软件工程领域的国际旗帜期刊.CCF A 类期刊

12个强大的Web服务测试工具

在过去的几年中,web服务或API的普及和使用有所增加. web服务或API是程序或软件组件的集合,可以帮助应用程序进行交互或通过形成其他应用程序或服务器之间的连接执行一些进程/事务处理.基本上有两种类型的web服务——基于互联网协议,REST和SOAP推动数据和信息的通讯. 由于这些web服务暴露于网络并且分布于不同的网络,所以它们很容易受到风险和安全威胁,从而影响基于它们的进程.因此,web服务或API测试非常有必要,可以确保它们执行正确并正确地响应查询. 市场上有不少商业和开源的测试工具可

Nagios监控服务的搭建

Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等. 主要功能 网络服务监控(SMTP.POP3.HTTP.NNTP.ICMP.SNMP.FTP.SSH) 主机资源监控(CPU load.disk usage.system logs),也包括Windows主机(使用NSClient++ plugin) 可以指定自己编写的Plugin通过网络收集数据来监控任何情况(温度.警告--) 可以通过配置Nagios远程

虚拟机性能监控与故障处理工具

Sun SDK 监控和故障处理工具 jps 虚拟机进程状况工具 格式 jps [option] [hostid] 本地虚拟机唯一ID: local virtual machine identifier,LVMID 进程ID:process identifier jps可以通过RMI 协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI 注册表中的注册的主机名. 主要参数 -q                                                      

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

一.测试Windows服务 为了使Windows服务程序能够正常运行,我们需要像创建一般应用程序那样为它创建一个程序的入口点.像其他应用程序一样,Windows服务也是在Program.cs的Main()函数中完成这个操作.首先我们在Main()函数中创建一个Windows服务的实例,该实例应该是ServiceBase类的某个子类的对象,然后我们调用由基类ServiceBase类定义的一个Run()方法.然而调用Run()方法并不意味着就开始了Windows服务程序,必须要等到该对象的OnSta