第2章:偶发故障特征分析

一、什么是偶发故障?

偶发故障,说白了就是那种「时灵时不灵」的毛病。

你测试的时候它好好的,一交给客户就出问题。或者今天跑了一整天都没事,明天一开机就挂了。我做了十几年EMC,这类问题见得最多。

偶发故障的定义其实很简单:故障的发生没有固定规律,时有时无,难以预测。它不像电阻烧断那样,一坏就彻底坏掉。偶发故障更像是「幽灵」,你抓它的时候它不在,你不理它的时候它又冒出来。

偶发故障的核心特征:

  • 故障出现的时间、频率、条件都不固定
  • 系统复位或重启后,故障可能消失
  • 同样的测试用例,有时能复现,有时不能
  • 故障现象往往比较「诡异」,比如死机、重启、数据错乱

我在项目中遇到过一台设备,平时跑得好好的,但只要旁边有人用手机打电话,它就死机。你说这算不算偶发?算。但你能说它跟EMC没关系吗?当然有关系。

二、偶发故障 vs 固定故障

这两者的区别,我习惯用一个比喻来解释:

  • 固定故障:就像水管爆了,水一直流。你一眼就能看到问题在哪。
  • 偶发故障:就像水管偶尔漏水,但你去检查的时候它又不漏了。你怀疑是某个接头松了,但拧紧后还是偶尔漏。

咱们用表格对比一下,更清楚:

对比项 固定故障 偶发故障
复现性 100%复现 难以复现
定位难度 低,万用表一测就知道 高,需要长时间监测
典型原因 器件损坏、焊接不良 EMC干扰、时序问题、软件bug
处理方式 更换器件、补焊 加滤波、改布局、优化代码
对产品的影响 直接失效 用户体验差,口碑崩塌

你想想看,固定故障虽然严重,但至少你知道问题在哪。偶发故障才是最让人头疼的——你都不知道该从哪里下手。

注意:偶发故障如果长期不处理,会逐渐演变成固定故障。比如EMC干扰导致芯片内部寄存器反复被改写,时间长了芯片可能就真的坏了。我见过不少案例,一开始只是偶尔死机,后来直接开不了机。

三、为什么偶发故障这么难复现?

这个问题我问过很多工程师,大家的回答都差不多:「因为条件不够」。但具体是哪些条件?我总结了几点:

  1. 干扰源不稳定
    比如电源线上的噪声,不是一直有的。可能是某个大功率设备启动时产生的,也可能是电网波动导致的。你测试的时候,那个大功率设备没开,自然就复现不了。
  2. 环境因素变化
    温度、湿度、电磁环境,这些都会影响故障的发生。我记得有一次,客户说设备在南方用没问题,到了北方就频繁死机。后来发现是低温导致晶振频率偏移,触发了时序问题。
  3. 软件状态不确定
    软件跑在哪个分支?中断优先级怎么配置?任务调度有没有冲突?这些都会影响故障的触发。说白了,偶发故障很多时候是「软硬结合」的问题。
  4. 测试手段不够
    你拿个万用表去测,能测出什么?偶发故障往往是纳秒级的脉冲干扰,示波器采样率不够都抓不到。我建议至少用2GHz以上的示波器,配合长时采集模式。

我的经验:复现偶发故障,最笨但也最有效的方法就是「长时间跑」。我曾经让一台设备连续跑了72小时,才抓到一次故障。虽然耗时,但至少证明问题存在,不是客户在瞎说。

四、故障日志分析方法

日志分析是处理偶发故障的「第一道防线」。很多工程师一上来就拆设备、换器件,其实先看看日志,往往能省不少事。

我个人习惯的日志分析流程是这样的:

1. 先看时间戳

故障发生的时间点,有没有规律?比如是不是每次都在系统启动后30分钟出现?或者是不是在某个特定操作之后?

我曾经处理过一个案例,设备总是在凌晨3点左右死机。一开始以为是硬件问题,后来看日志发现,凌晨3点是系统自动备份的时间,备份程序占用了大量CPU资源,导致看门狗喂狗超时。嗯,这就是典型的软件问题伪装成硬件故障。

2. 再看错误码

很多芯片在发生异常时,会记录错误码。比如:

// 常见的错误码示例
0x0001 - 电源欠压
0x0002 - 看门狗复位
0x0003 - 堆栈溢出
0x0004 - 外部中断异常
0x0005 - 通信超时

错误码能告诉你「发生了什么」,但不一定能告诉你「为什么发生」。比如看门狗复位,可能是电源干扰导致的,也可能是软件死循环。这时候就需要结合其他信息来判断。

3. 分析上下文

故障发生前,系统在做什么?有没有执行某个特定的函数?有没有操作某个外设?

我建议在日志中增加「上下文标记」,比如:

[INFO] 进入通信任务
[INFO] 发送数据包 #1234
[WARN] 接收超时,重试第1次
[WARN] 接收超时,重试第2次
[ERROR] 通信失败,系统复位

你看,从日志里就能看出,故障是在通信过程中发生的。那问题大概率出在通信接口上,比如SPI线受干扰、或者电平不匹配。

4. 统计频率

偶发故障的「偶发」程度,其实可以用数据来衡量。我习惯用这样的表格来记录:

测试时间 运行时长 故障次数 故障率 备注
2024-01-10 8小时 3次 0.375次/小时 正常环境
2024-01-11 8小时 0次 0次/小时 正常环境
2024-01-12 8小时 5次 0.625次/小时 旁边有电机启动

看到没?旁边有电机启动时,故障率明显升高。这就给了我们一个方向——去查电机的EMC干扰。

日志分析的核心思路:不要只看故障本身,要看故障的「邻居」。故障发生前、发生后,系统在做什么?环境有什么变化?这些信息往往比故障本身更有价值。

五、小结

偶发故障的特征分析,说白了就是「找规律」。没有规律就是最大的规律——说明干扰源是随机的,或者触发条件极其苛刻。

我个人建议,遇到偶发故障时,先别急着动手改硬件。花点时间分析日志,记录故障发生的环境条件,有时候答案就藏在数据里。下一章我会讲具体的复现手段和工具,咱们到时候再细聊。

公众号:蓝海资料掘金营,微信deep3321