做嵌入式最怕的不是“这功能做不出来”,而是“这功能有时候正常有时候不正常”。设备在实验室连跑三天都稳如老狗,一到客户现场就偶发串口丢数据;蓝牙模块配对好的,用着用着突然断开,重新连又能连上;Keil 编译一次过,J-Link 下载却偶尔报错,同一块板子换个批次又啥事没有。
这类偶发 bug 的共同点就是:现象真实存在,但复现概率低,常规调试手段根本抓不到现场。我这些年处理过的这类问题不少,踩过的坑也够多,最后总结出来的核心思路其实就三件事:换机排除、录屏取证、批次对照。这三个方法分别对应串口假故障、蓝牙断连、烧录失败这三类最典型的偶发问题。这篇就把它们摊开讲,每一步怎么做、为什么这么做、有哪些隐藏的坑,全部说清楚。
1. 偶发 bug 排查的整体思路:先划边界,再谈修复
1.1 偶发 bug 难在哪:变量太多,证据太少
偶发 bug 之所以难搞,根源在于嵌入式开发场景里的变量实在太多。同一套代码,跑在硬件 A 上正常,跑在硬件 B 上就偶尔抽风;同一个串口收发逻辑,连着电脑的 USB 转串口好用,连着客户的工控机就丢数据;蓝牙协议栈明明没动过,换了批天线就开始频繁断连。
这种问题拿到手里,第一反应往往是怀疑自己的代码。但实际上,“偶发”这两个字本身就暗示了问题大概率不在代码逻辑里。如果是一个必然触发的逻辑 bug,早就稳定复现了。偶发意味着某个外部条件在临界状态附近波动——电压边缘、时序竞争、射频干扰、驱动兼容性、地电位差,这些才是第一嫌疑人。
所以排查偶发 bug 的第一原则不是“看代码”,而是先把责任边界划清楚:问题到底出在上位机、连接链路、还是设备本身?边界划清楚了,变量控制住了,问题自然就现形了。
1.2 三个手段分别解决什么问题
换机排除、录屏取证、批次对照,本质上都是“控制变量 + 采集证据”的组合拳,只是侧重点不一样。
- 换机排除:用于串口、USB 这类有明确物理链路连接的问题,通过逐一替换链路中的环节,把故障源从整条链路里“挤”出来。
- 录屏取证:用于蓝牙、Wi-Fi 这类受环境影响大、日志分散在多个设备上的问题,通过视频和时间戳把偶发过程固化下来,让“说不清”变成“看得见”。
- 批次对照:用于烧录、启动这类硬件相关但和代码无强关联的问题,通过新旧批次样品的交叉验证,定位是设计变更、物料差异还是环境因素。
这三个方法不是孤立的,在实际项目中经常组合使用。比如蓝牙断连问题,先用录屏取证抓日志,再用换机排除确认是手机端问题还是设备端问题,最后用批次对照判断是不是某个批次的射频匹配电路物料有偏差。下面逐个场景展开。
2. 串口假故障的换机排除法:先把责任链路切干净
2.1 串口假故障的典型症状
串口通信的偶发问题,我把它叫“假故障”,因为很多时候设备本身完全正常,问题出在链路和工具链上。典型症状有这些:
- 设备端明明在周期性发送数据,上位机串口助手却偶尔收不到,或者收到乱码。
- 串口助手打开的时候正常,过几分钟就卡死、假死,重新关闭再打开又好了。
- 同样的代码和硬件,在研发电脑上串口一切正常,换到客户电脑上就频繁丢包。
- 发送数据时偶发超时,尤其是连续大包发送时更容易触发。
- 设备上电一瞬间串口打印机打出一堆乱码,然后又恢复正常。
遇到这些情况,先别急着怀疑固件里的串口初始化代码、DMA 配置或者中断优先级。先把“设备链路”和“上位机链路”切开,一条链路一条链路地排除。
这里额外提一句,很多人一上来就怀疑串口 DMA 配置有问题。DMA 确实是串口丢数据的重灾区,但“偶发”丢数据和“必现”丢数据要区分对待。DMA 配置错误通常表现为特定长度、特定频率下稳定复现的异常,不太可能是完全随机的偶发。如果是后者,优先怀疑链路物理层和上位机环境。
2.2 换机排除的实操步骤
换机排除的操作逻辑很简单:保持被测设备不动,逐项替换外部变量,每换一个变量测一轮。具体步骤如下。
第一步,固定设备端。把目标板子放在桌上,接上电源和通信线,保证它持续输出串口数据(可以先刷一个循环打印的测试固件,比如每秒打印一次计数值)。这一步的目的是确认“设备端有没有在发”。
第二步,换电脑。不要在同一台电脑上反复折腾,直接换一台干净的电脑,装好串口驱动,用串口调试助手接收。如果问题消失,说明原电脑环境有干扰;如果问题依旧,继续往下换。
第三步,换 USB 转串口模块。CH340、CP2102、FT232 各来一个,分别测试。不同芯片方案的抗干扰能力和驱动稳定性差别很大,尤其要注意那些几块钱的 USB 转串口小板,在电磁环境稍差的地方就容易出问题。换模块时注意:换模块前拔掉 USB 线,不要热插拔,否则可能因为枚举过程异常导致串口号混乱。
第四步,换串口线。把原来的杜邦线、飞线全部换掉,如果条件允许,直接用屏蔽线或者成品串口延长线。杜邦线超过 20cm 就非常容易出问题,尤其在高频大数据量通信的时候。如果是 RS-232 电平的长线通信,还要检查线缆质量和终端电阻匹配。
第五步,换软件。SSCOM、XCOM、PuTTY、串口调试助手各试一遍。不同调试助手对串口的打开方式、缓冲区处理、流控制处理不一样,偶发问题可能只在某个特定软件上触发。这里有个小技巧:把串口调试助手的接收缓冲区调大,打开“十六进制显示”,观察乱码的规律,是固定字节被替换、还是数据长度对不上、还是整包丢失,这对后续定位非常有帮助。
第六步,如果以上都换完了问题还在,那就用示波器或逻辑分析仪直接抓设备端 TX 引脚波形。这是最可靠的终极判断手段——只要设备端 TX 引脚波形是完整、稳定、无毛刺的,问题就一定在链路上;如果波形本身就不对,那才需要考虑设备端的固件配置或者硬件设计。
整套流程走下来,串口假故障的“责任范围”基本就被切干净了。我自己遇到过一个很典型的案例:客户反馈 RS-485 通信偶发超时,设备端和主控端都查了个遍,最后发现是客户现场用的 USB 转 RS-485 模块是劣质方案,信号质量差到示波器上波形都发毛。换成工业级模块后问题直接消失。
2.3 串口排查中容易忽略的隐藏坑
换机排除能解决大部分链路问题,但有几个坑是常规操作覆盖不到的,单独拿出来说。
第一个坑:USB 休眠策略。Windows 默认允许 USB 设备进入选择性挂起,如果串口模块在长时间无数据时被系统挂起,恢复通信时就会出现短暂假死。这个在“偶发”问题上占的比例非常高。排查方法很简单:控制面板 → 电源选项 → 更改计划设置 → 更改高级电源设置 → USB 设置 → USB 选择性暂停设置,改为“已禁用”。我自己习惯装完串口驱动第一件事就是把这个关掉,能省掉很多莫名其妙的偶发问题。
第二个坑:驱动版本和系统版本不匹配。CH340 的驱动在 Windows 10 和 Windows 11 上表现差异明显,老版本驱动在新系统上可能出现打开失败、数据延迟、偶发丢包。建议去芯片厂官网下载最新版驱动,不要用系统自动安装的旧版本。另外如果有条件,尽量别用那种“万能驱动包”安装驱动,很容易装上带广告的旧版本。
**第三个坑:电平转换电路。**这是个硬件层面的经典陷阱,常见于 3.3V 主控和 1.8V 外设、或者不同供电电压模块之间的串口通信。比如某些 1.8V 电平的传感器模块和 3.3V 主控通信,如果直接用电阻分压而不是三极管电平转换电路,就可能出现逻辑电平临界、偶发误码。电平不匹配时有个典型现象:近距离短数据正常,远距离长数据异常,或者受温度影响时好时坏。排查时用万用表量一下高电平电压,低于接收端 VIH 阈值的,基本就实锤了。
**第四个坑:共地问题。**两个设备各自独立供电时,如果 GND 没有可靠连接,串口数据线就会以地电位差为参考,导致偶发乱码。尤其是用开关电源供电的设备,地线上纹波大,更容易触发。排查办法很简单:量一下两边的 GND 之间有没有电压差,如果有,先把 GND 用粗线连起来再看。
**第五个坑:串口号被占用。**设备插上识别了,但调试助手打开时候报“端口被占用”或“打开失败”,偶尔又能正常打开。这种情况往往是系统里残留了虚拟串口、或者是之前程序没释放串口句柄。打开设备管理器,把“端口 (COM 和 LPT)”下面的无主串口删掉,或者把使用该串口的进程结束掉,基本能解决。
3. 蓝牙断开的录屏取证:让“偶发”变成可回放的事实
3.1 蓝牙偶发断连为什么是最难啃的骨头
蓝牙断连问题比串口问题麻烦得多,原因有三个。
第一,链路环境不可控。蓝牙工作在 2.4GHz 频段,环境里的 Wi-Fi、微波炉、USB 3.0 接口、其他蓝牙设备都会造成干扰。同一个设备在实验室没问题,到客户现场就断连,很可能只是空间里干扰源不同。这让“复现”变得极其困难。
第二,协议栈状态复杂。蓝牙协议从物理层、链路层到 L2CAP、ATT、GATT,每一层都可能因为状态机异常导致断连。而且经典蓝牙(BR/EDR)和低功耗蓝牙(BLE)的断连机制还不一样,A2DP 音频传输和 HID 键鼠连接的断连表现也完全不同。最典型的就是 A2DP 切 SCO 模式(通话时)瞬间断连的问题,这个和协议栈对 SCO 链路切换的支持有直接关系。
第三,日志分散。蓝牙连接涉及两个设备——手机/电脑和嵌入式设备。嵌入式端可以打印协议栈日志,但手机端的蓝牙日志要么拿不到,要么需要特殊工具。两边日志不同步,问题发生的那一瞬间到底是谁先断开,很难说清。
所以蓝牙偶发断连的排查,第一步永远是取证,而不是猜测。你得先搞清楚:到底是谁断开的?断开瞬间射频状态如何?主机发了什么命令?设备回了什么错误码?这些信息没有记录,后面所有的分析都是抓瞎。
3.2 录屏取证的具体操作方案
录屏取证的核心思路是:用屏幕录制把操作过程和现象完整记录下来,同时配合系统日志抓取,让“现象”和“日志”时间戳对齐。
以最常见的手机作为蓝牙主机的场景为例,具体操作步骤是这样的。
第一步,手机开启开发者选项。进入“设置 → 关于手机 → 连点版本号”开启开发者模式。然后在开发者选项里找到“蓝牙 HCI 日志”(也叫 Bluetooth snoop log / Bluetooth HCI snoop log),打开它。
第二步,打开系统录屏功能。大部分手机的快捷开关里都有“屏幕录制”,可以直接开启。录制前先打开一个带时间戳显示的 App,比如一个显示完整年月日时分秒的时钟应用,或者系统状态栏自带时间也行。这样录屏画面里始终能看到时间,方便和日志对齐。
第三步,开始复现操作。在录屏状态下,重复触发蓝牙连接、断连、重连的操作。如果问题是在使用过程中偶发断连的,那就正常使用,直到问题出现。关键点是:断连发生的那一刻,画面要能看出是手动断开的还是自动断开的——如果是自动断开的,屏幕上的蓝牙图标会瞬间消失或变成灰色。
第四步,录屏结束后,同步导出 HCI 日志。日志文件一般会生成在手机存储的MIUI/debug_log/bluetooth、log/bt或者类似目录下。不同手机的路径不一样,但都会有一个类似于btsnoop_hci.log的文件,导出即可。
第五步,用 Wireshark 打开 HCI 日志分析。Wireshark 原生支持 btsnoop 格式,打开后选择蓝牙 HCI 协议过滤,就能看到完整的 HCI 命令、事件和数据流。关键信息包括:
- 断开连接(Disconnection Complete)事件里的错误码,比如 0x08 表示超时、0x13 表示远端设备关闭连接、0x3E 表示链路误码率超标被断开。
- 断开前最后的几条 ACL 数据和 HCI 命令,判断是主机主动断开还是设备主动断开。
- 重传次数和数据包错误率,如果断开前出现大量重传,说明射频质量已经很差了。
第六步,如果是 PC 作为主机的场景,Windows 系统可以直接用“事件查看器 → 应用程序和服务日志 → Microsoft → Windows → Bluetooth”查看蓝牙设备连接和断开事件,也可以配合官方蓝牙分析工具(比如 Closed Caption 的 BluetoothLog)来抓 HCI 日志。另外,很多蓝牙芯片厂商提供了专用日志抓取工具,比如乐鑫 ESP32 的 Bluetooth Host 日志,可以通过串口直接打印协议栈内部状态。
3.3 从录屏数据里读出真相
录屏取证不只是为了“留证据”,更重要的是通过现象和日志的对应关系,对问题类型做初步分类。按照我的经验,蓝牙偶发断连可以分成几个大类,每类的排查方向完全不同。
第一类:断开前无任何征兆,突然断连,日志显示错误码 0x08(连接超时)。这说明链路在一段时间内没有任何有效数据交换,协议栈判定连接超时。排查方向是射频环境、天线匹配、发射功率。优先看设备端的天线设计、PCB 走线、天线匹配网络是否正常,以及周围是否存在强干扰源。
第二类:断开前操作特定功能才触发,比如切换通话时断连。这类问题高度指向协议栈或应用层逻辑,典型的如 A2DP 切 SCO 模式时的兼容性问题,常见于第三方蓝牙方案或者老旧协议栈。排查方向是协议栈配置、编解码器协商、以及设备端是否支持同时维护多个 profile。
第三类:断开后设备端日志显示连接被远端关闭(错误码 0x13),但手机端录屏显示是自动断开。这种“双方互相否认”的情况最需要时间戳对齐——通过录屏时间和日志时间对比,确认谁先断开、谁后收到断开通知,往往能发现是某一方的状态机没有正确处理断开事件导致的。
第四类:蓝牙键盘、鼠标这类 HID 设备偶发卡顿或断开,但音频设备正常。这种偏向主机端调度问题,比如 PC 的蓝牙驱动和节能策略冲突、手机的后台省电策略把蓝牙应用冻结等。排查方向以换机为主——换一台手机或换一个蓝牙适配器测试,如果问题消失,基本就是主机端问题。
我踩过的一个典型案例:某客户用 HC-05 蓝牙模块做数据透传,反馈手机连上后几分钟就断,重新连又能连上。工程师查了 AT 指令集配置、串口波特率、电源滤波,折腾了一周没解决。后来我让他录屏取证,录的内容是手机蓝牙设置页面,结果发现断开瞬间,手机屏幕顶部出现了“蓝牙共享已停止”的提示——这根本不是设备端问题,是手机系统杀掉了蓝牙共享进程。直接换了一台手机测试,问题消失。如果没有录屏这个“现场照片”,这个案子可能还要查很久。
4. “新旧批次对照”的烧录排查:平行实验找出差异源
4.1 烧录失败为什么也喜欢“偶发”
烧录问题属于“开发环境问题”,但它同样会出现偶发性:Keil 编译成功,点击下载却提示找不到设备;昨天还能正常烧录,今天就报 No Cortex-M SW Device Found;同一套代码,同事的电脑能烧,你的电脑偶尔烧不进去;同一块板子,换个烧录器就好了。
烧录偶发失败的根源,往往在时序和供电的临界状态。烧录过程对时序非常敏感——复位时序、SWD 时序、时钟启动时间,任何一个如果处在临界状态,就会出现“时好时坏”。而时序临界又经常和硬件物料批次、PCB 布局改动、供电能力变化有关。所以排查烧录偶发问题时,新旧批次对照是一种非常高效的定位方法。这里说的“新旧批次”可以是芯片批次、PCB 版本、也可以是烧录器固件批次。
4.2 新旧批次对照的完整流程
所谓“新旧批次对照”,本质上是一个平行实验:把能正常工作的“旧”组合和出问题的“新”组合放在完全相同的环境下,通过交叉组合来确定差异源。
第一步,准备样本。找一块确定能正常烧录的旧批次板子和一块出问题的新批次板子。如果没有旧板子,就去同事那儿借一块。这一步很关键,没有对照样本,后面所有的分析都是空谈。
第二步,统一环境。把两台板子放在同一个工作台上,接同一台电脑、同一个烧录器、同一根线、同一个软件版本。环境不统一,实验结果没有可比性。
第三步,交叉测试。这个环节一定要做透:
- 旧板 + 新烧录器:如果失败,问题可能在烧录器;如果成功,继续下一步。
- 新板 + 旧烧录器:如果失败,问题可能在新板本身;如果成功,说明新板和旧烧录器组合有兼容问题。
- 旧板 + 旧烧录器:作为参考基线,确保测试环境本身没有问题。
- 新板 + 新烧录器:还原最初故障现场,确认问题仍在。
第四步,对比硬件差异。如果交叉测试表明问题和新板本体有关,那就逐项对比新板和旧板的硬件差异:芯片丝印批次、Flash 型号、复位电路阻容值、供电电路拓扑、甚至 PCB 版本号。很多时候,一次看似无关痛痒的“替代料更换”或者“PCB 走线优化”,就是烧录偶发失败的元凶。
第五步,对比烧录器差异。如果问题出在烧录器上,检查烧录器的固件版本和软件版本是否匹配。比如 J-Link 的驱动版本和 Keil 中配置的 DLL 版本不一致,就会导致连接不稳定。还有烧录器的供电能力——有些山寨 J-Link 在给目标板供电时电流不足,碰到功耗稍大的板子就容易下载失败。
4.3 烧录环节的其他高频翻车点
除了新旧批次对照,烧录偶发失败还有几个高频原因,我单独列一下。
**Boot 引脚状态。**这是 STM32、GD32、ESP32 这些芯片最常见的坑。STM32/GD32 的 BOOT0 引脚如果被外部电路拉到了高电平,芯片会进入系统存储器模式而不是 Flash 启动模式,烧录器根本找不到设备。这个问题的“偶发性”通常来自外部电路上电时序不稳定:BOOT0 引脚悬浮或者被干扰,偶尔处于高电平。排查办法:量 BOOT0 引脚电压,确认没有被意外拉高。
**复位电路问题。**烧录器在进入烧录模式时通常需要控制目标芯片的复位引脚。如果复位电路上的电容太大,复位脚的电平变化就慢,烧录器可能会在芯片还没完成复位时就开始通信,导致烧录失败。这种问题在更换了大容量复位电容或者调整了上拉电阻后会偶发出现。
**SWD 线过长。**SWDIO 和 SWCLK 两条线如果超过 20cm,烧录失败的几率会明显上升,尤其是时钟频率调得比较高时。这个问题偶发的原因在于:线长引入的分布电容和信号反射,会因为接触状态、环境温湿度的微小变化而波动。排查办法:剪短线缆,或者把 SWD 时钟频率从默认值往下降一档(比如从 4MHz 降到 1MHz),往往立竿见影。
**芯片读保护锁死。**如果芯片内部 Flash 被意外设置了读保护,烧录器会报 RDDI-DAP Error 之类的错误,表现也像“偶发”——因为可能上电后的某几次连接还能读到,后面就完全连不上了。排查办法:用烧录器的“unlock”或“erase all”功能清除保护位。需要注意的是,不同芯片的解锁命令不一样,操作前先确认。
**ESP32 系列的 IO0 引脚。**ESP32 进入下载模式的必要条件是把 IO0 拉低再复位。IO0 的电路如果在不同批次板子上有微小差异(比如外部下拉电阻阻值变化),就会出现“这次能烧下次不能烧”的假偶发问题。Arduino 给 Uno 板烧录引导程序时也类似,需要先确认目标板的自动复位电路是否正常,ISP 工具和目标的通信时序是否稳定——这也是为什么“Arduino 给 Uno 板烧引导”这种操作经常翻车。
**供电不稳定。**烧录过程中芯片电流变化大,如果供电线路电阻大或者电源输出能力不足,电压跌落就会导致烧录中途失败。表现是“烧写到 50% 突然报错”,重新上电又可能成功。排查办法:用示波器抓烧录过程中的 VDD 波形,看有没有明显跌落。
5. 排查工具与快查手册:平时备好,用时少折腾
5.1 串口工具链推荐清单
串口问题排查离不开趁手的工具,我按用途整理了一份清单。
串口调试助手:SSCOM、XCOM、PuTTY 是三个最常用的。SSCOM 功能全,支持定时发送、文件发送、自动回复,适合常规调试。XCOM 界面简洁,接收性能好,适合大数据量接收。PuTTY 是纯终端工具,适合应急使用,但不支持十六进制显示。建议平时三个都装好,出问题时交叉验证。
逻辑分析仪:国产的 Saleae 兼容逻辑分析仪,8 通道、24MHz 采样率版本就够用。用来抓 UART 波形时,可以直接在软件里设置波特率,自动解码成 ASCII 数据。排查串口“到底有没有发数据”这个问题,逻辑分析仪比示波器更合适,因为它能看到一整段数据流。
示波器:至少 100MHz 带宽的双通道示波器,用来测量电平、检查波形毛刺、验证时序。排查串口电平不匹配时,示波器直接量 TX 引脚的逻辑高电平电压,和接收端 VIH 阈值对比,立刻知道有没有问题。
USB 转串口模块:CH340、CP2102、FT232 三种方案各备一个。CH340 便宜通用,CP2102 稳定性更好,FT232 抗干扰最强。出问题时逐个换,快速区分驱动和硬件问题。
5.2 蓝牙日志采集速查表
蓝牙问题的排查工具相对分散,我按主机类型整理:
| 主机端 | 工具/方法 | 关键信息 |
|---|---|---|
| Android 手机 | 开发者选项 → 蓝牙 HCI 日志 | 完整 HCI 命令和事件流 |
| iOS 手机 | 无内置 HCI 日志,需用外设抓包工具 | 建议用蓝牙抓包器(如 Ellisys) |
| Windows PC | 事件查看器 → Bluetooth 事件 | 连接/断开事件和时间戳 |
| Windows PC | BluetoothLog / Wireshark + btsnoop | 完整 HCI 日志 |
| 嵌入式设备 | 串口打印协议栈日志 | 设备端状态和错误码 |
| 通用方案 | 蓝牙抓包器(Ellisys / Frontline) | 射频层、协议层全量数据 |
实际项目中最常碰到的情况是嵌入式端和手机端都各自有日志,但两边时间不同步。解决方法是:在嵌入式端的日志里增加一个“当前时间”打印,同时在录屏画面里开启手机时间显示,两边时间误差控制在 1 秒以内,就能对齐绝大多数事件。
5.3 烧录排查快速对照表
烧录问题的表现千奇百怪,但根因就那几个。整理一个快速对照表,遇到问题直接按图索骥:
| 现象 | 可能原因 | 优先排查方向 |
|---|---|---|
| 找不到设备(No target connected) | BOOT 引脚状态异常 | 量 BOOT0 电压 |
| 连接成功但下载时卡住 | SWD 线过长或时钟频率过高 | 换短线、降频率 |
| 烧写到中途报错 | 供电跌落、芯片读保护 | 示波器抓 VDD、解锁芯片 |
| 昨天能烧今天不行 | 烧录器驱动/固件更新了 | 检查驱动版本、换旧版驱动 |
| 新板子全烧不进,旧板正常 | 硬件批次差异 | 新旧批次对照 |
| Keil 显示烧录成功但程序没跑 | Boot 启动配置改变 | 检查启动引脚和 Flash 起始地址 |
| 偶发连接失败 | USB 休眠策略 | 关闭 USB 选择性暂停 |
对照表里的每一行,都是我实际踩过的坑。尤其是“Keil 显示烧录成功但程序没跑”这条,最容易被误判为“烧录没问题”,实际上可能是新批次芯片的 Flash 起始配置或者 Option Bytes 和老批次不一致导致的。
6. 写在最后的一些个人习惯
排查偶发 bug 这三板斧——换机排除、录屏取证、批次对照——用熟了之后,最大的收获不是能解决问题,而是能做决策。串口假故障确认了是上位机驱动问题,就可以直接跟客户说“换电脑”而不是折腾半天固件;蓝牙断连取证后确认是手机系统杀进程,就可以理直气壮地回复“设备端无问题”;烧录失败通过批次对照锁定了是 PCB 版本变更引入的问题,就可以推动硬件侧改动而不是在软件里打补丁。
一套流程走下来,我自己的习惯是:每处理一个偶发问题,就更新一份“排查记录表”,把现象、排查步骤、根因、最终方案写进去。下次再遇到类似问题,直接翻记录表,能省掉一大半重复劳动。这个习惯坚持了几年,效果远比靠脑子记要好。
最后再分享一个“土办法”:遇到实在复现不出来的偶发问题,把设备长时间跑起来(比如连续跑 24 小时),然后每隔一段时间拍一张照片记录状态。很多偶发问题其实是有周期性的——温度漂移、定时器溢出、内存碎片——长时间观察加上记录,往往能发现你平时注意不到的规律。
排查偶发 bug 没有银弹,但把这几个方法组合起来,至少能让问题从“玄学”变成“工程问题”。工程问题,总有解。