一个时序混乱导致的bug分析过程记录
2012-11-23 17:23
387 查看
我们先来介绍下业务需求. 业务大致逻辑为:
(1) App_BG_Service为一个线程,每隔50ms跑一次,它会去检查DTV系统的状态,然后根据DTV系统的状态去mute或取消mute.
如果当前状态为no-signal , 那么就要让系统系统静音,否者取消静音。
(2) Plf_Check_***Data为另外一个线程,它会每隔2s更新下当前系统状态。App_BG_Service线程会每隔50ms去拿下状态,并且buffer到tempStatus里。最终根据tempStatus去做上(1)步所说的mute 或unmute操作。
QA测出的系统bug表现为:在播一个只有音频的频道(audio channel)时,播一段时间后,会突然没有声音。(非必现)
经过debug发现,在播放audio channel码流时,中间会出现no-signal(无信号状态)。在无信号状态,系统应该去mute.但是恢复到有信号状态时候,系统并没有去unmute.
这是为什么呢?下面我们一步步分析。我们先贴出后台线程伪代码逻辑:
下面我们分析下,如下图所示:
由上图可知,如果刚好在第2s和第4s分别发生由signa---->nosignal和nosignal--->signal状态的变化,那么系统可能出现长时间的异常mute.
分析完毕。
(1) App_BG_Service为一个线程,每隔50ms跑一次,它会去检查DTV系统的状态,然后根据DTV系统的状态去mute或取消mute.
如果当前状态为no-signal , 那么就要让系统系统静音,否者取消静音。
(2) Plf_Check_***Data为另外一个线程,它会每隔2s更新下当前系统状态。App_BG_Service线程会每隔50ms去拿下状态,并且buffer到tempStatus里。最终根据tempStatus去做上(1)步所说的mute 或unmute操作。
QA测出的系统bug表现为:在播一个只有音频的频道(audio channel)时,播一段时间后,会突然没有声音。(非必现)
经过debug发现,在播放audio channel码流时,中间会出现no-signal(无信号状态)。在无信号状态,系统应该去mute.但是恢复到有信号状态时候,系统并没有去unmute.
这是为什么呢?下面我们一步步分析。我们先贴出后台线程伪代码逻辑:
if (stillimage状态有变化) { 如果是audio channel, mute; 否者, 取消mute; } else { if( signal 状态有变化) { if ( 状态不是好的,如无信号 ) { mute; } else { // Open video normally if ( TempStatus.StillImageType != _STILLIMAGE_VCHIP_BLOCK_ && TempStatus.StillImageType != _STILLIMAGE_CHANNEL_LOCK_ && TempStatus.StillImageType != _STILLIMAGE_INPUT_LOCK_ && ((TempStatus.ScreenColor == _NO_COLOR_) || (TempStatus.bAudioChan) ) ) { 取消mute; } else { mute; } } } }
下面我们分析下,如下图所示:
由上图可知,如果刚好在第2s和第4s分别发生由signa---->nosignal和nosignal--->signal状态的变化,那么系统可能出现长时间的异常mute.
分析完毕。
相关文章推荐
- 记录一个前端bug的解决过程
- 记录一个使用HttpClient过程中的一个bug
- 一个panic bug的分析过程1
- GIT : 记录IntelliJ IDEA 合并冲突时的一个bug(冲突解决后代码和本地仓库一样时导致merge失败)
- 一个panic bug的分析过程(一)
- 一个panic bug的分析过程(一)
- 记录一次bug解决过程:else未补全导致数据泄露和代码优化
- 记录一个System.out.println导致Eclipse主线程阻塞的 bug
- 一个rac问题分析过程由于进程资源不足导致的问题
- 一个panic bug的分析过程
- 一个panic bug的分析过程(一)
- 分享一个IPhone bug的分析过程(兼xcode编译器应该改进的地方)
- 一个杀不死的小强,kill进程无效的原因 记录故障排查过程中kill进程无效的分析过程
- 记录一个粗心所导致的bug
- 很好的一个分析bug的文章,供以后疑难bug参考,转一下:一次segfault错误的排查过程
- 记录一个粗心所导致的bug
- 直接使用临时变量导致的一个bug记录
- 一个panic bug的分析过程(一)
- Hive1.1.0中一个BUG的记录分析
- 一个磁盘I/O故障导致的AlwaysOn FailOver 过程梳理和分析