1

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

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

为了测试这一点,我创建了一个简单的 Android 应用程序,将 debuggable 添加到清单中:

 <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();
}

我希望在调用堆栈图中至少获得 Ab() 和 Ac() 方法调用,但在运行之后:

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

生成的调用图如下:

在此处输入图像描述

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

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

4

2 回答 2

0

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

于 2013-12-13T18:47:26.567 回答
0

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

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

如果你用 traceview 打开你的跟踪文件,你会看到你的图表是这样的:

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

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

dmtracedump -t 0 debugtest.trace -g tree.png
于 2017-01-10T18:20:54.143 回答