嵌入式开发真正拉开差距的地方,是定位问题的能力。一个问题发生后,能不能快速判断属于启动、文件系统、网络、应用、驱动还是硬件,直接决定修复效率。
一、先分类问题
不要一上来就改代码。先判断问题类型:
- 启动问题。
- rootfs 问题。
- 应用崩溃。
- 内存泄漏。
- CPU 占用高。
- 网络不通。
- 外设不工作。
- 配置丢失。
- OTA 失败。
不同问题对应不同入口。
二、启动问题
工具:
- 串口日志。
- U-Boot 命令行。
- kernel command line。
- dmesg。
重点看:
1 | U-Boot 是否启动 |
如果没有串口日志,启动问题基本很难定位。
三、应用崩溃
先看退出码和日志:
1 | echo $? |
如果有 core dump:
1 | gdb ./device_agent core |
交叉环境可以用:
1 | gdb-multiarch ./device_agent core |
没有 core 时,可以先用 strace:
1 | strace -f -o app.strace /usr/bin/device_agent |
它能看到系统调用失败原因。
四、网络问题
常用命令:
1 | ip addr |
MQTT 连不上时,按顺序查:
- 本机 IP 是否正常。
- 默认路由是否存在。
- DNS 是否可用。
- broker 地址和端口是否可达。
- TLS 证书时间是否有效。
- 账号密码是否正确。
- topic 权限是否正确。
不要只看应用日志,抓包往往更直接。
五、内存和 CPU
查看进程:
1 | top |
查看某个进程:
1 | cat /proc/<pid>/status |
CPU 高时,用 strace -p 看是否卡在某类系统调用:
1 | strace -p <pid> |
如果系统支持 perf,可以进一步分析热点。
六、外设问题
先看内核日志:
1 | dmesg | grep -i error |
再看 sysfs:
1 | ls /sys/class |
I2C:
1 | i2cdetect -y 1 |
GPIO:
1 | ls /sys/class/gpio |
外设问题要同时查软件和硬件:设备树、驱动、引脚复用、电源、时钟、复位脚都可能有问题。
七、配置丢失
重点看:
1 | mount |
常见原因:
- 配置写到了 tmpfs。
- 写到了只读 rootfs。
- 写入后没有 fsync。
- 异常断电时文件被截断。
- OTA 清空了 data 分区。
配置持久化要设计,不要靠运气。
八、整理排查记录
每次定位问题建议记录:
- 现象。
- 复现步骤。
- 设备版本。
- 日志片段。
- 初步判断。
- 验证过程。
- 根因。
- 修复方式。
这些记录会变成团队的排查手册。
- 本文链接: https://blog.hansong.icu/2026/06/26/Embedded_Linux_Series_07_Debug_Troubleshooting/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。