操作系统番外3(Linux的故障诊断)(TODO)
todo。

最核心的四大工具箱。
1 DebugFS
/sys/kernel/debug/ (DebugFS)
这是内核调试的“核武器库”。如果系统没挂,大部分问题都能在这里找到端倪。使用这个需要首先内核编译的时候支持,打开CONFIG_DEBUG_FS=y,挂载mount -t debugfs none /sys/kernel/debug。
下面的内容如下:
| 领域 | 关键路径 (全路径) | 用途 |
| 引脚控制 | /sys/kernel/debug/pinctrl/[pinctrl-dev]/pinconf-pins |
查看物理引脚的上下拉、电压、驱动能力 |
| 引脚复用 | /sys/kernel/debug/pinctrl/[pinctrl-dev]/pinmux-pins |
确认引脚是被配置成了 GPIO、I2C 还是 SPI |
| 时钟树 | /sys/kernel/debug/clk/clk_summary |
确认时钟是否开启、频率是否达标、父时钟是否正确 |
| 电源调节 | /sys/kernel/debug/regulator/regulator_summary |
检查各路 LDO/Buck 的输出电压和状态 |
| 中断监控 | /proc/interrupts |
观察硬件中断是否产生(Count 计数是否跳变) |
| 休眠阻碍 | /sys/kernel/debug/wakeup_sources |
看看哪个驱动持锁不放,导致系统进不了休眠 |
| 设备树 | /proc/device-tree/ |
运行时核对 dts 修改是否真的在内核中生效了 |
具体的一些用法:
-
Pinctrl(引脚复用检查)
-
路径:
/sys/kernel/debug/pinctrl/ -
用法:
cat pinconf-pins查看引脚电压、上下拉属性;cat pinmux-pins确认引脚是否被配置为你需要的 I2C/SPI 功能。
-
-
Clock(时钟树检查)
-
路径:
/sys/kernel/debug/clk/clk_summary -
用法:
cat clk_summary。看时钟是否开启(enable_count)、频率(rate)是否对。在高通 8550 这种平台上,检查是否因为父时钟没开导致外设不工作。
-
-
Regulator(电源管理)
-
路径:
/sys/kernel/debug/regulator/regulator_summary -
用法:确认各级电源 LDO/Buck 的输出电压、负载状态。
-
-
Wakeup Sources(唤醒源)
-
路径:
/sys/kernel/debug/wakeup_sources -
用法:排查为什么休眠进不去。看哪个驱动(如 Wi-Fi 或传感器)一直持有
active锁。
-
2 /sys/class/ (设备类属性)
这里是查看特定硬件运行状态最快的地方,内容如下:

常用的内容:
| 领域 | 核心 Class 路径 | 验证命令 | 预期证据 (根因收敛标准) |
| IO控制 | gpio/ |
echo out > direction |
引脚物理电压随 value 同步变化 |
| 能效 | power_supply/ |
cat current_now |
休眠后电流降至目标 mA (如 15mA) |
| 显示 | backlight/ |
echo 255 > brightness |
PWM 占空比达到 100% 且背光最亮 |
| 稳定性 | leds/ |
echo heartbeat > trigger |
即使串口无输出,灯闪烁代表内核存活 |
| 热控 | thermal/ |
cat temp |
温度超过阈值时,cpufreq 节点频率下降 |
-
GPIO(手动拉高/拉低引脚)
-
路径:
/sys/class/gpio/ -
用法:
Bashecho 123 > export # 导出 GPIO123 echo out > direction # 设为输出 echo 1 > value # 强制拉高(用来验证硬件连通性)
-
-
Thermal(热管理)
-
路径:
/sys/class/thermal/ -
用法:
cat thermal_zone*/temp监控各模块温度,排查是否因为过热导致的降频或重启。
-
-
Power Supply(电池与供电)
-
路径:
/sys/class/power_supply/ -
用法:查看充电电流、电压及电池状态。对于 AI 眼镜这类设备,功耗调优必看。
-
3 /proc/ (进程与内核状态)
虽然 /sys 逐渐取代了 /proc 的部分功能,但有些经典节点依然无可替代。内容如下:

-
Interrupts(中断分布)
-
路径:
/proc/interrupts -
用法:
watch -n 1 cat /proc/interrupts。确认中断是否有增加(Count 是否变化)。如果外设不动且中断计数一直为 0,说明信号没进 CPU。
-
-
Device Tree(运行时设备树)
-
路径:
/proc/device-tree/ -
用法:实时验证 Bootloader 传给内核的 DTB 是否包含你的修改。
-
-
I/O Memory(内存映射)
-
路径:
/proc/iomem -
用法:确认寄存器基地址映射是否重叠。
-
4 特殊调试接口 (Magic Portals)
-
SysRq (魔术键)
-
路径:
/proc/sysrq-trigger -
用法:
-
echo t > /proc/sysrq-trigger:打印当前所有任务的堆栈(查死锁)。 -
echo m > /proc/sysrq-trigger:打印当前内存快照。 -
echo c > /proc/sysrq-trigger:立即触发 Crash Dump(导出内存镜像)。
-
-
-
Dynamic Debug (动态打印)
-
路径:
/sys/kernel/debug/dynamic_debug/control -
用法:这是高级技巧。不需要重新编译内核,就能开启某个驱动的
Bashpr_debug:echo 'file your_driver.c +p' > control
-
5 实战篇
用的时候一般关注如下:
| 优先级 | 调试环节 | 核心路径 | 工具/节点 | 证据标准 |
| P0 | 基础带板 | DebugFS | clk_summary, pinconf-pins |
硬件资源配置与 Datasheet 100% 吻合 |
| P0 | 通信验证 | ProcFS | /proc/interrupts |
硬件操作后,中断计数 (IRQ Count) 必须增加 |
| P1 | 系统假死 | SysRq | echo t (Show Tasks) |
找到处于阻塞态的函数调用栈 (Backtrace) |
| P1 | 功耗调优 | SysFS | /sys/class/power_supply |
休眠后静态电流降至目标阈值 |
如果是点外设,比如camera,audio,screen。重点关注:
| 维度 | 检查项 | 证据标准 | 常用“救命”节点 |
| Power | 电源轨电压 | 符合 Datasheet 误差范围内 | /sys/kernel/debug/regulator/... |
| Clock | 时钟源与频率 | 频率稳定,Enable Count > 0 | /sys/kernel/debug/clk/clk_summary |
| Bus | I2C / SPI 通讯 | 能够正确读回 Chip ID | i2cdetect -y [bus_num] |
| Signal | MIPI / I2S 中断 | 硬件动作后 IRQ 计数持续跳变 | /proc/interrupts |
| Integrity | 数据完整性 | 无 Overrun / Underrun 报错 | `dmesg |
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)