Android调试跟踪不包含特定于应用程序的方法调用

时间:2013-12-13 16:30:13

标签: android profiling trace call-graph

我正在尝试根据以下文档http://developer.android.com/tools/debugging/debugging-tracing.html#creatingtracefiles使用Debug.startMethodTracing(在onCreate上的活动)和Debug.stopMethodTracing(在活动onDestroy上)为应用程序生成跟踪文件。

我在物理设备上运行该应用程序,并成功创建了跟踪文件。后来我在它们上运行dmtracedump来生成一个调用堆栈图,但它不包含我的任何应用程序方法调用。

为了测试这个,我创建了一个简单的Android应用程序,向清单添加了debbuggable:

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

创建了两个测试类A和B.A类有两个方法b()和c():

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类有一个方法c():

public class B {

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

最后在onCreate和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();
}

我希望在调用堆栈图中至少获得A.b()和A.c()方法调用,但是在运行之后:

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

生成的调用图如下:

enter image description here

它应该如何工作,即只显示android调用而不是应用程序方法调用,或者我错过了什么?

请注意,我最感兴趣的是检索方法执行的独占和包容时间。

2 个答案:

答案 0 :(得分:0)

您可以通过放置e.getStacktrace()或在类中使用Log来获取更多信息。我发现明确要求错误比希望代码只是来找你更容易。当然可能有一个更好的方法,但这就是我已经做了一段时间的事情,并且我已经能够获得一个非常一致且易于查明的结果。

答案 1 :(得分:0)

可能是因为(默认情况下)traceview的-t选项设置为20%。来自AndroidStudio dmtracedump

  

-t:在图表中包含子节点的最小阈值(孩子的包容时间占父包含时间的百分比)。如果   未使用此选项,默认阈值为20%。

如果您使用traceview打开跟踪文件,您会看到图表类似于:

  • 图表的第一个节点是第一个方法调用
  • 图表的第二个是traceview中第一个调用的第一个子项
  • 图表的第三个是第一个方法调用的子项的第一个子项
  • 等......

使用-t 0运行dmtracedump(如下所示),您应该看到所有方法。

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