ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

偶发Bug不再难查:串口、蓝牙、烧录三大场景排查方法论

偶发Bug不再难查:串口、蓝牙、烧录三大场景排查方法论 干硬件调试这行最怕的不是跑不通的功能而是“偶尔跑不通”。串口调试助手今天能收数据明天收不到蓝牙连接十次有九次正常就一次断开同一套固件烧录A板一次过、烧录B板就报错——这类问题有个共同特征不能稳定复现所以排查时无从下手试了几次又正常了于是搁置过两天又冒出来。我试过很多方法之后总结出三条最实用的路子串口假故障用换机排除蓝牙偶发断开靠录屏取证烧录行为异常做新旧批次对照。这三条路本质上是把“偶发”变成“可复现、可比较、可追踪”的过程一套方法论下来很多原本要耗几天的疑难杂症半天就能定位到具体环节。1. 偶发bug为何最难追先建立一套可复现的排查总框架1.1 偶发问题的三个常见根源时序、环境与批次偶发问题最磨人的一点是“你盯着它的时候它不犯你一转身它又犯”。这不是玄学背后通常是可以归类的技术原因。我这些年排查下来发现绝大多数偶发问题逃不出三个根源时序、环境、批次。时序类问题占到相当比例。比如初始化代码里外设还没完全稳定就启动DMA传输或者中断服务程序里做了耗时操作导致主循环里的某个标志位被延迟处理又或者两个线程同时访问同一个缓冲区没有加锁。这类问题在单次运行中时好时坏调试器一暂停代码就换了时序反而更难复现。排查时序类问题逻辑分析仪或示波器是必需品需要把关键引脚的波形抓出来和代码执行顺序逐帧对比。环境类问题同样常见。串口偶尔连不上很可能不是代码问题而是USB口供电不稳CH340的VCC掉到了3.0V以下蓝牙每隔几分钟断开一次可能是天线附近多了个铁质外壳把射频信号衰减到了临界灵敏度烧录失败也可能是USB转串口的线质量太差信号上升沿不够陡峭。环境类问题的特点是换个环境就好了换个位置就犯具有很强的“场景性”。批次类问题则隐蔽得多。同一条生产线的板子前后两批芯片的版本丝印不同Flash的擦除时间参数略有差异甚至PCB上某个电阻的封装尺寸变更导致寄生电容变化都可能让同版固件在不同批次板子上表现不一样。这种问题如果手里只有一块板子基本查不出来必须把新旧批次的板子放在一起做对照实验。举个例子之前有个产线反馈说同一批次的板子偶尔出现上电后ADC采样全是0xFF的情况十块里头大概有一块。单独测那块板子反复上电就能复现。后来用示波器抓电源轨发现复现时恰好VDD上电瞬间有一个300ms的跌落而正常的板子没有这个跌落。最终定位到是某批次板子上的一个大电容焊反了导致上电瞬间充电电流过大把前端稳压器拉垮了。这就是典型的环境与批次交织的问题如果只盯着代码永远查不出来。我的建议是拿到一个偶发问题后先不要急着打开代码而是先问三个问题这个问题有没有时间规律换个环境还出现吗新旧板子表现是否一致把这三个问题答完排查方向基本就清晰了。1.2 调试工具链与排查方法论的整体设计针对上面三类根源我最常用的手段正好一一对应环境类问题用换机排除时序与状态类问题用录屏取证批次类问题用新旧对照。这三招合起来本质是同一套逻辑——把“偶发”拆解成可复现、可比较、可追踪的三个维度。可复现是指通过固定环境、固定操作步骤尽量把偶发变成必现。比如怀疑USB口供电问题时就固定用同一个USB口、同一根线、同一台电脑复测怀疑蓝牙断开时就固定手机型号、APP版本、连接距离。只要样本量够大偶发问题往往会露出时间规律或操作规律。可比较是指准备多个变量组合做对照。换机排除说到底就是“换A留B”和“换B留A”两组实验互相印证新旧批次对照则是“旧板固件A新板”和“新板固件B旧板”的交叉验证每次只动一个变量结论才能站得住脚。可追踪是指把每次复现的现场证据留下来。录屏是最直观的取证手段但还不够还需要配合串口日志、蓝牙HCI日志、系统logcat一起抓形成一条完整的时间线。这套方法论建立起来之后偶发问题就不再是“碰运气”式排查而变成了一套可以写进新人培训手册的标准化流程。下面我按串口、蓝牙、烧录三个具体场景分别展开讲。2. 串口假故障换机排除法怎么用才有效2.1 串口问题的“真故障”与“假故障”如何区分“串口假故障”这个词是我们在产线上自己总结的叫法。字面意思就是现象上看起来串口坏了实际上硬件和软件都没坏只是某个外部条件不满足。最典型的例子是CH340驱动冲突。CH340是市面上最常见的USB转串口芯片很多开发板、USB-TTL模块都在用。Windows系统下如果电脑上装过多个版本的CH340驱动或者驱动被其他USB设备占用了资源就会出现设备管理器里能看到COM号、但一打开串口调试助手就报“打开失败”或者打开能看到设备却收不到数据。这时候如果单纯去怀疑板子有问题换一块新板子来测照样连不上——问题根本不在板子身上。还有一种假故障是电平不匹配。虽然现在很多TTL模块都标注了“兼容3.3V/5V”但实际上一块5V单片机的串口TX输出高电平是5V接在3.3V的STM32串口RX上长期使用可能把3.3V的引脚打坏。电平不匹配导致的现象往往是“时好时坏”电压勉强在阈值附近时能通信稍微波动一下就不行了。这才是真正的“偶发串口故障”。供电不足也经常伪装成串口假故障。很多USB-TTL模块是直接从USB口取电的如果电脑USB口本身供电能力弱模块上还挂着其他负载VCC已经被拉低。示波器一看TX引脚的电平只有2.5V逻辑1都算不上了自然收不到数据。这种问题在笔记本电脑的USB Hub上尤其常见插了移动硬盘再加模块电压立刻萎掉。区分真故障和假故障我有个简单的检查顺序先换线、再换口、然后换机、最后换板。每条线、每个USB口、每台电脑、每块板子都试一遍每次只改变一个变量记录哪些组合能通、哪些不能通假故障的真面目很快就浮出来了。2.2 换机排除的具体操作步骤与细节换机排除法听起来简单但很多人做得不规范。我见过同事一上来就把两块板子的线全部拔掉重新接结果本来好的板子也弄坏了。正确的操作应该是按固定步骤来每一步都留记录。第一步确认故障现象是否稳定。先在自己常用的电脑A上用串口调试助手连续收发测试100次把失败次数记录下来。如果100次全部失败说明故障是可复现的适合用换机排除如果100次里只失败几次那就要先把收发测试的时间拉长甚至跑一晚上脚本积累足够多的样本。这个环节可以用简单的Python脚本跑循环收发顺便把失败的数据和时刻存下来import serial import time ser serial.Serial(COM3, 115200, timeout1) fail_count 0 for i in range(10000): ser.write(bping\r\n) data ser.readline() if bpong not in data: fail_count 1 print(f[{i}] timeout, partial data: {data!r}) time.sleep(0.1) print(fdone, fail rate: {fail_count / 10000:.4%}) ser.close()第二步单变量替换。故障在电脑A上稳定出现后换一根USB线用同一块板子继续测。注意USB线也要分两种一种是只充电的数据线一种是完整的数据线很多劣质线材只通了电源线没通数据线这个问题被无数人踩过。换线后如果故障消失那问题就在线上不用继续往下查了。第三步换USB口。如果换线没用换到电脑A背面主板的USB口跳过前置面板和USB Hub。USB Hub供电不足导致的串口假故障非常普遍尤其是那种不带外部电源的Hub。换口后如果正常了基本可以锁定供电问题。第四步换电脑。换到电脑B上用同一块板子、同一根线、同一个USB口测试。如果电脑B正常而电脑A不正常问题多半出在电脑A的驱动或者USB控制器上。这时候可以去设备管理器查CH340/FTDI驱动的版本卸载重装或者换成官方最新版驱动。FTDI芯片的驱动尤其要注意系统自带的驱动偶尔会跟官方驱动冲突表现就是设备识别正常、数据收发异常。第五步换板子。以上四步都做了还不行才轮到怀疑板子本身。拿一块同型号、确定正常的板子接上来测如果新板子也出现同样的现象那问题基本可以排除板子硬件回到电脑端继续查如果新板子正常而旧板子不正常那才需要查旧板子的串口电路比如焊点、电阻、芯片引脚。这里我想强调一点换机排除的每一步都要在测试表格里记录“设备组合、测试次数、成功次数、失败现象”。记录不是为了交差而是因为偶发问题的排查往往要跨越几天记忆不可靠只有记录才能让你在第三天回头分析时还能还原第一天的现场。3. 蓝牙间断性断开录屏取证的价值与正确姿势3.1 为什么录屏是蓝牙偶发问题的第一手证据蓝牙问题比串口问题更让人头疼因为它的干扰源太多了。2.4GHz频段本来就拥挤WiFi、微波炉、无线鼠标、隔壁工位的USB 3.0设备都可能干扰蓝牙信号。加上蓝牙本身的跳频机制、蓝牙模块的PCB天线设计、手机系统的省电策略任何一个环节有问题都可能表现为“偶尔断开”。我在排查蓝牙偶发断开时第一反应永远是拍视频或录屏而不是打开代码。原因很简单蓝牙断开这个现象本身是瞬时的如果不录下来等你去设备管理器里看的时候连接状态可能已经恢复证据已经消失。录屏可以把“断开发生的时间点”“断开前的最后操作”“断开时的界面状态”“系统是否弹出了错误提示”完整保存下来。录屏取证对技术人员自己也有价值。很多时候咱们排查问题习惯性地盯着串口日志看反而忽略了UI层面的操作上下文。但蓝牙断开的触发条件往往跟用户操作有关比如打开某个页面、切换后台、锁屏后再解锁。有录屏在手你才能把“用户操作序列”和“底层日志”关联起来定位到触发断开的具体动作。另外录屏在跨部门协作和客户现场问题处理时也是硬通货。你拿着手机拍下来的断开视频比干巴巴地在群里发一句“蓝牙会断开请排查”要有说服力得多。我处理过好几次客户投诉最后都是靠客户提供的录屏视频截图圈出断开时间点和错误码才推进了FAE的分析进度。3.2 录屏日志的组合取证实操录屏工具的选择比较灵活。手机端用系统自带的录屏功能就好注意把屏幕方向锁定、开启录屏时同时录麦克风声音。如果现场需要同时录制手机画面和被测设备的状态可以架一台手机固定机位拍设备指示灯另一台手机录屏幕操作后期再把两个视频的时间轴对齐。PC端如果是调试电脑连着的蓝牙设备可以用OBS录制整个调试过程配合串口调试助手的界面。做这种录屏之前我建议先开启电脑自己的屏幕录制快捷键比如Windows的WinG游戏栏录制时尽量把任务管理器也打开方便后续查看蓝牙服务进程是否异常。光有视频还不够必须要配合日志。Android端抓蓝牙日志的标准姿势是在开发者选项里打开“蓝牙数据包日志”这个开关会生成bnoop_hci.log文件保存了所有HCI层的数据包。抓到断开现场后用Wireshark打开这个log文件在时间线上找到断开的时刻看断的是SCO链路还是ACL链路断开原因码是什么。Wireshark里可以用显示过滤条件限定协议范围例如只保留L2CAP和SMP层的交互快速定位断开前后的握手过程。断开原因码通常出现在断开命令Disconnect的Reason字段里鼠标点开数据包就能看到。常见的原因码比如0x08表示连接超时、0x13表示远端设备关闭连接、0x16表示连接终止、0x3E表示连接失败每个原因码对应的排查方向都不一样。如果被测设备是自己的硬件不是手机APP那就需要从蓝牙模块的串口调试口抓AT指令日志。很多蓝牙模块包括常见的HC05这类SPP透传模块串口都支持输出调试信息把串口调试助手挂在模块的调试串口上设置好波特率日志会实时打印握手、连接、断开的整个过程。这时候再配合录屏里的时间点就能把“系统发出断开命令时模块串口上有无收到对应指令”对应上。日志抓完后整理证据链时有几个关键信息必须标注蓝牙设备的MAC地址、连接使用的协议SPP/BLE、信号强度RSSI值如果可以查到、断开发生距连接建立的时间间隔、以及断开前最后3条收发数据。这五样信息有了十有八九能判断出是远端主动断开、本地主动断开还是链路超时断开的。4. 新旧批次对照烧录排查的落地方法4.1 烧录失败的批次差异从哪来烧录这个环节看起来是最“标准化”的操作实际上变量一点都不少。烧录器型号、烧录软件版本、目标芯片型号、Flash芯片的手册参数、电源电压、时钟频率任何一个变量有差异都可能造成“这块板子能烧、那块板子不能烧”的怪现象。批次差异主要体现在三个方面。第一是芯片批次。同一个型号的MCU新旧批次的芯片内部Flash工艺可能有微调擦除时间、编程电压、ID读取时序都有差异。老批次的芯片烧录一切正常新批次的芯片烧录时报ID错误或校验失败这种情况我遇到过不止一次。第二是Flash芯片批次。如果产品用的是外挂Flash各个品牌、各个批次的Flash在擦除时间、页编程时间、状态寄存器时序上差别很大烧录工具默认参数只匹配某一个型号。第三是周边器件批次比如晶振的负载电容变了、电源去耦电容焊错规格导致芯片上电时序异常烧录器进不了编程模式。最典型的场景跟标题里说的一致旧批次板子用Keil烧录一次过新批次板子烧录到一半报“Flash Download Failed”或者干脆连不上芯片。这时候如果只盯着新板子反复试很容易陷入“是不是这块板子坏了”的死循环。正确的思路是把新旧两块板子放在一起逐项对照硬件版本和烧录配置。这里要特别提醒一点不管是STM32、ESP32还是普通8051烧录排查的核心思路都是一样的。ESP32用esptool.py烧录时也会出现“A fatal error occurred: Failed to connect to ESP32”之类的偶发报错排查时同样可以去查芯片版本、Flash型号、烧录波特率这些变量对照不同批次模组的表现。4.2 对照实验的具体流程与要点实践新旧批次对照排查时我的操作流程分为四步。第一步先确定新旧批次的差异范围。核对PCB的版本号丝印、原理图变更记录、BOM清单变更确认这两块板子除了批次不同外还有没有其他已知的差异。如果BOM里换过Flash型号或者晶振十有八九就是罪魁祸首。第二步检查芯片ID是否一致。用烧录工具读芯片的Device ID新旧板子各读一次看是否相同。JFlash里可以直接显示芯片IDKeil的Target Options里选好芯片型号后烧录也会校验ID。如果新板子读出的ID跟软件里配置的不一致烧录失败的结论基本就定了。这时候不是改代码的问题而是要把软件里的芯片型号选对或者更新烧录器软件版本以支持新批次的芯片。第三步烧录配置逐项核对。Keil里具体是这么操作打开Options for Target切到Utilities页点Settings进入Flash Download对话框。这里面有几个必查项Download区域里是选了“Erase Full Chip”还是“Erase Sectors”批量生产通常用扇区擦除以提速但新批次Flash如果扇区边界地址变了扇区擦除可能漏掉某些区域导致校验失败Programming Algorithm列表里的Flash算法文件默认可能是针对某个密度型号的如果芯片换成了不同密度或容量的版本算法文件必须同步替换RAM for Algorithm这个值如果太小下载算法运行时可能崩掉最基础的是Device下拉框里选的芯片型号要跟实际芯片完全一致。JFlash同理Project Settings里的Device型号、接口类型JTAG/SWD、接口速度都要精确匹配。第四步交叉烧录验证。这是最有说服力的实验用新批次的板子跑旧批次能成功的那套配置再用旧批次的板子跑新批次需要调整后的配置两组结果一对比结论立现。如果新板子换用新版Flash算法后烧录正常那就确认是Flash算法或芯片型号配置问题如果交叉烧录后还是失败那就得往下查硬件电路了比如复位电路、电源纹波、下载线长度。做对照实验时要特别注意烧录器本身的一致性。同一个烧录器固件版本升级前后行为可能不同不同型号的ST-Link、J-Link在信号驱动能力上也有差距。所以对照实验尽量用同一个烧录器、同一台电脑、同一根下载线只改变待测板子这样得出的结论才可靠。5. 排查工具与经验速查表5.1 常见偶发问题与解决思路对照整理了一份我在实际排查中常遇到的偶发问题对照表供大家参考。这张表的核心思路是先判断问题类型再选择对应的排查手段。现象可能原因优先排查手段关键工具串口偶尔连不上CH340驱动冲突、USB口供电不足、线材不合格换USB口再换电脑测试设备管理器、串口调试助手串口收发不稳电平不匹配、TTL电平线过长、地线未共地示波器量TX/RX波形示波器、USB-TTL模块蓝牙偶发断开2.4GHz干扰、模块天线问题、手机省电策略录屏抓HCI日志手机录屏、Wireshark蓝牙信号弱天线布局差、金属外壳遮挡、射频匹配不当对比不同方向/距离的RSSI蓝牙信号检测APP烧录失败芯片批次变更、Flash型号选错、烧录算法不匹配新旧批次对照烧录Keil/JFlash/烧录器烧录校验失败Flash擦除不完整、电压跌落降低烧录时钟、检查电源电压示波器、稳压电源上电偶发死机复位电路异常、电源纹波大新旧批次对比波形示波器、逻辑分析仪这张表不能当成万能药方但可以当作排查起点。遇到一个新的偶发问题先到表里找对应行哪怕找不到精确匹配也能给你提示一个大致方向。5.2 几条值得记住的排查原则排查偶发问题几年下来我总结了几条原则不一定写在教科书里但实战中确实管用。第一条一次只改变一个变量。换机排除也好、新旧对照也好最忌讳的就是同时动了两个变量。比如你既换了电脑又换了USB线即使问题消失了你也不知道是哪个起作用。严格遵守单变量原则才能让每次测试的结果有明确归因。第二条证据永远比记忆可靠。录屏、截图、日志、测试记录这些硬证据是你跟同事、跟供应商、跟客户沟通时最有力的语言。我在整理蓝牙断开问题时就吃过亏第一次断开没录屏只凭记忆描述结果供应商根本不买账后来录了视频对方马上就重视起来了。第三条别迷信新批次一定是好的。很多人拿到新批次板子烧录失败第一反应是“新板子有问题”但往往忘了可能是旧批次板子用了老配置才碰巧能过。对照实验的妙处就在于它让你把“新旧”这个标签暂时放一边纯粹看配置与硬件是否匹配。第四条偶发问题用长测来放大。很多偶发问题样本量不够的时候根本看不出规律。我建议把测试脚本化、自动化比如串口收发测试用Python脚本跑一万次蓝牙连接断开用脚本循环操作烧录用命令行批量执行。样本量上去了规律自然就出来了。第五条心态上要接受“有些问题确实需要时间”。偶发问题排查往往不是一次定位而是通过排除法逐步缩小范围。我在现场经常跟新人说排查偶发问题的过程就像钓鱼你要做的是把水面上的干扰一项项排除最后剩下的那条鱼才无处可逃。6. 写在最后的实操体会把串口、蓝牙、烧录这三条线串起来看它们背后其实是一套通用的排查哲学不要跟偶发问题硬刚而要换个角度把它变成一个可比较的确定性实验。换机排除帮你把环境变量隔离开录屏取证帮你把时间线上的证据固定住新旧批次对照帮你把硬件差异摊到桌面上对比。我个人感受最深的一点是这三种方法都不需要太昂贵的工具也不需要多么高深的理论关键是养成“严谨操作、及时记录、客观对照”的习惯。我调试过的产品里有一大半的偶发问题最后定位出来的原因都特别简单要么是一根线老化要么是一个驱动版本不一致要么是一个Flash配置文件选错了。所以在动手写代码、改硬件之前先把取证和对照的功课做扎实往往能省下好几天的冤枉时间。最后再分享一个小技巧准备一个固定的“排查工具箱”里面放一根备用USB线、一个USB电流电压表、一个小型USB Hub、几颗不同阻值的下拉电阻、一根转接线外加一个记录本。这些东西加起来不贵但能让你在遇到偶发问题时第一时间展开排查而不是翻箱倒柜找工具。排查偶发问题的过程本质上就是在跟不确定性打交道工具越顺手你的底气就越足。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进