2025-06-12
[Android稳定性] 第048篇 [原理篇] Android SWT机制介绍
深入解析Android System Server中的Watchdog机制,阐述其关键作用:防止核心服务和线程因死锁或长时间阻塞导致系统不可用,通过周期性Checker监控各大线程与服务,超时自动重启,保障系统稳定与用户体验。详细讲解Watchdog的启动流程、重要变量、核心线程监控逻辑和AMS集成
2025-06-11
[Android稳定性] 第047篇 [问题篇] Unexpected kernel BRK exception at EL1
**问题背景**:多款手机在启用移动热点功能后出现死机现象,涉及BUGO19-6212、BUGO19-6235和BUGO19-6210等多个JIRA问题。 **问题现象**:设备在启用热点后崩溃。经过测试,发现启用热点功能会导致设备死机,与预期不符。 **问题分析**:通过分析堆栈信息和汇编代码,初步判断问题为数组越界。寄存器W26的值超出数组最大值,导致数组越界,进而触发BRK异常。 **wlan模块分析**:在wlan模块中,存在两个for循环,重复复制了同一批非indoor信道,导致pcl_len值翻倍,超出数组最大值。 **解决方案**:删除第二个for循环,避免重复复制信道,从而解决数组越界问题。
2025-06-09
【深入内核】linux ftrace详解
本文主要介绍了Ftrace(Function Tracer)的概念、实现原理和使用方法。Ftrace是Linux内核自带的轻量级跟踪框架,用于记录内核内部发生的事件与函数调用,帮助开发者洞察系统最深处的执行路径、时序瓶颈与异常行为。文章详细阐述了Ftrace的实现原理,包括静态插桩和动态插桩两种方式,并介绍了Ftrace的开启方法,包括设置tracer类型、设置tracer参数、使能tracer、进行测试和提取trace结果等步骤。此外,文章还介绍了常见的trace event详解和特别注意点,如能够使用adb和开机过程中死机的情况。
2025-06-04
[Android稳定性] 第046篇 [方法篇] 如何使用trace32恢复AOP现场?
本文介绍了使用hansei工具解析AOP/RPM及使用trace32恢复AOP现场的方法。首先获取hansei工具,安装依赖库后执行工具,输入相关路径生成文件。然后进行恢复前的准备工作,包括下载T32脚本和准备相关文件。最后,通过执行aop_rpm_load.bat文件,选择正确的cmm文件开始恢复。
2025-06-04
[Android稳定性] 第045篇 [问题篇] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00007f00
本文分析了在测试DDR TT和Reboot测试专项过程中机器出现dump的问题。通过panic现场和加debug patch的分析,发现死机原因是ufs没有初始化成功,函数`ufshcd_complete_dev_init`耗时过长。进一步分析发现,`kworker/6:1`线程在执行`kfree_rcu_monitor()`时被调度出去,并长时间卡在`schedule()`中,最终导致死机。根本原因是在ufs函数执行时被串口输出调度出去,而串口输出调度优先级很高,执行console_unlock()时持锁状态下运行,不允许调度,且阻塞式串口写函数`qcom_geni_serial_poll_tx_done`会造成长时间占用CPU。
2025-05-31
linux-dead-lock-detect-lockdep
死锁是多进程或线程因相互等待资源而导致系统阻塞、难以自我恢复的严重问题。Linux 内核区分 D 状态死锁(因 I/O 资源长时间等待导致局部进程间互锁,多表现为系统冻结)和 R 状态死锁(进程占用 CPU 不释放,可能引发全局系统调度失败及看门狗复位)。常见死锁类型包括重复上锁、ABBA 顺序反复上锁等,尤其是 AB-BA 死锁,最易因多线程错拿锁顺序形成。为应对复杂内核环境中的死锁风险,lockdep 死锁检测模块应运而生,通过跟踪锁类以及各锁类的依赖链,提前发现潜在死锁风险并进行详细状态分析。
2025-05-31
[Android稳定性] 第044篇 [问题篇] Unable to handle kernel write to read-only memory at virtual address
在老化测试中,多台机器出现黑屏问题,主要现象为使用9-11版本时,27台机器中有25台因USB问题导致dump,且问题多出现在使用33瓦充电器时。通过LOG分析,问题出现在45次重启测试中。dmesg日志显示,问题源于内存异常踩踏,具体为操作了空指针地址的结构体成员。 根本原因分析表明,在dwc3_msm模块中,存在一个空指针赋值操作,导致数据写入异常地址。解决方案建议对涉及空指针的代码进行兼容性处理,并在gerrit上提交了相关代码修改。
2025-05-30
[Android稳定性] 第042篇 [问题篇] 数组越界导致的Unexpected kernel BRK exception at EL1
在reboot压力测试中出现一台设备死机,分析发现是由于函数 `fg_mac_read_block` 在处理数据时,没有对数组长度进行范围限制,导致数组越界,触发 `Unexpected kernel BRK exception at EL1` 异常,最终导致设备死机。通过分析汇编代码和寄存器状态,确定问题根源并提出了修复方案,即在读取数据后增加对长度的判断,防止数组越界。同时,引申出对 `trace32` 解析结果和编译器优化行为的思考,强调了在实际调试中应结合寄存器状态进行分析,并注意编译器可能进行的优化。
2025-05-20
[Android稳定性] 第041篇 [问题篇] Unable to handle kernel paging request at virtual address 00046ffca9037bf9
系统在休眠过程中发生死机,核心原因在于disp_feature/disp-DSI-0模块的异常。分析日志发现display初始化流程被电源键中断函数非正常触发,导致初始化时出现竞争。两个线程并发执行display相关操作,其中T710线程通过pwrkey的irq触发,导致多次试图注册disp_feature设备,引发sysfs重复命名报错(-EEXIST),随后proc目录下相关内容未能正确清理并产生资源泄漏。整个流程暴露出display初始化与电源键中断处理耦合过紧、并发管理不合理、设备注册机制缺陷等问题,易导致系统异常或内核崩溃。