最近调试遇到的bug总结


这一周都在解bug,稍微总结一下:

Bug1.LinkStatus的指示灯状态不正确

问题描述

设备上下线后,语音播报上下线正常,但是代表网络状态的LED状态没有正常更新

解决过程

串口调试发现,单次向MCU发送控制请求经常失败,导致LED状态不更新,改为多发几次(由1次改为5次)

期间尝试了发送单字节发送,各字节间sleep一段时间,但是效果不佳【原因是被其他进程堵塞】。

另一问题是有一个线程在读取传感器数据时因未连接对应传感器导致卡死在read里,解决办法是用select函数去对读取超时进行限制

还有一个原因是上下线的判断机制问题,交由其他同事处理。

Bug2.倒计时数码管的延时卡顿

问题描述

倒计时的设置页面存在卡顿现象,延时严重

解决过程

检查代码发现存在如下问题:

1代码用了很多if/else if,判断深度很深

2.对于部分变量存在重复判断,效率较低

3.各分支的休眠轮询周期都是不同常数,不统一

改用状态机理清状态的跳转逻辑,定义了休眠轮询时间并在函数初始化时定义,卡顿未消失。

通过单独验证向MCU发送实时秒数,发现延时在5秒左右(相比与串口的打印信息),降低发送频率,延时消失;故可以判断是发送消息过多,造成堵塞,MCU处理队列满后,新消息无法入队。(但无法解释为何之前只开启串口向MCU发指令,关闭其他所有线程下,单次发送指令经常失败的现象,有待探究

解Bug过程中发现的衍生Bug

1.检查发现设置倒计时的秒数时,0秒减少到59秒时,分钟数显示不正确的问题,经检验发现是状态机下,原代码的写法(先计算和显示分钟数再执行time--,导致显示的分钟数错误),修改执行顺序即可;

2.倒计时秒针跳动不均匀,偶尔会出现连续跳动两秒的情况,原因是之前设置的sleep的粒度太大,500ms,而其他的函数销号一定时间,导致倒计时中,出现了部分秒的显示时间只有500ms,解决办法:将粒度降低(如100ms),改变更新策略,只有当秒数发生改变时才进行更新。


经验教训:

找问题第一步是找具体过程在程序中经历的路径;
构建简化模型进行测试,旧问题未解决前不要引入新的功能;
一定要有时间和带宽的概念;
没有回传机制,传输数据就存在失败可能;
更多的调试方法(打印),观察现象;
调试遵循单变量/二分法原则;
需要分析bug产生的原因,很多最后就是数学问题。


猜你喜欢

转载自blog.csdn.net/linearf/article/details/79035857