了解 google 播放给出的 ANR 堆栈跟踪

Understanding ANR stack trace given by google play

我们最近使用 cocos2d-js (3.17.1) 开发了一款游戏 android 并获得了更多的 ANR,我想了解我们如何轻松理解报告的堆栈跟踪。

我观察到有些线条是粗体的,有些是浅灰色的,这是为什么,每个线程都有一些状态,有些 ANR 的警告是黄色的,但不知道是哪个线程导致了问题。

在 google 上搜索,浏览了很多帖子,google 播放 android 文档,它只是提供了有关 ANR 含义的信息,(主线程被阻塞)以及如何处理/防止 ANR,不完全了解我如何从堆栈跟踪中提取含义,如何通过堆栈跟踪,哪个线程确切地导致了问题。

这里有完整的堆栈跟踪 https://del.dog/unafalycej.txt

附上我们获得最多时间的 ANR 截图(主线程和阻塞线程)。

ANR title screenshot

main thread screenshot

blocked thread screenshot

根据我的经验,ANR 是最难分析的,但下面提到的是我进行 RCA 的一些可能步骤。

  1. 继续寻找您看到 ANR 之后的特定操作,寻找它的 API/method/onClick,尝试分析该代码。

  2. 查看这些特定方法的日志,中间是否有任何不必要的调用,如果可能请尝试分析。

  3. 应用程序遇到 ANR 后,android 将 a 存储在 /data/anr/traces.txt。尝试拉取此文件并开始分析它。寻找主线程,检查它的 STATE 和堆栈跟踪。有关跟踪文件的详细信息,请参阅 this

  4. 正在尝试识别具有较大 jiffies 的线程。也可以查看他们的调用堆栈。

  5. 还有线程转储和 systrace 之类的功能很有用。