Android - профилирование определенного потока (UI Thread) через DDMS


Я пытаюсь найти причину зависаний в потоке пользовательского интерфейса в моем приложении в определенных условиях.
Я запустил приложение через профилирование DDMS. Но в нижнем представлении таблицы дерева я вижу все методы, вызываемые во всех потоках, тогда как я хотел бы сосредоточиться только на основном потоке.

Есть ли способ отфильтровать нижний список методов таблицы дерева в DDMS, чтобы включить только статистику для выбранного потока (поток пользовательского интерфейса в моем случае)?

Подвопрос: есть ли хороший Android-профилировщик?

3 ответа

Решение

Пользовательский интерфейс не предоставляет способа сделать это - вам просто нужно просмотреть временную шкалу и щелкнуть по занятым разделам.

Есть грубый подход, который может сделать то, что вы хотите.

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;
...

Как отмечено в выходных данных, каждая строка начинается с идентификатора потока, который соответствует таблице вверху (таким образом, идентификатор 4 потока является потоком JDWP, который обрабатывает трафик DDMS). Далее следует код действия: ent для ввода метода, xit для выхода из метода, или unr для разворачивания стека из-за исключения. После этого следует отметка времени ЦП для каждого потока (т. Е. Совокупное время ЦП, используемое этим потоком), затем имя метода и подпись.

Если вы просто хотите увидеть основной поток пользовательского интерфейса (ID потока 1), вы можете использовать:

grep "^ 1 " trace.txt

Теперь просто разобрать вывод.:-)

Было бы легче справиться, если бы вы могли удалить данные для неинтересных потоков из файла трассировки, а затем просто открыть новый файл с traceview инструмент (входит в комплект SDK). Если вы откроете файл.trace, вы увидите, что это фрагмент текста, за которым следует фрагмент двоичных данных. Вам нужно написать программу, которая пропускает текст, затем анализирует двоичную часть и удаляет что-либо с идентификатором потока, отличным от того, который вас интересует. Формат прост - коллекция записей фиксированного размера - описано в комментарии в верхней части кода профилирования.

(Я не знаю, написал ли кто-нибудь это уже.)

Для просмотра активности вашего кода (горячие точки со стеками вызовов) в определенном потоке (например, в пользовательском интерфейсе) я предлагаю использовать Intel VTune из System Studio. Вы можете собрать базовый профиль "горячих точек" на вашем Android-устройстве, открыть вкладку "снизу вверх" и выбрать "Группировка: поток / функция / стек вызовов". После этого вы увидите профиль вашего приложения для каждого потока. (подробности на прилагаемом скриншоте)введите описание изображения здесь

Вот руководство по использованию 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/

Другие вопросы по тегам