本篇文章主要介绍展讯平台手机开发中的部分重启问题知识点,通过阅读本篇文章,您将收获以下内容:


一、 User 版本 默认开启 sysdump 方法
二、插入SD卡 抓取Sysdump log
三、 sysdump log 分析
四、展讯平台抓取重启 串口log的方案
五、展讯平台判断重启类型
六、展讯平台关闭 sysdump 与watchdog关联
七、展讯平台手动触发sysdump 方法


一、 User 版本 默认开启 sysdump 方法

首先,为什么要这么干?

主要原因是,展讯平台部分重启问题,同样的代码,​​userdebug​​ 版本无法复现,​​User​​ 版本 可以复现,这样才有此默认开启​​sysdump​​的方案。

那么展讯平台​​user​​​版本默认开启​​sysdump​​ 方案

修改一下代码

​device\sprd\xxxx\common\rootdir\root\init.common.rc​

在 on post-fs-data 下添加:

// 设置 Ylog 默认开启开关 1 开启,0或不写 关闭
setprop persist.ylog.enabled 1
start ylog
// 设置sysdump 默认开关属性值 开启为true 关闭 false
setprop debug.sysdump.enabled true
setprop persist.sys.eng.reset 0

在代码中添加后,可以进行一下操作查看是否成功

    1. 确认是否开启​​sysdump​​ 开关

​*#*#83781#*#* (进入工程模式菜单)​​​ ->​​DEBUG&LOG​​​ -> ​​YLog​​​-> ​​Setting​​​ -> ​​Sysdump Enable (开启sysdump)​

    1. 确认是否开​​Ylog​

​*#*#83781#*#*(进入工程模式菜单)​​​->​​DEBUG&LOG​​​ -> ​​YLog (开启ylog)​

手机重启问题 Log 抓取方法_搜索

Ylog关闭,sysdump 开关默认开启

二、插入SD卡 抓取Sysdump log

注意事项 一定要 插入4G及以上的SD卡,否则无法抓的重启的dump log

手机重启问题 Log 抓取方法_重启_02

一定要 插入4G及以上的SD卡,否则无法抓的重启的dump log

三、 sysdump log 分析

插入SD 卡后,成功​​dump log​​信息如下:

手机重启问题 Log 抓取方法_搜索_03

dump log 成功的界面

​dump log​​成功后,我们需要解析 ​​sysdump log​​,解析过程中需要使用对应版本的 vmlinux (​​out/target/product/sp9832e_1h10_go/obj/KERNEL/vmlinux​​) 以及

crash_arm (​​vendor/sprd/tools/crash/crash_arm​​) 解析脚本来解析​​dumpcore​​ 文件。

手机重启问题 Log 抓取方法_重启_04

新建解析dump log目录

    1. 将 vmlinux 、crash_arm、 sysdump log 放置同一目录
cp out/target/product/sp9832e_1h10_go/obj/KERNEL/vmlinux  reboot/
cp vendor/sprd/tools/crash/crash_arm reboot/

手机重启问题 Log 抓取方法_重启_05

将 vmlinux crash_arm sysdump log 放置同一目录

    1. 将 sysdump 所有文件 追加到一个文件中

手机重启问题 Log 抓取方法_搜索_06

将sysdump 所有文件 追加到一个文件中

    1. 使用 crash_arm 脚本 联合 vmlinux 解析 sysdump log

手机重启问题 Log 抓取方法_linux_07

使用 crash_arm 脚本 联合 vmlinux 解析sysdump log

    1. 使用 Log 命令 将 ​​Crash log​​追加到指定文件中

手机重启问题 Log 抓取方法_重启_08

使用 log 命令 读取log 到指定文件

    1. 查看​​log​​,分析重启的具体原因

手机重启问题 Log 抓取方法_重启_09

重启log举例

  • 6.参考调试命令

32 位系统调试命令

./crash_arm -m phys_base=0X80000000 --cpus number2 vmlinux  all 

64 位系统调试命令

./crash_arm64 vmlinux all -m phys_offset=0x80000000

四、展讯平台抓取重启 串口log的方案

  1. 调高 Kernel log 等级为 7

修改代码路径如下:

​kernel/arch/arm/boot/dts/<sprd-xx-yourboard>.dts​​,将​​bootargs = ""​​里修改loglevel字段 1 修改为 7 ​​loglevel=7, console=ttyS1,115200n8​​ 。

搜索关键字 loglevel 即可。

手机重启问题 Log 抓取方法_linux_10

调高 **Kernel log** 等级为 **7**

  1. 将 logcat log 重定向到 串口

修改​​init.common.rc​​代码(​​device/sprd/sharkle/common/rootdir/root/init.common.rc​​)。

在 init 脚本中添加 ​​logcat​​ 重定向 Service .

+service logcat /system/bin/logcat -f /dev/kmsg *:w
+ class main
+ user root
+ group log
+ oneshot
on boot
chown system system /proc/wcn_gnss/start
chown system system /proc/wcn_gnss/stop
  1. disabble SElinux

在 init.cpp (​​/system/core/init/init.cpp​​​)中,让​​selinux_is_enforcing(void)​​函数直接返回false,同时注掉​​selinux_status_from_cmdline()​​函数。

#if 0
static selinux_enforcing_status selinux_status_from_cmdline() {
selinux_enforcing_status status = SELINUX_ENFORCING;
import_kernel_cmdline(false, [&](const std::string& key, const std::string& value, bool in_qemu) {
if (key == "androidboot.selinux" && value == "permissive") {
status = SELINUX_PERMISSIVE;
}
});
return status;
}
#endif
static bool selinux_is_enforcing(void)
{
#if 0
if (ALLOW_PERMISSIVE_SELINUX) {
return selinux_status_from_cmdline() == SELINUX_ENFORCING;
}
return true;
#else
return false;
#endif
}

五、展讯平台判断重启类型

  1. main.log 中查看

在 ​​main.log​​ 中搜索关键字 bootmode

手机重启问题 Log 抓取方法_搜索_11

搜索关键字 bootmode

2.在  文件中查看

在 ​​Ylog​​​ ->​​poweron​​​->​​aplog​​ 目录下的 文件中 搜索关键字 bootmode

手机重启问题 Log 抓取方法_重启_12

搜索关键字 bootmode

  1. 在​​Sysdump​​​中查看触发重启​​dump​​的类型

手机重启问题 Log 抓取方法_重启_13

重启类型信息保存文件路径

手机重启问题 Log 抓取方法_linux_14

Kernel panic 重启

手机重启问题 Log 抓取方法_linux_15

手动触发sysdump 重启

六、展讯平台关闭 sysdump 与watchdog关联

关闭​​sysdump​​​ 与​​watchdog​​​关联,防止开启​​sysdump​​​后​​watchdog​​​被默认关闭,导致无法抓取复现到重启​​log​​​的​​dump​​。

修改文件路径如下:

​kernel/drivers/soc/sprd/debug/sysdump/sysdump.c​

            sysdump_status = 1;
sprd_set_reboot_mode("dumpenable");
set_sysdump_enable(1);
//****************
- sysdump_enable_watchdog(0);
//*************
} else if (!strncmp(sysdump_buf, "off", 3)) {
pr_emerg("sprd_sysdump_write: disable user version sysdump!!!\n");
sysdump_status = 0;

手机重启问题 Log 抓取方法_重启_16

删除 sysdump_enable_watchdog

七、展讯平台手动触发​​sysdump​​方法

    1. 在​​Kernel​​未完全死掉时候,触发SWT(优先方案)

手动触发方案:

同时按住音量+ 、音量- 、然后双击Power键

    1. 在​​Kernel​​​完全死掉,触发​​HWT​

手动触发方案:

长按Power 键、 音量+

手机重启问题 Log 抓取方法_重启_17

手机重启问题 Log 抓取方法_linux_18