刚来公司不久,生产线上有个bug。表现为一条正常的心率曲线会有个别点不在线上,而是偏离了这条线(姑且定义为掉点吧)。
而且随着时间的推移,这些偏离的点越来越多。
debug思想:1可疑地方在上送的数据本身就是错的或2上送的数据是错的但画错了。
后者不太可能,因为画线的方法写好了,较底层。我先测试上送的数据,测斜率变化,发现斜率变化没有很大的跳动。
认为上送的数据也是对的了。那问题还是在上送数据生的处理后面。再发再还有个缓存池缓存上送的数据的,会不会从这里出问题了呢。
同样的方法测斜率,发现也是对的。处理数据没问题。再后来发现原来画线和处理数据是由两个不同的线程处理的,画线的线程控制着缓存池的下标
定时从池里取数据并且下标index++。而缓存池的写线程是定时的,隔那么多毫秒往池中写一个上送过来的数据,写入的数据位置下标正是画线控制的下标index
那么问题来了,这两个线程可能不同步,当画线线程快于存数据线程时,缓存池的下标在写过程就出现跳跃的情况,此时缓存池被跳过的位置保留的正是上次留下的数据
当然出问题了。如何解决呢。采用插值法,写线程缓存上次写数据的下标,当画线线程从这里取数据快过缓存池上次缓存位置时,直接用上一次的数据而不是垃圾数据。
这个bug前后花了四天时间才解决,纪念一下。
而且随着时间的推移,这些偏离的点越来越多。
debug思想:1可疑地方在上送的数据本身就是错的或2上送的数据是错的但画错了。
后者不太可能,因为画线的方法写好了,较底层。我先测试上送的数据,测斜率变化,发现斜率变化没有很大的跳动。
认为上送的数据也是对的了。那问题还是在上送数据生的处理后面。再发再还有个缓存池缓存上送的数据的,会不会从这里出问题了呢。
同样的方法测斜率,发现也是对的。处理数据没问题。再后来发现原来画线和处理数据是由两个不同的线程处理的,画线的线程控制着缓存池的下标
定时从池里取数据并且下标index++。而缓存池的写线程是定时的,隔那么多毫秒往池中写一个上送过来的数据,写入的数据位置下标正是画线控制的下标index
那么问题来了,这两个线程可能不同步,当画线线程快于存数据线程时,缓存池的下标在写过程就出现跳跃的情况,此时缓存池被跳过的位置保留的正是上次留下的数据
当然出问题了。如何解决呢。采用插值法,写线程缓存上次写数据的下标,当画线线程从这里取数据快过缓存池上次缓存位置时,直接用上一次的数据而不是垃圾数据。
这个bug前后花了四天时间才解决,纪念一下。