Android死锁处理

什么是死锁

Android死锁处理

android死锁的处理方式

Android系统的Framework层有一个WatchDog用于定期检测关键系统服务是否发生死锁。WatchDog功能主要是分析系统核心服务和重要线程是否处于Blocked状态。

源码见:WatchDog

基本原理就是定期轮询检测系统中核心的线程的状态
检测到卡死后,将相关对应的线程,进程及其他软硬件信息输出。

Android开发过程中死锁分析方法

在Android开发中最容易碰到的死锁表现形式ANR。产生ANR的原因很多,死锁只是其中一种。如果ANR发生,对应的应用会收到SIGQUIT异常终止信号,dalvik虚拟机就会自动在/data/anr/目录下生成trace.txt(Android8.1以后文件名不是这个了)文件,这个文件记录了在发生ANR时刻系统各个线程的执行状态,trace文件中记录的线程执行状态详细描述了各个线程加锁等待的情况,通过分析,可以相对容易的找到发生死锁所在的线程及代码。

anr的情况下主线程死锁导致的问题,可以通过ANR的trace文件分析,如果是非主线程呢,这种死锁一般很难察觉,但是这种死锁有时候也会造成很严重的后果,因为线程可能一直在占用某些资源,比如端口,数据库连接,文件句柄等。对于普通的java程序,JVM提供了jstack工具,可以将线程信息dump出来进行分析。虽然Android系统中没有提供类似jstack的工具,但是下面有两种方法来检查是否有线程发生死锁。

使用Android Studio的调试工具

首先通过工具栏Run->Attach to Process 或者快捷入口
Android死锁处理
,将App的进程attach进去。
然后在Android Debugger窗口中,找到Get Thread Dump按钮,点击后,稍等片刻,Androd Studio就会将对应调试进程的线程堆栈信息dump出来。
Android死锁处理
下图就是得到的线程信息,这样就可以分析线程中的死锁了。
Android死锁处理

借助ANR机制

Android应用发生ANR时,系统会发出SIGQUIT信号给发生ANR的进程。发现被监控线程卡死时,可以主动向系统发送SIGQUIT信号,使/data/anr/traces.txt文件生成,这样可以得到一个和ANR日志相同的线程堆栈信息,用来分析是否发生了死锁的问题。

例子如下:

首先通过ps命令拿到想要进行分析的进程id

adb shell ps | grep com.sohu.sohuvideo

Android死锁处理

这取主进程 id : 22841,执行如下命令

adb shell run-as com.sohu.sohuvideo kill -3 22841

紧接着会在logcat中看到日志 com.sohu.sohuvideo I/.sohu.sohuvide: Wrote stack traces to ‘[tombstoned]’,这时我们的trace文件便已经生成好了(这里需要注意Android8.1之前输出的日志为 Wrote stack traces to traces.txt)。

  • run-as 命令需要在debug包才能使用,Release包不能使用。

Android8.1之前的系统,通过 adb pull /data/anr/traces.txt 命令直接将文件拿到了,8.1之后系统trace文件便没有权限直接可以拿到了。通过adb shell直接进入手机目录查看发现,可以发现申城的dump文件为dumptrace_YbVvLP,。
Android死锁处理
使用下面的命令可以导出对应的文件。

adb shell cat /data/anr/dumptrace_YbVvLP > ~/Desktop/dump

refers:

https://zhuanlan.zhihu.com/p/152049739

上一篇:调用WCF REST服务时,使用JSON


下一篇:【技术干货】如何评价一款 App 的稳定性和质量?