2024-12-25
[Android稳定性] 第011篇 [原理篇] minidump的原理介绍补充
这篇文章主要介绍了Android系统中的minidump机制,这是一种用于保存系统崩溃信息的技术。文章首先解释了minidump的概念,即各个子系统在内存映射表中注册,当系统崩溃时,boot subsystem会加密并保存注册过的内存信息到RAM EMMC分区。 接着,文章详细描述了minidump的流程图和代码流程,包括HLOS侧和NON-HLOS侧的流程。在HLOS侧,文章重点介绍了defconfig配置、相关代码以及msm_minidump_add_region函数。在NON-HLOS侧,文章重点介绍了add_minidump_regions函数和boot_ram_dump_to_raw_parition函数。 文章还介绍了小米项目在minidump中增加的regions,包括md_kmsg、md_pmsg和tz_log,并解释了它们的设计原理。最后,文章介绍了如何验证minidump,包括设置minidump到emmc、触发dump以及从设备中拉取minidump。 此外,文章还介绍了minidump.gz的解析方法,包括解压minidump.gz和拆分minidump。
2024-12-23
[Android稳定性] 第010篇 [问题篇] 数组越界导致的内核panic
服务器打包的daily版本在刷机后出现900E口死机问题。通过分析dmesg日志,发现程序在`fts_set_cur_value`函数处异常终止。进一步使用trace32工具恢复现场,确认是由于`touch_mode`数组越界导致的内存访问错误。该数组最大值被定义为15,但实际使用时传入了100,导致严重异常。
2024-12-19
[Android稳定性] 第009篇 [问题篇] 数组越界导致的内核panic
**问题现象**: 部分机器插着 USB 后出现死机。 **问题分析**: 通过 `dmesg` 和 `trace32` 分析,发现死机原因是 `power_operation_mode_show` 函数中 `typec_port` 结构体的 `pwr_opmode` 成员值错误(为负数),导致数组越界。 **解决方案**: 更新 charger 模块,修复对 `pwr_opmode` 的误判,确保其值为正数,避免数组越界。 **总结**: 本次问题是由 `typec_port` 结构体的 `pwr_opmode` 成员值错误导致,通过分析定位问题,并更新 charger 模块修复了问题。
2024-12-19
[Android稳定性] 第008篇 [原理篇] 动态设置kernel cmdline
本文介绍了一种在fastboot模式下动态修改内核参数的方法,无需重新打包。首先,通过扩展fastboot oem指令,接收输入的内核参数并写入到devinfo分区中。然后,在更新kernel cmdline时,将保存的内核参数添加到cmdline中。实验测试显示,该方案可以成功修改内核参数,并永久生效。代码更新后,支持设置、追加和清除模式,方便用户根据需求进行操作。
2024-12-18
[Android稳定性] 第007篇 [问题篇] 中断风暴导致panic
问题摘要:系统日志显示irq 193存在异常,其action为0,表明中断未被注册,导致中断被送至`handle_bad_irq`处理。经查询,该中断对应gpio 93,且在设备树中该gpio被用于wusb3801的中断和复位功能。去除相关配置后,系统恢复正常。
2024-12-18
[Android稳定性] 第006篇 [问题篇] hungtask causing panic-死锁
本文讨论了一个系统问题现象,通过分析日志文件发现一个进程因等待锁而被阻塞120秒。通过使用`tace32`工具跟踪调用栈,发现存在一个三方的死锁情况,涉及进程`2848_9`、`crtc_commit:160`、`vendor.qti.came`和`kworker/u16:7`。文章详细展示了锁的持有者和调用栈信息,但未提供具体的解决方法。
2024-12-18
[Android稳定性] 第003篇 [原理篇] mtdoops的原理介绍
**mtdoops简介与原理总结** mtdoops是一种将系统崩溃时的日志信息保存到MTD(Memory Technology Device)设备中的机制,用于在系统panic时捕获关键信息。它利用MTD子系统,将崩溃日志转存到非易失存储器中,便于后续问题分析。mtdoops与其他捕获panic的方式(如ramoops和kdump)相比,具有特定优势,但需依赖MTD设备和相关配置。 **核心内容摘要:** - mtdoops通过在内核中注册捕获panic或oops,将日志信息保存到MTD设备。 - 需要在内核defconfig中启用相关配置,并在设备树中预留存储空间。 - 通过cmdline动态更新,确保在系统启动时正确配置mtdoops。 - 功能验证包括开机初始化log检查、cmdline确认及重启测试抓取log。 - offline_log机制可触发mtdoops日志抓取,便于问题诊断。
2024-12-18
[Android稳定性] 第005篇 [问题篇] 原子状态调度引起死机
本文讨论了在多核系统中因锁使用不当导致的死机异常问题。作者通过两个案例说明了当在原子状态下执行调度命令时会出现BUG,并分析了原因,指出使用全局变量来控制加解锁操作是多此一举且易出错的。文章强调应正确使用锁来保护临界区,避免使用全局变量来控制锁状态,以防止并发执行时的问题。
2024-12-18
[Android稳定性] 第004篇 [原理篇] minidump的原理介绍
Minidump是一种在系统崩溃时,将关键内存区域加密后保存至RAM或EMMC分区的机制,以便后续调试分析。文章详细解析了minidump的流程:系统各子模块会在内存映射表注册,崩溃时boot子系统通过检测特定寄存器(如TCSR寄存器)判断是否进入minidump流程,随后将内核日志、logcat及安全区域日志等关键区块存入特定分区。文中通过流程图、代码示例和寄存器地址详解,剖析了从检测寄存器值,到执行XBLRamDumpMain写入dump的完整过程,并指出通过简单配置可实现最小化、定制化的日志保存,极大提升了问题定位的效率。此外,文章特别强调小米定制适配方案,仅保留关键日志区,兼顾调试需求