最核心的四大工具箱。


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/

    • 用法

      Bash
      echo 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

    • 用法这是高级技巧。不需要重新编译内核,就能开启某个驱动的 pr_debug

      Bash

      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
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐