记32位android在64bit环境下运行一段时间后应用会卡住显示黑屏的问题排查.md

描述

64bit环境中运行32位android系统,经常遇到运行一段时间之后,打开大部分软件会出现卡死,屏幕黑掉的问题

分析解决

  1. 运行一段时间会出现黑屏,所以怀疑为资源不足,排查方向为CPU/内存/进程数等限制,经过检查未发现问题;
  2. 怀疑是某个没被关注的点不满足要求,增加日志,通过调测发现经常出现futex的错误,但是没有引起足够关注,依旧关注在内存使用上;
  3. 发现设置应用中显示的内存使用数据不对,发现meminfo中数据不对,后修复后,问题没有解决。
  4. 怀疑内存长时间拷贝导致出现问题,测试程序模拟不断进行内存拷贝,发现大内存拷贝会奔溃,后发现存在单个进程最大使用内存限制,不是黑屏原因。
  5. 怀疑是binder不够用,测试程序模拟不断申请binder调用,排查binder释放是否正常,结果显示正常。
  6. 后发现正常情况下pid会在超过65535后恢复到1重新使用,而生产环境最大限制已经调高。经过测试发现,PID使用超过该阈值后就很容易触发问题,而在未超过时不会出现问题。
  7. 是trace跟踪pid触发问题时的堆栈调用情况发现,报错信息依旧为futex部分卡主,结合之前也有发现这个问题,调整排查方向。
  8. 经过分析对比,问题确定为mutex部分可能导致黑屏问题,并且确认该问题为已存在问题32-bit ABI bugs - pthread_mutex_t is too small for large pids
  9. 经过研究分析,32bit android中的bionic的tid字段长度为16位,且无法扩展,官方在后续提交的PIMutex的patch并不能解决这个问题,根据这个patch,写了一个tid映射匹配的方案,测试发现解决了大部分问题,在学习强国等少数应用依然无法解决,在排查了常量初始化mutex可能存在的问题后,问题依旧。
  10. 从确保获取到的tid不超过65535,研究代码发现,这部分的实现是利用了kernel的cgroup来实现隔离,利用pidns来实现不同ns的pid分配隔离问题,后尝试修改pid分配机制,解决问题。

KERNEL PATCH下载地址

你可能感兴趣的:(Android,Linux)