android anr 信息收集,浅谈 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)

Android界面设计适配不同屏幕的尺寸和密度解读

Android是运行在各种提供不同的屏幕尺寸和密度的设备。Android系统提供跨设备的统一开发环境和处理大部分的工作,以调整每个应用程序的用户界面,以

Android客户端通过socket与服务器通信

下面是一个demo,Android客户端通过socket与服务器通信。由于Android里面可以完全使用java.io.*包和java.net.*包,那么,实际上,逻辑部分与J2SE没有区别。只是UI

Android中shape的使用,设置圆角等等的效果

本人在美工方面一直是比较白痴的,对于一些颜色什么乱七八糟的非常头痛,但是在Android编程中这又是经常涉及到的东西,没办法,只有硬着头皮上。A

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值