continue....
二)今年最经典的bug。
准确的说。我还不知道这个是谁的bug。bug的发现是源于给别人做的一个外包程序。
这是一个OpenGL应用程序。初始化代码是我写于2001年。并且一直沿用到现在的代码。可以所是酒精考验了。我从来没有怀疑这样的代码会出现问题。症状如下:
该程序在以前的机器上没有什么问题,运行十分流畅而且也非常稳定。年初突然接到朋友报告说,程序在新的机器上出现了问题。速度很慢,约为10几秒才更新一次画面。我严重的不相信。但是事实总是事实。于是我开始检查OpenGL的驱动。显卡是Nvidia的GeForce 7300Go。驱动也是最新的。而我当时开发的时候显卡是5600。后来调试的时候也在6600上顺利运行。。。。。
把framebuffer和摄像头的数据保存下来后,发现数据竟然都是对的。更新都是实时的。debug viewer打印出来的信息也表示我的程序以fps30的速度正常运行。问题似乎陷入了绝境。我也进入了幻觉状态。无奈只好背着那台出问题的笔记本回家了(笔记本是很不错的笔记本哦~_~)。
一个礼拜,实在想不错问题。两个礼拜快过去了。还是没主意。突然有一天一个朋友要拷贝我的一个场景编辑器。于是我就把那个编辑器重新编译了一下。神奇的事情来了。几个月前在同样的一台机器上还好好的编辑器。竟然也出现了相同的问题!!!!!
该死的Driver. 于是我把driver还原到7x.xx版本。问题果然好了。。。。那么问题显然出在了OpenGL相关的代码上。。。
检查一下以前的OpenGL程序是这么写的。
HDC hDC = GetDC(m_hwnd);
ChoosePixelFormat(hDC ,pixel_format);
Release(hDC);
.......
HDC hDC = GetDC(m_hWnd);
SwapBuffer(hDC);
Release(hDC);
......
HDC hDC = GetDC(m_hWnd);
glMakeCurrent(hRC, hDC);
Release(hDC);
怀疑这里是不是hDC没有保存的问题。以前因为老师说hDC是很宝贵的资源。所以每次我用完了就还给Windows了。于是把hDC保存起来。问题解决!!!!!
反思:
即使是经历了几年。程序的bug也是会潜伏下来的。今天正常的程序,明天也许就不正常了!!!
本文讲述了作者在一个OpenGL应用程序中遇到的一个难以捉摸的Bug,并详细记录了排查过程。问题最终定位在了频繁释放设备上下文(hDC)的操作上,通过保留hDC解决了问题。
862

被折叠的 条评论
为什么被折叠?



