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