立即重启计算机 echo "b" > /proc/sysrq-trigger
立即关闭计算机 echo "o" > /proc/sysrq-trigger
导出内存分配的信息 echo "m" > proc/sysrq-trigger (可以用/var/log/message查看)Outputs memory statistics to the console
导出当前CPU寄存器信息和标志位的信息 echo "p" > proc/sysrq-trigger (outputs all flags and registers to the console)
导出线程状态信息 echo "t" > proc/sysrq-trigger (outputs a list of processes to the console)
故意让系统崩溃 echo "c" > proc/sysrq-trigger (crashes the system without first unmounting file systems or syncing disks attached to the system)
立即重新挂载所有的文件系统 echo "s" > proc/sysrq-trigger (attempts to sync disks attached to the system)
立即重新挂载所有的文件系统为只读 echo "u" > proc/sysrq-trigger (attempts to unmount and remount all file systems as read-only)
此外,还有两个类似于强制注销的功能
e ---- kills all processes except init using SIGTERM
i ---- kills all processes except init using SIGKILL
Question:When I meet a phone hang issue, how to handle it? how to raise case to Qualcomm?
Answer:
For a phone hang issue, since it is not reboot, there are some possibility:
1. In kernel, there some dead lock between process, while android service also be blocked, but time interrupt and dog kick worker can still running, so phone does not reboot
2. There are deadlock happen in android userspace server, like service manager or serviceflinger
There are also 2 scenario:
1. adb shell can still work
then could login and retrive some information, like adb bugreport
As bugreport may hang if there are some android framework dead lock, so need to get some simple log first, dmesg and logcat log
After get dmesg log, try to trigger more information by sysrq interface
kernel/Documentation/sysrq.txt
show stack for all active CPU
echo l > /proc/sysrq-trigger
show hold lock
echo d > /proc/sysrq-trigger
show hrtimer
echo q > /proc/sysrq-trigger
show tasks that are in disk sleep(uninterruptable sleep), which are like blocked in mutex or hardware register access
echo w > /proc/sysrq-trigger
after trigger, get more dmesg log for each to avoid overwrite.
Then trigger a crash dump
First enable download mode in different platform has different sysfs entry to enable download mode
May one of the following
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
if adb bugreport done without block, then trigger crash at last
echo c> /proc/sysrq-trigger
2.no adb port enumerate or adb shell does not work
Then we need to trigger dump by long press power key or RESET_IN pin that generally connect to powerkey+volumn-
make sure s2-type is 1 warm reset, not 7 hard reset.
pon_1 is for power key, pon_3 is for RESET_IN pin
take 8994 as example, 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;
};
If it does not work, then try pull down PS_HOLD in 200ms.
Android常见suspend时file system sync(sys_sync())超时,导致watchdog超时问题:
frameworks/base/services/core/java/com/android/server/Watchdog.java //android op code
systemserver WDT log :
native: #00 pc 000169b8 /system/lib/libc.so (syscall+28)
native: #01 pc 0001bd79 /system/lib/libc.so (sem_wait+62)
native: #02 pc 000016ab /system/lib/libsuspend.so (???)
native: #03 pc 00000e2d /system/lib/libsuspend.so (autosuspend_disable+24)
native: #04 pc 00014ed7 /system/lib/libandroid_servers.so (???)
native: #05 pc 00087ee1 /system/framework/oat/arm/services.odex (Java_com_android_server_power_PowerManagerService_nativeSetAutoSuspend__Z+76)
at com.android.server.power.PowerManagerService.nativeSetAutoSuspend(Native method)
at com.android.server.power.PowerManagerService.setHalAutoSuspendModeLocked(PowerManagerService.java:2369)
at com.android.server.power.PowerManagerService.access$1800(PowerManagerService.java:94)
at com.android.server.power.PowerManagerService$2.onDisplayStateChange(PowerManagerService.java:2244)
kernel/kernel/power/suspend.c //kernel code
//kernel log
03-20 12:57:44.042 0 0 I [26238.079199,4] PM: Syncing filesystems ...
03-20 12:57:44.042 0 0 I [26358.606528,4] SysRq: Show Blocked State
解决方法:
static int enter_state(suspend_state_t state)
{
int error;
if (state == PM_SUSPEND_FREEZE) {
} else if (!valid_state(state)) {
return -EINVAL;
}
if (!mutex_trylock(&pm_mutex))
return -EBUSY;
if (state == PM_SUSPEND_FREEZE)
freeze_begin();
#ifdef CONFIG_PM_SYNC_BEFORE_SUSPEND
printk(KERN_INFO "PM: Syncing filesystems ... ");
sys_sync();
printk("done.\n");
#endif
pr_debug("PM: Preparing system for %s sleep\n", pm_states[state].label);