2013-12-13 4 views
1

Я пытаюсь создать файлы трассировки для приложений, используя Debug.startMethodTracing (по активности onCreate) и Debug.stopMethodTracing (по активности onDestroy) в соответствии со следующей документацией http://developer.android.com/tools/debugging/debugging-tracing.html#creatingtracefiles.Отслеживаемые трассировки Android не содержат вызовов метода приложения

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

Чтобы проверить это, я создал простое приложение для Android, добавлена ​​debbuggable в манифест:

<application 
    ... 
    android:debuggable="true"> 

Создано два тестовых классов А и В. Класс A имеет два метода Ь() и С():

public class A { 

private int _i; 

public A(){_i=0;} 

public void b(){c();} 
public void c(){for(int k=0;k<20;k++)_i++;}} 

Класс B имеет один метод с():

public class B { 

public void c(){ 
    (new A()).b(); 
    A d = new A(); 
    d.c(); 
}} 

Наконец, в основной деятельности на уплотнительное nCreate и OnDestroy методы, которые я начал трассировку:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Debug.startMethodTracing("debugtest"); 

    A a; 
    for (int i = 0; i < 20; i++) { 
     a = new A(); 
     a.b(); 
     a.c(); 
    } 

    (new B()).c(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Debug.stopMethodTracing(); 
} 

Я надеялся получить, по крайней мере, Ab() и Ас() метод вызывает в схеме стека вызовов, но после запуска:

adb pull sdcard/debugtest.trace . ; dmtracedump debugtest.trace -g tree.png 

Сформированный граф вызовов выглядит следующим образом:

enter image description here

является ли это, как он должен работать, то есть просто показать андроид вызовы, а не метод приложения вызовов, о Я что-то упустил?

Обратите внимание, что меня больше всего интересует извлечение исключительного и включающего времени выполнения метода.

ответ

0

Возможно, это связано с тем, что (по умолчанию) опция -t отслеживания установлена ​​на 20%. От AndroidStudio dmtracedump

-t: Минимальный порог для включения дочерних узлов в графе (время включения ребенка в процентах от родительского включительно). Если этот параметр не используется, порог по умолчанию составляет 20%.

Если открыть файл трассировки с TraceView вы увидите, что ваш график что-то вроде:

  • первого узла вашего графа является первым вызов метода
  • второго из вашего графика является первым ребенком первого звонка в TraceView
  • треть вашего графа является первым потомком ребенка первого вызова метода
  • и так далее ...

Запустите dmtracedump с -t 0 (следующим образом), и вы должны увидеть все методы.

dmtracedump -t 0 debugtest.trace -g tree.png 
0

Дополнительную информацию можно разместить, разместив e.getStacktrace() или используя Вход в свои классы. Я считаю, что проще явно запрашивать ошибки, чем надеяться, что код просто придет к вам. Конечно, есть, вероятно, гораздо лучший способ, но именно так я и делал это некоторое время, и мне удалось получить действительно последовательный и легкий результат.

+0

Спасибо за ответ, но меня больше интересуют включительно/исключительные времена (даже с накладными расходами) и график вызовов. Кроме того, я бы предпочел не изменять какой-либо код, кроме вызовов функций отладки. – 4knahs