Android-服务阻塞调试小技巧

最近遇到好几起系统服务阻塞,导致应用ANR的问题。
还好胖增找到一个调试此类问题的技巧:打印服务进程的堆栈信息。
服务阻塞一般来说有两种情况:1. 耗时工作。 2. 死锁。
如果我们单纯从 logcat 日志分析的话,有时候感觉无从下手。
如果我们能从服务进程的内部窥视服务内部到底都在干什么的话,那我们就能够快速找到问题的原因了。
打印进程堆栈信息的目的就是为了能够窥视服务内部到底在干什么活。
堆栈信息描述了某个进程的所有线程的执行状态,是空闲,还是在执行某段代码,还是等待某个锁。
我们有两种方法来触发进程堆栈信息的打印。

  • kill -3 $pid
    这种方法适用于 java 进程, 比如 system_server 进程。
    使用这个命令后,会在 /data/anr 下生成 trace 文件。

  • debuggerd -b $pid
    这种方法适用于 native 进程,比如 audioserver 进程。
    使用这个命令后,直接在终端输出进程的堆栈信息了