繁体   English   中英

Android - 通过DDMS分析特定线程(UI线程)

[英]Android - profiling a specific thread (UI Thread) via DDMS


我试图在某些条件下在我的应用程序中找到UI线程冻结的原因。
我通过DDMS分析运行了应用程序。 但是在底部的树表视图中,我看到所有线程都调用了所有方法,而我只想关注主线程。

有没有办法过滤DDMS中底层树表的方法列表,只包括所选线程的统计信息(在我的情况下是UI线程)?

一个子问题:那里有一些好的Android分析器吗?

用户界面没有提供这样做的方法 - 你只需要浏览时间线并点击看起来很忙的部分。

有一种粗略的方法可以做你想要的。

SDK包含一个名为dmtracedump的工具,可用于从.trace文件生成报告。 当您使用DDMS获取跟踪时,请记下文件的位置(我的是/tmp/ddms4176182990461128308.trace )。 在Linux上,您将运行:

dmtracedump -o <filename> > trace.txt

这将为您提供如下文件:

VERSION: 3
Threads (13):
 1 main
 2 GC
 3 Signal Catcher
 4 JDWP
...
Trace (threadID action usecs class.method signature):
 4 xit         0 ..dalvik/system/VMDebug.startMethodTracingDdms (IIZI)V
 4 xit         0 .android/os/Debug.startMethodTracingDdms (IIZI)V
 4 xit         0 android/ddm/DdmHandleProfiling.handleMPSS (Lorg/apache/harmony/dalvik/ddmc/Chunk;)Lorg/apache/harmony/dalvik/ddmc/Chunk;
...

如输出中所述,每行以对应于顶部表的线程ID开头(因此线程ID 4是处理DDMS流量的JDWP线程)。 接下来是一个操作代码: ent表示方法入口, xit表示方法退出,或者unr表示由于异常导致的堆栈展开。 之后是每线程CPU时间戳(即该线程使用的累计CPU时间),然后是方法名称和签名。

如果您只想查看主UI线程(线程ID 1),您可以使用:

grep "^ 1 " trace.txt

现在解析输出很简单。 :-)

如果您可以从跟踪文件中删除不感兴趣的线程的数据,那么将更容易处理,然后使用traceview工具(包含在SDK中)打开新文件。 如果你打开一个.trace文件,你会发现它是一大块文本,后跟一大块二进制数据。 您需要编写一个程序来传递文本,然后解析二进制部分并删除任何线程ID而不是您感兴趣的线程ID。格式很简单 - 一组固定大小的记录 - 在分析代码顶部附近的注释中描述

(我不知道是否有人写过这个。)

要在某个线程(例如UI)上查看代码活动(带有调用堆栈的热点),我建议使用System Studio中的Intel VTune。 您可以在Android设备上收集Basic热点配置文件,打开Bottom-up选项卡并选择Grouping:Thread / Function / Callstack。 之后,您会看到应用程序的每个线程的热点配置文件。 (详见附页截图) 在此输入图像描述

以下是如何使用VTune的教程: http//software.intel.com/en-us/articles/using-intel-vtune-amplifier-on-non-rooted-android-devices

最好的android分析器肯定是“Eclipse Memory Analyzer”。 它允许您拍摄记忆的快照,并深入了解其中发生的事情。 请查看下面的链接以了解有关它的更多信息。

http://eclipsesource.com/blogs/2013/01/21/10-tips-for-using-the-eclipse-memory-analyzer/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM