[RK3399][Android7.1] 调试笔记 --- 开机后台抓取kmsg log

Platform: RK3399
OS: Android 7.1
Kernel: v4.4.83

此功能在rk3288上有实现过,rk3399上脚本稍微有点差异。

  1. 记录文件生成时间,因为可能会遇到异常重启的情况,而文件的生成时间会随着Log的写入而更新。
  2. dmesg先保存前面的Log
  3. 每次开机会启动一次脚本,默认保留5次开机Log,kmsg_5.log为最新

改动如下:
system/core/rootdir/init.rc:

diff --git a/rootdir/init.rc b/rootdir/init.rc
index 3aa4426..30b823f 100644
--- a/rootdir/init.rc
+++ b/rootdir/init.rc
@@ -692,3 +692,8 @@ service syslog /system/bin/logcat -f /data/log/system.
<think>我们正在讨论的是Android 7.1系统中的/proc/last_kmsg文件,特别是与电池相关的信息。 根据引用[1]和引用[3],我们可以知道: 1. /proc/last_kmsg是系统最后一次内核消息的日志,通常在系统异常重启(如崩溃或看门狗复位)后,用于保存上次内核运行期间的日志。 2. 当系统异常重启时,如果DDR(内存)没有掉电,那么上次内核的日志会保留在内存中,然后通过/proc/last_kmsg可以读取到。 3. 如果读取/proc/last_kmsg时发现内容是乱码,则说明DDR掉过电了,即系统完全断电,日志丢失。 在电池相关的场景中,我们可能会遇到设备突然关机(比如电池电压过低导致系统强制关机)的情况。此时,如果我们想分析关机前的内核日志(可能包含电池电压的临界点、关机原因等信息),就可以查看/proc/last_kmsg。 但是,请注意,如果关机导致整个系统完全断电(包括DDR),那么last_kmsg将无法保存,因为它是存储在RAM中的。只有那些在重启过程中DDR没有掉电的重启(比如内核崩溃重启、看门狗复位等)才能保存last_kmsg。 因此,在电池电压过低导致的关机情况下,由于整个系统掉电,通常无法通过/proc/last_kmsg获取关机前的日志。不过,有些设备可能有特殊的机制(比如使用备用电源维持一小块内存)来保存关键日志,但这并不是标准做法。 位置: /proc/last_kmsg是一个虚拟文件,位于proc文件系统中。它在设备重启后(非完全断电重启)出现,正常关机再开机则不会出现(因为正常关机会清空这个日志)。 作用: 1. 调试系统异常重启(包括内核崩溃、看门狗复位等)的原因。 2. 记录重启前内核的日志,包括各种驱动(如电池驱动)打印的信息。 在电池问题调试中,如果设备因为电池电压过低而触发内核直接关机(且没有完全断电,比如电池还在但电压不足,设备进入某种保护状态而重启),那么我们可以尝试从/proc/last_kmsg中查找电池相关的日志(比如电池电压、关机触发点等)。 但是,如果设备完全断电(比如用户拔掉电池),则last_kmsg将丢失。 如何查看: 在设备重启后,通过adb shell或终端模拟器执行: cat /proc/last_kmsg 或者将文件导出到电脑: adb pull /proc/last_kmsg 注意事项: 1. 这个文件只在异常重启后存在,正常启动后不存在。 2. 如果系统重启多次,则last_kmsg只保存最近一次异常重启的日志。 因此,当遇到电池异常关机时,如果设备重启后存在/proc/last_kmsg,我们可以从中搜索电池相关的关键字(如"battery", "voltage", "shutdown"等)来分析关机原因。 引用[1]中提到了如果/proc/last_kmsg的内容是乱码,说明DDR掉过电了,这通常意味着完全断电(比如电池被移除或者电量彻底耗尽导致内存无法保持)。 引用[3]则解释了ram console的工作原理:内核日志除了输出到串口控制台(uart console)外,还会输出到ram console(一块保留的内存区域)。当系统崩溃重启时,ram console的内容会被保存下来,然后通过/proc/last_kmsg可以访问。 所以,在电池问题导致的重启中,如果重启类型是保持内存的(比如只是内核panic而硬件复位,但DDR仍保持上电状态),那么我们就可以看到last_kmsg。否则,如果是彻底断电,则看不到。 综上所述,/proc/last_kmsg在电池问题分析中的作用是有限的,因为电池问题往往导致完全断电。但我们可以尝试在设备支持保持内存的情况下(例如,设备有备用电池或者超级电容)利用它来获取信息。 相关问题: 1. 如何确保在电池耗尽时也能保存内核日志? 2. Android系统中还有哪些日志文件可以帮助分析电池问题? 3. 如何修改内核配置以增强电池日志的记录? 4. 除了last_kmsg,还有哪些方法可以获取系统崩溃前的状态?</think>在 Android 7.1 系统中,`/proc/last_kmsg` 是与电池问题诊断相关的关键日志文件,其作用和位置如下: ### 作用和功能 1. **内核崩溃日志记录** `last_kmsg` 保存系统**异常关机前**的内核环形缓冲区(ring buffer)日志,包括: - 电池电压骤降事件(如 `battery voltage critical`) - 硬件复位记录(如 `Watchdog reset`) - 温度保护触发(如 `thermal shutdown`) - 驱动错误信息(如 `battery driver fault`) 2. **电池问题诊断依据** 当设备因电池问题(如电压过低、温度异常)意外关机时,该文件可提供: ```bash [ 100.253] battery: voltage=3200mV < threshold=3400mV [ 100.257] Power: Shutdown triggered by battery! ``` 这类关键时间戳和电压值数据[^1]。 3. **DDR 电源状态指示器** 若文件内容为乱码,表明 DDR 内存已完全掉电(常见于电池彻底耗尽): ```bash cat /proc/last_kmsg # 输出乱码 => DDR 完全断电 ``` 正常日志则说明 DDR 保持供电(如软件复位)[^1]。 ### 文件位置和访问 - **物理路径**:`/proc/last_kmsg`(虚拟文件系统) - **生成条件**: - 仅当系统发生**非正常关机**(内核崩溃/硬件复位)时生成 - 正常关机(`poweroff`命令)不会生成该文件 - **查看方式**: ```bash adb shell su -c "cat /proc/last_kmsg > /sdcard/last_kmsg.log" adb pull /sdcard/last_kmsg.log ``` ### 工作原理 1. **双控制台机制**: 内核日志同时输出到两个终端: - UART 控制台(输出到串口) - RAM 控制台(驻留内存的环形缓冲区) $$ \text{kmsg} \rightarrow \begin{cases} \text{UART console} \\ \text{RAM console} \end{cases} $$[^3] 2. **异常关机保存流程**: ```mermaid graph LR A[异常关机] --> B[内核崩溃] B --> C[RAM控制台冻结] C --> D[下次启动时创建/proc/last_kmsg] ``` ### 注意事项 1. **设备需 root 权限**才能完整读取该文件 2. **日志覆盖风险**:系统重启后新日志会逐步覆盖旧内容 3. **厂商定制差异**:部分设备可能使用`/sys/fs/pstore/console-ramoops`替代 --- ### 相关问题 1. 如何区分电池耗尽关机与系统崩溃导致的 `/proc/last_kmsg` 生成? 2. 当 `/proc/last_kmsg` 显示乱码时,如何进一步诊断电池问题? 3. Android 系统如何配置 RAM 控制台的缓冲区大小? 4. 除 `last_kmsg` 外,还有哪些日志文件可用于分析电池异常关机? [^1]: 引用关于 `/proc/last_kmsg` 的 DDR 电源状态诊断说明 [^3]: 引用关于 RAM 控制台的双输出机制描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值