问题描述:APP在nubia Z17mini 手机上(RAM4 ,ROM 64, Android6.0.1 ,已Root)出现一个很神奇的问题,页面不刷新了,页面上所有控件都可点击(因为有点击提示音),但是无任何反应。其中有两个按钮,一个是点击后是可以弹个Toast,一个是点击后是可以页面跳转。超级神奇 主线程卡死却没有ANR的BUG?

问题排查

1. 是ANR吗

首先想办法杀死进程,网上搜了好多贴了, 说如果app是因为死锁或者主线程被wait了,可以使用 kill -3 这条命令,然后生成anr文件, 看一下ANR文件夹下有文件吗?

1、root版手机启动该应用 让测试复现问题 然后赶紧插上
2、 adb shell				(进入系统)
3、 su						(获取权限)
4、ps grep "APP的包名"  		(获取自己app的pid)
5、kill -3 pid   			(杀死进程)
6.1、cd data/anr				(进到anr 文件下)
7、ls						(查看文件夹下所有文件)
8、cat "文件名"	
或者 6.2、 pull data/anr/traces/txt d:anr    (把anr文件导出到电脑端,也是我的方案)

不出意外的话肯定有意外

意外一: kill -3的命令 输入后根本没反应 我直接 kill <进程id>
意外二:导出的anr 日志有很多,却没有当天的

从众多anr日志里 查找关键字 DALVIK 很欣慰,有一个日志里找到了,大体如此

suspend all histogram:	Sum: 4.218ms 99% C.I. 0.340us-3238.079us Avg: 127.818us Max: 3802us
DALVIK THREADS (98):
1 "nioEventLoopGroup-2-7" prio=10 tid=11 Runnable
2  | group="main" sCount=0 dsCount=0 obj=0x137c1100 self=0x7f99d09000
3  | sysTid=14121 nice=-8 cgrp=default sched=0/0 handle=0x7f7983a440
4  | state=R schedstat=( 2030124236 313835610 38718 ) utm=55 stm=148 core=3 HZ=100
5  | stack=0x7f79738000-0x7f7973a000 stackSize=1037KB
6  | held mutexes= "mutator lock"(shared held)
  at libcore.reflect.GenericSignatureParser.scanIdentifier(GenericSignatureParser.java:507)
  at libcore.reflect.GenericSignatureParser.parseClassTypeSignature(GenericSignatureParser.java:312)
  at libcore.reflect.GenericSignatureParser.parseClassSignature(GenericSignatureParser.java:234)
  at libcore.reflect.GenericSignatureParser.parseForClass(GenericSignatureParser.java:126)
  at java.lang.Class.getGenericSuperclass(Class.java:993)
  at io.netty.util.internal.TypeParameterMatcher.find0(TypeParameterMatcher.java:96)
  at io.netty.util.internal.TypeParameterMatcher.find(TypeParameterMatcher.java:68)
  at io.netty.handler.codec.MessageToByteEncoder.<init>(MessageToByteEncoder.java:73)
  at io.netty.handler.codec.MessageToByteEncoder.<init>(MessageToByteEncoder.java:55)

拓展

第1行:
“Signal Catcher”:线程名称,daemon:是否是daemon线程(如果不是,则不打印“daemon”),prio=5:java线程Thread对象中的优先级,tid=3:vm中对应的 threadid,Runnable:线程在虚拟机中的状态;(如果当前线程没有attach,则第一行显示: “name” prio=num (not attached));
第2行:
group: ThreadGroup,sCount: Suspend count, dsCount: debugger suspend count(小于等于sCount),obj:对应java线程 java.lang.Thread对象,self:native 对应的 thread 指针;
第3行:
sysTid:对应linux线程 tid, nice:线程调度执行优先级,cgrp: cgroup,cpu调度group,sched:调度策略和调度优先级,handle:当前线程对应的pthread_t
第4行:
state:linux线程的状态,schedstat:线程调度情况,utm=15:线程在用户态运行的时间, stm=6:线程在内核态运行的时间, core=4:线程最后运行在哪个cpu上, HZ=100:系统时钟频率
state=R 任务的状态,R:running, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:dead
第5行:
stack=0x7fa1f14000-0x7fa1f16000 stackSize=1005KB
线程栈的start 和 end,以及 stack size;
第6行:
held mutexes= “mutator lock”(shared held)
线程持有的当前虚拟机中的mutex的名称,及持有方式:shared held: 共享锁,exclusive held:独占锁;
每个线程在完成suspend时,都会把 “mutator lock”释放;
实际上,Suspend所有线程时,判断是否suspend完成,就是通过获取"mutator lock"独占锁来判断的,
如果能获取独占锁,说明其他线程都不再 独占/共享 持有 “mutator lock” ,说明所有线程suspend已经完成。

关键词 解释
prio 优先级
tid 线程id
group 组名
sCount 挂起次数
dsCount 调试下 挂起计数
obj 同辈线程对象
self 当前线程对象
sysTid 线程id
nice 进程优先级
sched 调度者优先级
cgrp 调度者组名
handle 线程缓存句柄
state native线程状态
schedstat 调度者状态
utm 用户态CPU时间
stm 内核态CPU时间
core 运行所在核

结论未完待ing

学了点东西,问题没解决