2026-08-25 博客:现场排查的 8 个坑
今天两场现场排查(一场查设备崩溃/通信,一场查界面图像不显示),沉淀出 8 个通用方法,核心就一句:排查先问"到底按什么判断的",别靠猜。
1. 排查顺序:看日志的正确姿势
概念
拿到一堆日志别乱搜,按三步走:
- 先分清日志有几种(不同模块/不同类型)。
- 搜完整的报错前缀 ,别用截断的关键词------教训:搜「加载失败」会漏掉「加载图像失败」(中间隔两个字)。
- 数每种报错的次数------能立刻看出是「偶尔」还是「批量」。
类比
「偶尔」= 偶发环境问题(某天数据被删);「批量」= 系统性代码或数据问题。次数就是分水岭。
2. 静默失败:日志里"零记录"本身就是线索
概念
代码 catch (Exception) { return false; } 把真正的错误吞掉、不打任何日志。出问题时日志里一条都没有。
类比
报警器坏了------出事了,但一点声音都没有。你不能因为"没听见警报"就认为"没事"。
伪代码
csharp
try { 加载3D体数据(); }
catch (Exception) { return 初始化失败; } // ← 吞掉了,不记日志
// DLL 缺失 / 文件不存在 / 格式不对,全都静默返回
排查铁律
看到日志里某个功能"零记录",先怀疑它是不是静默失败,而不是"没出错"。
3. 崩溃日志排查:两个事件号是"铁证"
概念
Windows 上 .NET 程序崩溃,事件日志会留下一对事件,直接定位「崩在哪个模块、为什么崩」。
| 事件号 | 是什么 | 关键信息 |
|---|---|---|
| EventId 1026(.NET Runtime) | 未处理异常 | exception code c0000005(访问违规) |
| EventId 1000(Application Error) | 程序崩溃 | 故障模块名(哪个 DLL)+ 异常码 |
类比
行车记录仪------不用目击者回忆,直接看回放。
4. FileNotFoundException vs DirectoryNotFoundException
概念
两个异常一字之差,含义完全不同:
| 异常 | 含义 |
|---|---|
FileNotFoundException |
文件不存在(但文件夹可能在) |
DirectoryNotFoundException |
路径中间的文件夹 不存在(Could not find a part of the path) |
排查意义
看到后者 = 整个目录被删了,跟代码无关(数据被清理 / 盘符映射错)。
5. 编码问题:GBK 的 0xE3 被当 UTF-8 读
概念
GBK 中文的首字节 0xE3,被 UTF-8 解析器读到,就报「非法字符」。
类比
两本密码本:文件用 GBK 写,解析器拿 UTF-8 密码本翻译,翻到 0xE3 就卡住。
表现
JSON 解析报 '0xE3' is invalid start of a value(配置里那段中文解析失败)------和"日志中文乱码"是同一类问题:GBK 和 UTF-8 混用。
6. 目标值 vs 实际值:命令"收到" ≠ "生效"
概念
排查"值为什么没变",要分清三件事:发出去了 → 被收到 → 生效了。中间每一步都可能断。
类比
发微信:"发送成功" ≠ "对方读了" ≠ "对方照做了"。
伪代码
发:设电压 140
回:收到 140 ← 收到
读:目标电压 0 ← 没生效
假阳性陷阱
csharp
// 稳定条件 = 实际 == 目标
if (实际 == 目标) 稳定;
// 陷阱:目标 = 0 时,实际 0 == 0 也判"稳定",漏掉真故障
7. 连接被中止:SocketException 10053
概念
网络连接被对端「主动掐断」,报 SocketException 10053(WSAECONNABORTED,软件中止已建立的连接)。
类比
打电话,对方没挂断提示,直接"啪"地剪线。
排查方向
连的是谁(localhost 的什么服务)、那个服务为什么掐断(崩溃 / 超时回收 / 防火墙)。
8. 自动清理:按时间,不按大小
概念
"自动清理"有两条路:按时间 清(超 N 天就删),或按大小/空间清(磁盘快满才删)。要搞清楚是哪种。
类比
- 按时间 = 冰箱里的菜放超过 7 天就扔(不管冰箱满不满)。
- 按空间 = 冰箱塞不下了才扔。
伪代码
csharp
// 按时间清理(只看年龄)
if (文件.最后修改时间 < 现在 - N天) 删除;
// 完全不看:文件大小、磁盘剩余空间
局限:磁盘被大量"没过期的新文件"塞满时,按时间清理帮不上忙。
小结
这 8 个坑,本质是同一句话:「看到的不一定是真的」------日志零记录要怀疑静默失败、崩溃要看事件日志、异常要分文件还是目录、编码要看字节、值要看目标 vs 实际、连接要看谁掐的、清理要看按什么规则。排查先问"到底按什么判断的",能少走很多弯路。