背景
Android应用开发过程中,主线程的问题通常比较好处理,主线程拥有ANR机制,ANR有详细的栈信息。
但子线程是允许长时间睡眠的,但也存在子线程不明原因导致一直在睡眠的情况。
必要时需要对线程问题进行分析,例如:游戏引擎等使用到GL主线程,GL主线程画面卡死了,一般遇到这种情不知道如何下手分析,况乱猜原因的比较多;
可利用的工具笔记
除了会打Log,可以利用现成工具尽可能的获取线程信息;
备注:packageName代表包名,pid代表进程id,pid代表线程id;
- 获取进程号pid
adb shell ps | grep packageName | awk '{print $2}'
- 列出进程的所有线程
adb shell ps -T -p pid
- 实时监控进程的线程调度情况
adb shell top -H -p pid
- 查看线程的调度情况
adb shell cat /proc/pid/task/tid/sched
其中时间字段展示的单位为微妙(小数点前),小数点后面部分展示到纳米;
- 查看线程的栈(但不能展示虚拟机层的栈信息)
adb shell cat /proc/pid/task/tid/stack
另外:/proc/pid/task/tid/目录还有其他的信息可利用;
- [有Root权限]获取进程的所有线程栈信息
adb root
adb shell debuggerd -j pid