【发布时间】:2015-05-10 09:15:25
【问题描述】:
有很多关于 ANR 跟踪文件的问题,答案总是“哦,问题出在你的线程 76,修复你的 http 调用”之类的 :) 但我找不到任何关于如何阅读的一般指南或教程这一步一步地跟踪任何 ANR。有没有?我特别有几个问题:
总是可以从我在谷歌控制台中看到的真实世界 ANR 的线程跟踪中看到问题吗?或者如果我无法在本地重现 ANR,是否可能没有相关信息,我运气不好?
此信息中包含哪些线程?我想我的应用程序进程中有所有线程,但是其余的呢?它们在某种程度上都与我相关吗? (例如我的一些线程正在等待的线程等)或者还有完全不相关的进程?
Google Play 控制台如何确定 ANR 发生的“地点” - 然后显示在 ANR 列表中,例如:
ANR keyDispatchingTimedOut
miesto:com.sample.myapp/myapp.activities.SplashActivity
因为在提供的线程跟踪文本中看不到 SplashActivity。
- 我知道我应该寻找潜在的死锁等处于等待状态的线程。线程“等待自己”的情况如何?
“AsyncTask #1”prio=5 tid=15 WAIT | group="main" sCount=1 dsCount=0 obj=0x41bb50c0 自我=0x5529a868 | sysTid=2448 nice=0 sched=0/0 cgrp=应用句柄=1429609576 |状态=S schedstat=( 18097077 39273309 41 ) utm=1 stm=0 core=1 at java.lang.Object.wait(Native Method) - 等待 tid=15 (AsyncTask #1) 持有的 (a java.lang.VMThread)
这是否总是可以的,我可以假设这不是原因?情况如何,我在 NATIVE 中只有一堆线程(包括主线程),而在 WAIT 中只有一堆线程像这样等待自己?这怎么可能是 ANR?
【问题讨论】:
-
ANR 通常并不意味着它没有响应。这通常意味着本机代码发生了崩溃。至于调试它 - 您需要在日志文件中找到堆栈跟踪或核心转储,然后从那里开始工作。活动中每个线程的转储几乎总是一个红鲱鱼,不值得一看,我想我从来没有见过有帮助的。
-
加布,你确定吗?据我所知,本机崩溃显示在谷歌控制台的另一个选项卡中,并具有“堆栈跟踪”(通常不是很有帮助,但仍然)。您能否指出您声称 ANR 可能是“隐藏”本机崩溃的任何来源?
-
只是体验。我已经解决了数百个 ANR。我认为其中不超过 1 或 2 个是死锁。
-
使用Crashlytics (Fabric)
-
根据我的经验,ANR 是由于主 UI 线程负载过重,而不是本机代码崩溃。甚至谷歌也这么说here。考虑到您的麻烦类被称为“SplashActivity”并且“Splash”屏幕通常用于加载资源,我建议考虑将该 Activity 中的一些任务移动到另一个后台线程。如果它继续存在,请尝试计算完成活动所需的时间,特别是如果您有任何可能需要一些时间来遍历的循环。
标签: android android-anr-dialog