这个功能的实现是同事完成的。我阅读了他的代码后,整理了文档。
基本思路
- 注册panic notifier callback,当发生panic时,触发panic处理函数。
- 获取一块连续的内存,用于保存panic console,thread log。
不使用文件系统,以防止是由于文件系统导致的系统panic。- 系统触发warm reset,由于不掉电,内存信息得以保持 。
- qcom平台会在sbl中通过boot_sahara_entry, 进入ramdump模式保存发生系统crash时的ram。
可以在此之前,将内存中保存的panic再次保存起来,此时由于文件系统没有准备好,所以可以添加一个
分区专门用来保存panic中的信息。- 系统重新启动后,可以读取panic分区中的信息,如果有panic信息,自动读取并生成文件到文件系统中
- 这时就可以读取log,分析问题了。
代码实现
1 . kernel 代码添加
注册panic notifier callback,可以参考msm-poweroff.c中关于记录restart_reason的实现
- device_initcall(panic_handler_init);
注册一个initcall- atomic_notifier_chain_register(&panic_notifier_list, &panic_blk);
注册panic发生时的回调函数- drv_ctx.apanic_log = (void *)__get_f