Android - 我如何调查 ANR?

标签 android performance android-anr-dialog

有没有办法找出我的应用程序在哪里抛出了 ANR(应用程序无响应)。我查看了/data 中的 traces.txt 文件,并看到了我的应用程序的跟踪。这就是我在跟踪中看到的。

DALVIK THREADS:
"main" prio=5 tid=3 TIMED_WAIT
  | group="main" sCount=1 dsCount=0 s=0 obj=0x400143a8
  | sysTid=691 nice=0 sched=0/0 handle=-1091117924
  at java.lang.Object.wait(Native Method)
  - waiting on <0x1cd570> (a android.os.MessageQueue)
  at java.lang.Object.wait(Object.java:195)
  at android.os.MessageQueue.next(MessageQueue.java:144)
  at android.os.Looper.loop(Looper.java:110)
  at android.app.ActivityThread.main(ActivityThread.java:3742)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:497)
  at dalvik.system.NativeStart.main(Native Method)

"Binder Thread #3" prio=5 tid=15 NATIVE
  | group="main" sCount=1 dsCount=0 s=0 obj=0x434e7758
  | sysTid=734 nice=0 sched=0/0 handle=1733632
  at dalvik.system.NativeStart.run(Native Method)

"Binder Thread #2" prio=5 tid=13 NATIVE
  | group="main" sCount=1 dsCount=0 s=0 obj=0x433af808
  | sysTid=696 nice=0 sched=0/0 handle=1369840
  at dalvik.system.NativeStart.run(Native Method)

"Binder Thread #1" prio=5 tid=11 NATIVE
  | group="main" sCount=1 dsCount=0 s=0 obj=0x433aca10
  | sysTid=695 nice=0 sched=0/0 handle=1367448
  at dalvik.system.NativeStart.run(Native Method)

"JDWP" daemon prio=5 tid=9 VMWAIT
  | group="system" sCount=1 dsCount=0 s=0 obj=0x433ac2a0
  | sysTid=694 nice=0 sched=0/0 handle=1367136
  at dalvik.system.NativeStart.run(Native Method)

"Signal Catcher" daemon prio=5 tid=7 RUNNABLE
  | group="system" sCount=0 dsCount=0 s=0 obj=0x433ac1e8
  | sysTid=693 nice=0 sched=0/0 handle=1366712
  at dalvik.system.NativeStart.run(Native Method)

"HeapWorker" daemon prio=5 tid=5 VMWAIT
  | group="system" sCount=1 dsCount=0 s=0 obj=0x4253ef88
  | sysTid=692 nice=0 sched=0/0 handle=1366472
  at dalvik.system.NativeStart.run(Native Method)

----- end 691 -----
我怎样才能找出问题出在哪里? trace 中的方法都是 SDK 方法。

最佳答案

当“主”线程中发生一些长时间的操作时,就会发生 ANR。这是事件循环线程,如果它很忙,Android 将无法在应用程序中处理任何进一步的 GUI 事件,从而引发 ANR 对话框。

现在,在您发布的跟踪中,主线程似乎运行良好,没有问题。它在 MessageQueue 中空闲,等待另一条消息进来。在您的情况下,ANR 可能是一个更长的操作,而不是永久阻塞线程的东西,因此事件线程在操作完成后恢复,并且您的跟踪通过了在 ANR 之后。

如果是永久阻塞(例如死锁获取一些锁),则检测 ANR 发生的位置很容易,但如果只是暂时的延迟,则更难。首先,检查您的代码并寻找易受攻击的地方和长时间运行的操作。示例可能包括在事件线程内使用套接字、锁、线程休眠和其他阻塞操作。您应该确保这些都发生在单独的线程中。如果没有问题,请使用 DDMS 并启用线程 View 。这将显示应用程序中的所有线程,类似于您拥有的跟踪。重现ANR,同时刷新主线程。这应该准确地向您展示 ANR 时发生的事情

关于Android - 我如何调查 ANR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67599756/

相关文章:

android - 主线程被Object.wait自己阻塞?

android - Dalvik 线程状态是什么?

android - 无法在 AppCompatActivity 中使用 android :Theme. Material

java - Android挂起Intent和系统重启的行为?

scala - RDD API与结合了DataFrame API的UDF对性能的影响

c# - 使用 linq 查询简化流程

android - RecyclerView ambiguos setVisibility函数,点击一个 View 影响多个 View

android - 以声明方式将宽度分配给可用屏幕宽度的一半

c++ - 在 C++ 中更有效和快速的反转矩阵的方法(大和小)