andorid机器显示是卡死.但是终端可以输命令,故底层没有死机.
输入:top -t -m 5
结果显示System_server进程的GC线程一直占用50%
是system_server的GC线程卡住.由于android系统再GC时会挂起其他的线程,故造成andorid上层假死机的现象.
查询命令:debuggred -B 205(system_server进程号)
此命令可以打印出进程中所有线程的当前访问时的cpu执行代码地址.我们执行了300次,取得当前卡死的机器,system_server进程的GC线程执行情况:
"GC" sysTid=208
#00 pc 0007247a /system/lib/libdvm.so (mspace_inspect_all+103)
#01 pc 000726fd /system/lib/libdvm.so
#02 pc 000727a1 /system/lib/libdvm.so
#03 pc 00054969 /system/lib/libdvm.so
#04 pc 0000d248 /system/lib/libc.so (__thread_entry+72)
#05 pc 0000d3e0 /system/lib/libc.so (pthread_create+240)
通过命令:arm-eabi-addr2line -e out/target/product/panther_b20b/symbols/system/lib/libdvm.so -f -C 0007247a
执行结果:internal_inspect_all
/work/source/B20B/dalvik/vm/alloc/../../../bionic/libc/upstream-dlmalloc/malloc.c:5175
此命令是根据pc的地址,可以定位具体再libdvm.so的哪行代码.通过此方法我们对300个地址进行了去重复的操作,最后得出的结果:
/home/wuheng/work/b20b/dalvik/vm/alloc/../../../bionic/libc/upstream-dlmalloc/malloc.c:5174
/home/wuheng/work/b20b/dalvik/vm/alloc/../../../bionic/libc/upstream-dlmalloc/malloc.c:5175
/home/wuheng/work/b20b/dalvik/vm/alloc/../../../bionic/libc/upstream-dlmalloc/malloc.c:5180
/home/wuheng/work/b20b/dalvik/vm/alloc/../../../bionic/libc/upstream-dlmalloc/malloc.c:5181
/home/wuheng/work/b20b/dalvik/vm/alloc/../../../bionic/libc/upstream-dlmalloc/malloc.c:5192
/home/wuheng/work/b20b/dalvik/vm/alloc/../../../bionic/libc/upstream-dlmalloc/malloc.c:5194
当时卡死的车机,发现是GC时,一直再这些行的代码上进行死循环的跑.没有能break出来.
具体的代码:
请大神帮忙分析以下,为什么在此while里面没有break出来,谢谢.