手機重啓問題 Log 抓取方法


極力推薦文章:歡迎收藏
Android 乾貨分享

本篇文章主要介紹展訊平臺手機開發中的部分重啓問題知識點,通過閱讀本篇文章,您將收穫以下內容:

一、 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)

二、插入SD卡 抓取Sysdump log

注意事項 一定要 插入4G及以上的SD卡,否則無法抓的重啓的dump log

三、 sysdump log 分析

插入SD 卡後,成功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 文件。

    1. vmlinuxcrash_armsysdump log 放置同一目錄
cp out/target/product/sp9832e_1h10_go/obj/KERNEL/vmlinux  reboot/
cp vendor/sprd/tools/crash/crash_arm reboot/
    1. sysdump 所有文件 追加到一個文件中
    1. 使用 crash_arm 腳本 聯合 vmlinux 解析 sysdump log
    1. 使用 Log 命令 將 Crash log追加到指定文件中
    1. 查看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 即可。

  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

2.在 phone.info 文件中查看

Ylog ->poweron->aplog 目錄下的phone.info 文件中 搜索關鍵字 bootmode

  1. Sysdump中查看觸發重啓dump的類型

六、展訊平臺關閉 sysdump 與watchdog關聯

關閉sysdumpwatchdog關聯,防止開啓sysdumpwatchdog被默認關閉,導致無法抓取復現到重啓logdump

修改文件路徑如下:
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;

七、展訊平臺手動觸發sysdump方法

    1. Kernel未完全死掉時候,觸發SWT(優先方案)

手動觸發方案:
同時按住音量+ 、音量- 、然後雙擊Power鍵

    1. Kernel完全死掉,觸發HWT

手動觸發方案:
長按Power 鍵、 音量+

至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!

如有侵權,請聯繫小編,小編對此深感抱歉,屆時小編會刪除文章,立即停止侵權行爲,請您多多包涵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章