[Android稳定性] 第030篇 [问题篇] I2C bus hang 导致锁线程阻塞导致卡死 5月前查看 评论
[Android稳定性] 第030篇 [问题篇] I2C bus hang 导致锁线程阻塞导致卡死

本文分析了测试过程中出现的ANR问题,通过分析bugreport日志,发现大量内核线程卡在“不可中断睡眠”状态,表明线程正在等待I/O操作。进一步分析发现,问题可能出在电池/充电控制相关驱动上,因为涉及I²C通信和电源管理的模块出现异常。此外,fg_read_volt函数在I²C读失败后,会尝试重试,但可能因为互斥锁或I2C总线问题导致永久阻塞,进而引发系统内多个线程进入D状态。根本原因可能是I²C传输超时导致regmap_raw_read函数卡住或失败,进而导致fg_read_word和fg_read_volt函数卡住或多次失败,最终引发线程风暴。可能的原因包括硬件层面的I²C总线锁死、Fuel Gauge芯片异常、电池连接问题,以及软件层面的I²C驱动问题、多线程并发访问问题、I²C错误处理问题等。