1. 程式人生 > >高通平臺如何抓取宕機定屏log

高通平臺如何抓取宕機定屏log

問題:當我們遇到了手機宕機問題(hang issue),如何進行處理?

如果手機宕機,並且沒有重啟(reboot),可能的原因:

1、             在kernel中,程序中有一些dead lock,同時Android service也堵塞了(blocked),但是time interrupt和dog kick仍然能夠running。因此手機沒有重啟。

2、             Deadlock發生在Android userspace server,如service manager 或者serviceflinger。

兩種情景抓取log:

1、             adbshell 能夠工作

通過adb獲取一些資訊,如adb bugreport > D:\bugreport.txt。

一些Android framework dead lock可能導致bugreport hang。因此需要先獲取一些簡單log,如dmesg和logcat log。再進行adb bugreport操作。獲取dmesg log之後,通過sysrq 介面獲取更多資訊。

kernel/Documentation/sysrq.txt顯示 stack for all active CPU
      echo l >/proc/sysrq-trigger

 顯示hold lock  
   echo d > /proc/sysrq-trigger


顯示 hrtimer
    echo q > /proc/sysrq-trigger

disk sleep(uninterruptable sleep)時顯示tasks,如阻塞在mutex或者hardware register access
 echo w > /proc/sysrq-trigger

進行以上trigger後,再次獲取dmesg log以防止覆蓋。 

通過以下trigger獲取crash dump

不同平臺擁有不同sysfs進入downloade mode的方式,並使能download mode可能是以下一項:
 echo 1>/sys/module/restart/parameters/download_mode


 echo 1>/sys/module/msm_restart/parameters/download_mode
 echo 1 >/sys/module/msm_poweroff/parameters/download_mode

如果操作adb bugreport沒有block,最後triggercrash
  echo c> /proc/sysrq-trigger

2、             沒有列舉adb port或者adb shell不能正常工作

我們需要trigger dump,通過長按power key或者RESET_IN pin(通常連線到powerkey + volume-產生),

需要確保s2-type 配置為1 (warm reset),而不是 7 (hard reset)

pon_1 is forpower key, pon_3 is for RESET_IN pin以8894為例,kernel/arch/arm64/boot/dts/qcom/msm-pm8994.dtsi
    qcom,pon_1 {

           qcom,pon-type = <0>;
           qcom,pull-up = <1>;
           linux,code = <116>;
           qcom,support-reset = <1>;
           qcom,s1-timer = <10256>;
           qcom,s2-timer = <2000>;
           qcom,s2-type = <1>;
    };
    qcom,pon_3 {
     qcom,pull-up = <1>;
           qcom,s1-timer = <6720>;
           qcom,s2-timer = <2000>;
           qcom,s2-type = <7>;
           qcom,use-bark;
    };

如果仍然不工作,pull down PS_HOLDin 200ms