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

Posted

技术标签:

【中文标题】Android 调试跟踪不包含特定于应用程序的方法调用【英文标题】:Android debug traces do not contain application specific method calls 【发布时间】:2013-12-13 16:30:13 【问题描述】:

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

我在物理设备上运行应用程序,它成功地创建了跟踪文件。后来我对它们运行 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();

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

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

生成的调用图如下:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

感谢您的回答,但我对包容/独占时间(即使有开销)和调用图更感兴趣。此外,我不希望更改任何代码,调试函数调用除外。

以上是关于Android 调试跟踪不包含特定于应用程序的方法调用的主要内容,如果未能解决你的问题,请参考以下文章

Android 多个 APK(特定于密度)

xperf 调用堆栈跟踪,特定于 dll

需要生成特定于设备 ID 的访问密钥(Android 应用程序的 android_id)

android 多个 videoView 问题,特定于 Galaxy Tab

使用 dnSpy 重新编译 DLL - 不可知程序集不能具有特定于处理器的模块 System.EnterpriseServices.Wrapper.dll

特定于 Cell Linux 环境的 GDB 文档在哪里?