您的位置:首页 > 其它

一个时序混乱导致的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.

这是为什么呢?下面我们一步步分析。我们先贴出后台线程伪代码逻辑:



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.

分析完毕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: