浅谈 android ANR 如何找有用的信息

ANR --- Application No Response)。发生ANR时,会生成/data/anr/traces.txt 来记录系统中各进程的状态。对于由锁LOCK造成的ANR,可以由traces文件看出一些有用信息。


首先找各进程在等待哪个lock,可以搜索held by

"Binder_8" prio=5 tid=67 MONITOR
  | group="main" sCount=1 dsCount=0 obj=0x41d474d8 self=0x651681f8
  | sysTid=1115 nice=-1 sched=0/0 cgrp=apps handle=1574637624
  | state=S schedstat=( 0 0 0 ) utm=379 stm=348 core=0
  at com.android.server.net.NetworkStatsService.performPoll(NetworkStatsService.java:~963)
  - waiting to lock <0x41eec1e8> (a java.lang.Object) held by tid=35 (NetworkStats)
  at com.android.server.net.NetworkStatsService.forceUpdate(NetworkStatsService.java:663)
  at android.net.INetworkStatsService$Stub.onTransact(INetworkStatsService.java:124)
  at android.os.Binder.execTransact(Binder.java:404)
  at dalvik.system.NativeStart.run(Native Method)
  
  
  "Binder_7" prio=5 tid=66 MONITOR
  | group="main" sCount=1 dsCount=0 obj=0x41d5c978 self=0x653e0ff8
  | sysTid=1095 nice=0 sched=0/0 cgrp=apps handle=1698565552
  | state=S schedstat=( 0 0 0 ) utm=391 stm=310 core=0
  at com.android.server.net.NetworkStatsService.performPoll(NetworkStatsService.java:~963)
  - waiting to lock <0x41eec1e8> (a java.lang.Object) held by tid=35 (NetworkStats)
  at com.android.server.net.NetworkStatsService.forceUpdate(NetworkStatsService.java:663)
  at android.net.INetworkStatsService$Stub.onTransact(INetworkStatsService.java:124)
  at android.os.Binder.execTransact(Binder.java:404)
  at dalvik.system.NativeStart.run(Native Method)
  
  
  "WifiStateMachine" prio=5 tid=39 TIMED_WAIT
  | group="main" sCount=1 dsCount=0 obj=0x420249b8 self=0x6060e008
  | sysTid=728 nice=0 sched=0/0 cgrp=apps handle=1616962656
  | state=S schedstat=( 0 0 0 ) utm=660 stm=171 core=2
  at java.lang.Object.wait(Native Method)
  - waiting on <0x41e82f08> (a java.lang.VMThread) held by tid=39 (WifiStateMachine)
  at java.lang.Thread.parkFor(Thread.java:1205)
  at sun.misc.Unsafe.park(Unsafe.java:325)
  at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:197)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2056)
  at java.util.concurrent.ArrayBlockingQueue.poll(ArrayBlockingQueue.java:388)
  at com.android.server.NativeDaemonConnector$ResponseQueue.remove(NativeDaemonConnector.java:642)
  at com.android.server.NativeDaemonConnector.execute(NativeDaemonConnector.java:380)
  at com.android.server.NativeDaemonConnector.executeForList(NativeDaemonConnector.java:331)
  at com.android.server.NativeDaemonConnector.execute(NativeDaemonConnector.java:296)
  at com.android.server.NetworkManagementService.clearInterfaceAddresses(NetworkManagementService.java:724)
  at android.net.wifi.WifiStateMachine.handleNetworkDisconnect(WifiStateMachine.java:2550)
  at huawei.android.net.wifi.HwWifiStateMachine.handleNetworkDisconnect(HwWifiStateMachine.java:73)
  at android.net.wifi.WifiStateMachine$ConnectModeState.processMessage(WifiStateMachine.java:4143)
  at com.android.internal.util.StateMachine$SmHandler.processMsg(StateMachine.java:966)
  at com.android.internal.util.StateMachine$SmHandler.handleMessage(StateMachine.java:789)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:136)
  at android.os.HandlerThread.run(HandlerThread.java:61)
  


 由上面 可以看到,有线程在等待某个lock,该lock被tid=35 (NetworkStats)持有。再看看tid=35 (NetworkStats)的状态,然后检查一下各函数找原因:
  
"NetworkStats" prio=5 tid=35 TIMED_WAIT
  | group="main" sCount=1 dsCount=0 obj=0x42031378 self=0x60625e78
  | sysTid=725 nice=0 sched=0/0 cgrp=apps handle=1610561992
  | state=S schedstat=( 0 0 0 ) utm=78 stm=67 core=0
  at java.lang.Object.wait(Native Method)
  - waiting on <0x41f55608> (a java.lang.VMThread) held by tid=35 (NetworkStats)
  at java.lang.Thread.parkFor(Thread.java:1205)
  at sun.misc.Unsafe.park(Unsafe.java:325)
  at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:197)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2056)
  at java.util.concurrent.ArrayBlockingQueue.poll(ArrayBlockingQueue.java:388)
  at com.android.server.NativeDaemonConnector$ResponseQueue.remove(NativeDaemonConnector.java:642)
  at com.android.server.NativeDaemonConnector.execute(NativeDaemonConnector.java:380)
  at com.android.server.NativeDaemonConnector.executeForList(NativeDaemonConnector.java:331)
  at com.android.server.NetworkManagementService.getNetworkStatsTethering(NetworkManagementService.java:1481)
  at com.android.server.net.NetworkStatsService.getNetworkStatsTethering(NetworkStatsService.java:1211)
  at com.android.server.net.NetworkStatsService.getNetworkStatsUidDetail(NetworkStatsService.java:1198)
  at com.android.server.net.NetworkStatsService.performPollLocked(NetworkStatsService.java:995)
  at com.android.server.net.NetworkStatsService.updateIfacesLocked(NetworkStatsService.java:877)
  at com.android.server.net.NetworkStatsService.updateIfaces(NetworkStatsService.java:854)
  at com.android.server.net.NetworkStatsService.access$600(NetworkStatsService.java:139)
  at com.android.server.net.NetworkStatsService$2.onReceive(NetworkStatsService.java:722)
  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:791)
  at android.os.Handler.handleCallback(Handler.java:733)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:136)
  at android.os.HandlerThread.run(HandlerThread.java:61)


  
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值