当前位置: 首页 > 知识库问答 >
问题:

安卓-我如何调查一个ANR?

芮意
2023-03-14

有没有办法找出我的应用程序在哪里抛出了一个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 -----

我怎样才能找出问题出在哪里?跟踪中的方法都是SDK方法。

多谢了。

共有1个答案

齐琦
2023-03-14

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

现在,在你发布的跟踪中,主线似乎做得很好,没有问题。它正在MessageQueue中空转,等待另一条消息进来。在您的情况下,ANR可能是一个更长的操作,而不是永久阻塞线程的操作,因此事件线程在操作完成后恢复,跟踪在ANR之后进行。

如果是永久阻塞(例如,死锁获取某些锁),检测ANR发生的位置很容易,但如果只是临时延迟,则更难。首先,检查您的代码,寻找不可靠的地方和长时间运行的操作。示例可能包括从事件线程内部使用套接字、锁、线程休眠和其他阻塞操作。您应该确保这些都发生在单独的线程中。如果没有问题,请使用DDMS并启用线程视图。这将显示应用程序中的所有线程,类似于您所拥有的跟踪。重现ANR,同时刷新主线程。这应该能让你清楚地看到在ANR的时候发生了什么

 类似资料:
  • 在我的应用程序中,我试图将用户当前设备的Android版本显示为textview,但我使用了os.build.version.sdk,当我使用它时,只有sdk代码显示,例如,Android 4.0.4的17,而我正在尝试让Android版本显示,所以有没有一种方法可以在运行时使用if或else语句将17更改为4.0.4。我把我的Java课附在下面。

  • 承接“Java快速教程”,我将开始写安卓相关的文章。 安卓(Android)开发主要使用Java语言。Java语言基础,是安卓开发的第一道门槛。再者,一个好的安卓应用往往配合有远程服务器。这两方面,可以参考Java快速教程中对Java语言和Play框架的讲解。安卓开发还需要其它技术的合作,包括操作系统、互联网、图形化界面、数据库等。可以说,移动开发是一个现实的战场,平常操练的各项本领都会派上用场。

  • 我编写了这样的代码来查找Android版本 通过使用这段代码,我得到的是版本号,但我想要的是版本名。如何获取版本名?

  • #校招# #面经# 1.map的put方法具体实现 2.java的引用类型 3.https如何保证安全 4.jvm什么时候进行垃圾回收 5.http请求头与响应状态码

  • #面经# http2.0的特点(以为问的http1.1........) 浏览器的流程✓ 三次握手✓ 进程的方法✓ 进程的状态变化✓ synchronized 和 lock的区别✓ 其他的进程同步方法✓ synchronized×(问的修饰静态方法和非静态方法) jvm内存区域✓ hashmap✓ 遇到过内存泄露吗✓ handler内存泄露的场景(只说了个大概,没有继续追问)✓ 其他内存泄露的场景

  • 今天面了荔枝,面试体验很不错,遇到了第一个提到我技术博客的面试官 --- 面试内容,基础部分问了java面向对象,其他都是项目。 问了java面向对象的特性,平时怎么用到的,有带来什么好处吗?然后问我有没有遇到用起来不太方便的地方,应该怎么解决? 之后都是在问项目,问做项目过程中碰到过什么难点,以及研究生方向跟开发工作可能不太一样,怎么看这点? --- 最后反问了解了一下公司现在的业务。 面试官很