FIQ 调试 —— 死机、死锁时串口调试
系统遇到了底层问题,比如系统死机(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。往前翻阅输出内容,寻找死机前打印的Oops、Panic、WARNING或者内存溢出(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让设备重启。
💡 实战排查建议流程:
- 敲击
kmsg快速浏览最后的错误日志。 - 敲击
pcsr看一眼所有 CPU 在哪。 - 对每个核心执行
cpu X切换后,敲击bt保存所有核心的调用栈。
留下评论