Linux内核提供一种按键触发机制,能够在系统异常时,dump 出cpu寄存器,内存使用情况,系统进程堆栈,系统timer等等信息,
sysrq模块提供完整功能如下:
SysRq : HELP : loglevel(0-9) reBoot Crash terminate-all-tasks(E) memory-full-oom-kill(F) kill-all-tasks(I) thaw-filesystems(J) saK show-backtrace-all-active-cpus(L) show-memory-usage(M) nice-all-RT-tasks(N) powerOff show-registers(P) show-all-timers(Q) unRaw Sync show-task-states(T) Unmount show-blocked-tasks(W) dump-ftrace-buffer(Z)
1. 打开sysrq功能
代码路径: drivers/tty/sysrq.c
CONFIG_MAGIC_SYSRQ=y.
动态打开和关闭sysrq功能
echo 1 > /proc/sys/kernel/sysrq
2. sysrq功能使用
2.1 uart /adb 输入指令
常用功能有:
echo 'm' > /proc/sysrq-trigger : 打印系统内存使用情况
echo 'l' > /proc/sysrq-trigger : 打印系统所有CPU的寄存器和堆栈
echo 'q' > /proc/sysrq-trigger: 打印系统所有timer情况
echo 'wf > /proc/sysrq-trigger : 打印系统所有D状态进程堆栈
echo 'f' > /proc/sysrq-trigger :触发一次out of memory, 打印系统所有进程的adj值,并kill一个最优进程
2.2 代码中显示调用sysrq功能
__handle_sysrq('m', false) : 打印系统内存使用情况
__handle_sysrq('w', false); :打印系统所有D状态进程堆栈
__handle_sysrq('l', false): 打印系统所有CPU的寄存器和堆栈