1 分钟阅读 次阅读

系统遇到了底层问题,比如系统死机(Hang)、内核崩溃(Panic)或者发生死锁,导致正常的控制台无法响应,从而通过在串口上敲入”fiq”进入底层的 FIQ 中断模式。

Welcome to irq debugger mode
Enter ? to get command help
debug> ?
FIQ Debugger commands:
 pc            PC status
 regs          Register dump
 allregs       Extended Register dump
 bt            Stack trace
 pcsr          Dump all cpus pc by DBGPCSR
 cpu           Current CPU
 cpu <number>  Switch to CPU<number>
 reboo sleep         Allow sleep while in FIQ
 nosleep       Disable sleep while in FIQ
 console       Switch terminal to console
 reset [<c>]   Hard reset with command <c>
 irqs          Interrupt status
 kmsg          Kernel log
 version       Kernel version
 ps            Process list
 sysrq         sysrq options
 sysrq <param> Execute sysrq with <param>

第一步:排查死机原因的核心命令

当你刚进入这个模式,最首要的任务是搞清楚“系统死机前到底在干什么”。

  • bt (Stack trace)
  • 作用: 打印当前的函数调用栈(Backtrace)。
  • 怎么用: 直接输入 bt。这是最重要的命令,它能直接告诉你当前 CPU 卡在了哪一行代码或哪一个内核函数里。

  • kmsg (Kernel log)
  • 作用: 打印内核日志,相当于系统正常运行时的 dmesg
  • 怎么用: 输入 kmsg。往前翻阅输出内容,寻找死机前打印的 OopsPanicWARNING 或者内存溢出(OOM)等报错信息。

  • ps (Process list)
  • 作用: 列出系统当前所有的进程状态。
  • 怎么用: 寻找状态异常的进程,比如大量处于 D 状态(不可中断休眠)的进程,这通常意味着 I/O 卡死或死锁。

第二步:多核 CPU 状态排查

现在的设备大多是多核处理器,系统卡死可能只发生在某一个特定的 CPU 核心上,你需要检查所有核心。

  • pcsr (Dump all cpus pc)
  • 作用: 一次性列出所有 CPU 核心当前的 PC (Program Counter) 指针。你可以借此快速判断哪个核心卡在了哪里。

  • cpu
  • 作用: 显示你当前正在调试哪一个 CPU 核心(通常默认为 CPU 0)。

  • cpu <number>
  • 作用: 切换到其他 CPU 核心。
  • 怎么用: 比如输入 cpu 1 切换到核心 1,然后再输入 bt,看看核心 1 的调用栈。重复此步骤检查所有核心。

第三步:深度底层调试(针对寄存器与中断)

  • **pc / regs / allregs**
  • 作用: 分别用于查看当前的指令地址(PC)、普通寄存器状态和所有寄存器的详细快照。结合反汇编代码,可以精准定位崩溃的机器码。

  • irqs (Interrupt status)
  • 作用: 查看各个中断的触发次数。
  • 怎么用: 如果某个中断的数量异常庞大,说明可能发生了“中断风暴”,导致系统把所有资源都拿去处理该中断而假死。

第四步:恢复、操作与退出

当你收集完现场信息后,需要对系统进行处置。

  • console
  • 作用: 将终端从 FIQ Debugger 切换回正常的控制台。如果系统只是假死或已经恢复,输入此命令可以继续正常使用设备。

  • sysrq <param>
  • 作用: 触发 Linux 的 Magic SysRq 功能。
  • 怎么用: 例如,输入 sysrq c 可以故意触发一次系统 Crash,从而生成完整的内存转储(Ramdump),供后续用 GDB 等工具进行离线分析。

  • reset
  • 作用: 强制硬重启设备。排查完问题后,输入 reset 让设备重启。

💡 实战排查建议流程:

  1. 敲击 kmsg 快速浏览最后的错误日志。
  2. 敲击 pcsr 看一眼所有 CPU 在哪。
  3. 对每个核心执行 cpu X 切换后,敲击 bt 保存所有核心的调用栈。

留下评论