Bug经典回放(四)

来源:互联网 发布:单片机最小系统焊接图 编辑:程序博客网 时间:2024/04/29 23:27

Bug现象:
    还是调试别人的程序. 这次是GUI.  我们的GUI是基于SDL OpenGL的. 程序运行以后进行视频播放.在出现的工具条上不停的点击几下后. 整个GUI系统均停止响应.
    工具条有个属性.在开始播放音乐或者视频后.会根据播放引擎通过一个引擎来设置toolbar的属性. 比如.在同一个位置放置不同命令的Button. 激活或者关闭一些按钮. 如果关闭这个功能. 那么Bug消失. 我开始的时候是怀疑多线程的问题. 干掉线程后.问题依旧...
    因为 GUI的这个问题只在Linux下存在. 而Linux下的GDB又没办法准确的追踪C++ RTTI信息. 调试非常困难. 只能慢慢分析代码.
    经过将近6个小时的分析. 发现鼠标按下去时候. GUI系统会设置一个m_pCaptureWindow.表示窗口系统抓住这个窗口.并把鼠标消息往里面传递. 鼠标抬起的时候, 则释放这个窗口m_pCaptureWindow=NULL,.  鼠标抬起或者移动的时候 .发现焦点不在这个Window内则不处理.   如果这个在鼠标按下和释放过程中. 那个CaptureWindows被disable掉.则会导致整个消息路由全部被阻塞........
  

    这个Bug也是让我调试的比较久的一个Bug. 甚至还怀疑过Linux WindowManager的问题.  结论是. 某些存在依赖关系的操作. 一定注意过程是不是可以被重入,被打断....不要做很多天真的假设.

    另外,少要类成员函数的指针.  这个会让调试很痛苦.....



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1210342


原创粉丝点击