内核sysrq使用方法
1、SysRq键介绍
SysRq键可以在内核无法登陆,按键无响应时,尚能够响应中断时使用。可以内核卡死的情况下获取内核状态的部分信息,便于进行问题分析。下面介绍串口下使用SysRq键进行内核调试的方法。当内核无法响应,不能登录时,通过串口向内核发送SysRq键命令的方法是:先发送break信号,之后在5s中内发送SysRq键,内核即能做出相应的相应。
2、配置内核响应SysRq键
在内核配置选项中,启用内核配置CONFIG_MAGIC_SYSRQ
$ make menuconfig
Kernel hacking —>
[*] Magic SysRq key
配置以上选项后,编译内核,启动后通过以下命令开启SysRq功能:
echo 1 > /proc/sys/kernel/sysrq
有些内核中默认该功能是启用,只需配置CONFIG_MAGIC_SYSRQ选项即可。
3、SysRq键的输入方法
以SecureCRT为例说明串口下,SysRq间的输入方法。
1. 先通过映射键,映射BREAK键,如下图将Ctrl+Shift+b的组合键映射为BREAK键:
2. 使用时,先按Ctrl+Shift+b组合键,输入BREAK,然后再5s内按下响应的SysRq键即可。

4、SysRq命令键说明
标准内核中支持支持28种不同的命令键,而根据内核版本与Kernel hacking选项中开启的选项不同,具体的内核支持的命令键个数不同,也可以通过自定义的方式扩充或者修改具体SysRq键的功能。通过SysRq的h键可以知道内核中支持的SysRq命令键的详细说明,下面是设备所支持的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-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)
调试时常用的SysRq键有m,n,p,t,w,其具体功能如下:
m, 输出内存和交换文件的状态
n,强制将所有的实时进程变成普通进程。相当于通过sched_setscheduler(2)将任务调度策略设置为SCHED_NOMAL
p, 输出CPU寄存器和正在运行的进程的信息,多个CPU情况下,只输出处理了键盘终端的CPU信息
t, 调用backtrace,输出所有正在运行的进程的栈
w, 只输出处于UNINTERRUPTABLE的等待状态且忽略各种信号的进程信息
5、使用SysRq命令键定位举例
设备在测试生成core文件时发现,当系统出现段错误时,并不能生成core文件。 而是卡死无响应,直到看门狗超时导致重启。 最后定位到系统卡死在DM648模块中向DSP发送消息的接口中有一个while(1)的处理中。 当时没有SysRq的调试方法,只能通过逐个代码模块屏蔽,然后重新编译运行,逐个排除,整个调试的过程花费了两天时间,涉及到应用、系统、音视频、DSP四个团队。 现在使用SysRq的方法是这去分析定位该问题。
重现该现象,使用SysRq键的方法打印出其卡死之后的内核部分信息。
使用m键,查看系统内存如下:
SysRq : Show Memory
Mem-info:
Normal per-cpu:
CPU 0: hi: 42, btch: 7 usd: 12
active_anon:7821 inactive_anon:1 isolated_anon:0
active_file:2503 inactive_file:9300 isolated_file:0
unevictable:0 dirty

1145

被折叠的 条评论
为什么被折叠?



