ANR --- Application No Response)。发生ANR时,会生成/data/anr/traces.txt 来记录系统中各进程的状态。对于由锁LOCK造成的ANR,可以由traces文件看出一些有用信息。
首先找各进程在等待哪个lock,可以搜索held by
由上面 可以看到,有线程在等待某个lock,该lock被tid=35 (NetworkStats)持有。再看看tid=35 (NetworkStats)的状态,然后检查一下各函数找原因:
首先找各进程在等待哪个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)