0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用Last Log(Ramoops)排查系统问题:配置与实践指南

jf_44130326 来源:Linux1024 2026-02-05 13:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

嵌入式系统(如基于瑞芯微RK3399Android设备)开发或维护中,系统常因内核崩溃(Panic)、用户空间异常等突发情况重启,导致关键日志丢失。此时,Last Log(依托Linux内核的ramoops机制实现)可在系统异常时保存核心日志,为事后故障分析提供关键依据。本文将详细介绍其配置方法与问题排查实践,并通过具体案例演示实战流程。

wKgZO2kajEOATXDkAACAZ1qoMz8050.png

一、Last Log的核心:Ramoops机制

ramoopsLinux内核的一项功能——它会预留一段固定内存区域,当系统发生异常(如内核Panic、意外重启)时,自动将关键日志(内核日志、用户空间日志、函数追踪等)写入该区域。由于这段内存的特殊性,系统重启后数据不会丢失,可通过/sys/fs/pstore目录访问这些遗留日志,进而分析故障根因。

二、配置Ramoops,启用Last Log

要启用Last Log,需在**设备树(DTS**中添加ramoops相关节点,为其分配内存并定义日志参数。

2.1设备树节点添加

在设备树源文件(.dts)中,添加以下两个节点(需根据硬件内存布局调整参数):

ramoops_mem: ramoops_mem {  reg = <0x00x1100000x00xf0000>; /* 预留内存的起始地址与大小 */  reg-names ="ramoops_mem";    /* 内存区域命名,供后续引用 */};ramoops {  compatible ="ramoops";      /* 与内核ramoops驱动兼容 */  record-size = <0x00x20000>;   /* 单个日志记录的大小 */  console-size = <0x00x80000>;   /* 内核控制台日志(last_log)的空间 */  ftrace-size = <0x00x00000>;   /* 函数追踪(ftrace)日志的空间 */  pmsg-size = <0x00x50000>;    /* 用户空间日志(如Android logcat)的空间 */  memory-region = <&ramoops_mem>;  /* 引用上面定义的内存区域 */};

2.2节点参数详解

ramoops_mem节点:负责定义预留内存区域

reg = <起始地址 地址长度...>:指定内存的起始地址与大小(需确保该区域不与其他模块内存冲突)。

reg-names = "ramoops_mem":为内存区域命名,方便ramoops节点引用。

ramoops节点:负责配置ramoops的行为。

compatible = "ramoops":声明与内核ramoops驱动兼容,确保驱动能识别并使用该节点。

record-size/console-size/ftrace-size/pmsg-size:分别指定单条日志”“内核控制台日志”“函数追踪日志”“用户空间日志的预留空间大小。

memory-region = <&ramoops_mem>:指定日志存储的目标内存区域(即前面定义的ramoops_mem)。

三、查看与解析Last Log

系统重启后,可通过/sys/fs/pstore目录访问Last Log文件。不同文件对应不同类型的日志,需结合场景选择查看。

3.1访问日志文件

通过命令行进入/sys/fs/pstore目录,列出所有日志文件:

cd/sys/fs/pstorels

RK3399设备为例,通常会看到以下文件(不同场景下文件存在性不同):

dmesg-ramoops-0内核Panic后保存的日志,记录内核崩溃前的关键调用栈、错误信息。

pmsg-ramoops-0用户空间日志(如Android系统的logcat日志),记录应用、系统服务的运行信息。

ftrace-ramoops-0函数追踪(ftrace)日志,记录指定时间段内的函数调用流程,用于性能分析。

console-ramoops-0上次启动的内核日志(last_log,但仅保存优先级高于默认日志级别的日志。

3.2日志查看命令

根据日志类型,使用不同命令查看内容:

查看内核Panic日志

catdmesg-ramoops-0

查看上次内核高优先级日志(last_log

catconsole-ramoops-0

解析用户空间日志(如Android logcat

logcat-L pmsg-ramoops-0

(通过logcat工具解析后,日志格式更符合Android开发习惯)

查看函数追踪日志

catftrace-ramoops-0

四、实战:用Last Log排查典型问题(含具体案例)

以下通过内核空指针、Android应用ANR、驱动初始化失败三个典型场景,演示Last Log的排查流程。

案例1:内核空指针解引用导致系统Panic重启

现象:设备运行过程中突然黑屏重启,无明显操作触发。

排查步骤

1.系统重启后,进入/sys/fs/pstore目录,查看内核Panic日志:

catdmesg-ramoops-0

1.日志关键内容(示例):

Kernel panic - not syncing: Null pointer dereferenceCPU: 0 PID: 1234 Comm: problem_process Tainted: G    W ...Call trace:[<ffffffc0002a3450>] dump_backtrace+0x0/0x180[<ffffffc0002a3830>] show_stack+0x10/0x20[<ffffffc000a55080>] dump_stack+0xd8/0x134[<ffffffc0002f4f2c>] panic+0x18c/0x334[<ffffffc0000a2b50>] __do_page_fault+0x3a0/0x480...[<ffffffc0008b1234>] problematic_driver_function+0x20/0x80 [problematic_driver]

1.分析:日志中Null pointer dereference明确存在空指针解引用问题;Call trace的堆栈追踪显示,故障源于problematic_driver模块的problematic_driver_function函数。由此可定位到该驱动存在未正确初始化指针就解引用的代码逻辑问题,需修改驱动代码(如增加指针有效性检查)并重新测试。

案例2Android应用频繁ANR(应用无响应)

现象:某社交应用打开后几秒内提示应用无响应,强制关闭后再次打开仍异常。

排查步骤

1.应用触发ANR后,进入/sys/fs/pstore目录,解析用户空间日志:

logcat-L pmsg-ramoops-0

1.日志关键内容(示例):

09-2214:30:00.12312345678E AndroidRuntime: FATAL EXCEPTION: main09-2214:30:00.12312345678E AndroidRuntime: Process: com.example.social, PID:123409-2214:30:00.12312345678E AndroidRuntime: java.lang.RuntimeException: ANR in com.example.social...09-2214:30:00.12312345678E AndroidRuntime: Caused by: android.os.DeadlineExceededException: Main thread idle timeout of5seconds expired...09-2214:30:00.12312345678E AndroidRuntime: at com.example.social.MainActivity.loadLargeImageSync(MainActivity.java:123)

1.分析:日志中ANRDeadlineExceededException表明主线程因耗时操作被阻塞;调用栈显示,MainActivityloadLargeImageSync方法(同步加载大图片)导致主线程卡顿超过5秒。需将该方法改为异步加载(如使用AsyncTask或线程池),避免主线程被长时间占用。

案例3:设备启动卡在logo界面,驱动初始化失败

现象:设备上电后,屏幕一直停留在厂商logo界面,无法进入系统。

排查步骤

1.强制重启设备(或等待自动重启)后,进入/sys/fs/pstore目录,查看高优先级内核日志:

catconsole-ramoops-0

1.日志关键内容(示例):

[  2.345678] problematic_driver: probe of1-001a failed witherror-110[  2.345789] platform12340000.device: Driver problematic_driver failed to probe[  2.345890] Kernelpanic- not syncing: Essential driver failed to initialize

1.分析:日志中probe of 1-001a failed with error -110表明problematic_driver在探测硬件设备(I2C地址1-001a)时失败(错误码-110对应操作超时);且该驱动属于核心驱动,直接导致内核Panic。需检查两方面:

硬件层面:确认I2C设备是否存在、供电是否正常、硬件连线是否松动;

驱动层面:修改驱动的探测超时时间,或增加硬件存在性检测逻辑。

五、总结

通过配置ramoops启用Last Log,能在系统异常时留存关键日志,为嵌入式系统(尤其是无持久化日志存储的场景)的问题排查提供有力支持。结合/sys/fs/pstore下的不同日志文件,可覆盖内核Panic、用户空间异常、性能追踪、启动故障等多个维度的分析;再通过现象-操作-日志分析-根因定位的实战流程,能高效解决各类系统问题,是提升系统稳定性的核心调试工具。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式系统
    +关注

    关注

    41

    文章

    3817

    浏览量

    133864
  • 内核
    +关注

    关注

    4

    文章

    1474

    浏览量

    43088
  • 瑞芯微
    +关注

    关注

    27

    文章

    841

    浏览量

    54647
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    恩智浦解读Zephyr log系统的使用 Zephyr的shell和log功能介绍

    之前 我们从 0 开始新建了一个简单的 Zephyr 应用- 从0开始打造属于自己的HelloWorld ,本期就 带着大家熟悉一下 Zephyr 的 shell 和 log 系统。 首先给大家介绍
    的头像 发表于 02-27 09:19 2224次阅读
    恩智浦解读Zephyr <b class='flag-5'>log</b><b class='flag-5'>系统</b>的使用 Zephyr的shell和<b class='flag-5'>log</b>功能介绍

    全栈开发进阶指南:LuatOS-log库从入门到实战!

    本文将带你深入探索LuatOS系统log库的核心原理与实战技巧,通过代码示例解析日志管理、错误追踪及性能优化的最佳实践,助力全栈工程师构建更稳健的物联网应用。 今天,我们一起来认识LuatOS
    的头像 发表于 05-15 16:12 2993次阅读
    全栈开发进阶<b class='flag-5'>指南</b>:LuatOS-<b class='flag-5'>log</b>库从入门到实战!

    高速PCB布线实践指南

    高速PCB布线实践指南_(上)
    发表于 08-20 16:26

    机器学习实践指南——案例应用解析

    机器学习实践指南——案例应用解析
    发表于 04-13 16:40

    高速PCB布线实践指南

    高速PCB布线实践指南
    发表于 06-12 21:52

    Flink on YARN(下):常见问题与排查思路

    4j 的初始化和详细加载流程:export JVM_ARGS="-Dlog4j.debug=true"▼ 客户端疑难问题排查思路当客户端日志无法正常定位时,可以修改 log4j 配置文件将
    发表于 10-10 14:14

    Flink on YARN(下):常见问题与排查思路

    log4j 配置文件将日志级别由 INFO 改为 DEBUG 后重新运行,看是否有 DEBUG 日志可以帮助排查问题。对于一些没有日志或日志信息不完整的问题,可能需要开展代码级调试,修改源码重新打包替换
    发表于 10-14 15:04

    谈一谈Firefly Android系统的功能

    /pstore目录下:console-ramoops-0 : last_log 上次启动的 kernel log,但只保存里优先级比默认 log level 高的 logpmsg-
    发表于 07-08 14:59

    分享几种RK3399开启ramoops查看kernel log的方法

    ;;memory-region = <&ramoops_mem>;};方式二:make menuconfig 配置$ make
    发表于 11-14 18:04

    自动化测试系统的最佳实践指南秘籍

    自动化测试系统的最佳实践指南秘籍 ,学习资料。
    发表于 03-21 16:02 0次下载

    Linux系统命令及shell脚本实践指南

    Linux系统命令及shell脚本实践指南资料下载。
    发表于 06-01 14:47 29次下载

    嵌入式系统log模块设计

    对于开发嵌入式系统的工程师来说,log功能无疑是非常重要的功能模块。这里讲讲嵌入式系统log模块的基本设计框架。1、可以方便设置从不同的硬件接口输出
    发表于 11-03 17:51 13次下载
    嵌入式<b class='flag-5'>系统</b><b class='flag-5'>log</b>模块设计

    【C语言进阶】利用assert高效排查你的C程序

    【C语言进阶】利用assert高效排查你的C程序
    的头像 发表于 08-31 13:27 3483次阅读

    Linux主机排查脚本介绍

    _analysis.py out.txt  #进行指定输出至out.txt   查看输出 cat out_log_analysis.txt  在配置文件中添加需要执行的命令 vim log.cfg 可以在定时任务中设置每天
    的头像 发表于 06-28 09:44 1134次阅读
    Linux主机<b class='flag-5'>排查</b>脚本介绍

    嵌入式Linux上使用Ramoops的代码应用

    ramoops 还没有配置完成,需要在 device tree里创建对应的节点。在这之前先确定在内存中可以为 ramoops 预留的地址空间。在 Linux 运行下面命令。
    的头像 发表于 12-06 11:18 2018次阅读
    嵌入式Linux上使用<b class='flag-5'>Ramoops</b>的代码应用