2

我的应用程序中偶尔会出现一个非常难以重现的 ANR 事件。今天发生了,我从设备中取出了位于 /data/anr 中的文件 trace.txt。不幸的是我无法理解这个文件中的数据,这里是完整的文件内容。有人能理解是什么让我的应用程序的 UI 无响应吗?我已经阅读了类似的问题,但仍然无法阅读该文件..

我已将完整的 trace.txt 文件内容粘贴到pastebin

编辑

pastebin 上的文件不再可用,我无法再访问 trace.txt 文件,因此可以关闭答案。

谢谢你

4

4 回答 4

4

您可以使用Strictmode找出延迟特定线程的调用。使用它的最佳方式是以下形式。在您的应用程序 onCreate() 中,您启用 StrictMode。之后,(几乎)该线程上的所有慢速调用都将报告给您的日志,并带有发生位置的完整堆栈跟踪。

在您的自定义应用程序类中:

 public void onCreate() {
     if (DEVELOPER_MODE) {
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectAll()    // detect everything potentially suspect
                 .penaltyLog()   // penalty is to write to log
                 .build());
         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                 .detectAll()
                 .penaltyLog()
                 .build());
     }
     super.onCreate();
 }
于 2013-10-25T08:19:04.710 回答
3

正如@Mohamed_AbdAllah 在他的评论中所写的那样“trace.txt 是发生 ANR 时所有正在运行的线程的情况。” 在发生 ANR 时从线程中找到 ANR 的原因似乎不可能使用您发布的跟踪。如果您想了解 trace 中的那些文本是什么意思,您可能对此感兴趣。(当 ANR 从跟踪中发生时,您可以得到哪个线程长时间运行,但这可能对您没有帮助)

或者,如果您想查看您的 Android 应用程序有哪些类型的崩溃/ANR(我假设您对您在 google play 上开发和发布的应用程序感兴趣),您可以使用崩溃报告 API。我为此使用了 crashlytics,它确实帮助我修复了我的应用程序崩溃。当您将此 api 添加到您的应用程序时,您可以跟踪网页上的所有崩溃/ANR。

如果您的目标是了解如何从 trace.txt 中找到 ANR 的原因,那么我不知道。但是,如果您需要查找并修复您的崩溃/ANR,请使用崩溃报告 API。

编辑:我假设您正在谈论您在 google play 上开发和发布的应用程序。如果您正在谈论尚未发布到 google play 的应用程序,@Jeffrey Klardie 的建议正是您所需要的。但不建议在 google play 的应用程序上启用Strictmode

于 2013-10-24T21:04:02.040 回答
0

最可能的原因是编译器正在等待 UI 线程上的一些互联网操作。

于 2013-10-21T13:34:11.457 回答
0

如果没有代码来查看发生了什么,真的很难在这方面提供帮助,所以我将列出在这种情况下我会对自己的代码做什么。

  1. 在我的代码上运行静态分析工具来识别一些奇怪的行为(无限循环、丢失案例等)。我个人使用FindBugs
    1. 查看从静态分析工具弹出的错误,更正那些对您正在做的事情有意义的错误。
  2. 查看代码中是否出现任何“邪恶”代码,例如非常长的循环、可以是异步的同步活动、sleep()函数的使用、正在同步处理的异步活动等。
  3. 如果以上都没有产生影响,就开始Log到处发表声明。观察运行的输出,看看它到达哪里或重复了什么。
  4. 如果上述方法都不起作用,请打开啤酒做一点瑜伽,然后重新开始徘徊并再挖一些!
于 2013-10-23T18:31:48.790 回答