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 调试跟踪不包含特定于应用程序的方法调用的主要内容,如果未能解决你的问题,请参考以下文章
需要生成特定于设备 ID 的访问密钥(Android 应用程序的 android_id)
android 多个 videoView 问题,特定于 Galaxy Tab
使用 dnSpy 重新编译 DLL - 不可知程序集不能具有特定于处理器的模块 System.EnterpriseServices.Wrapper.dll