仅在发布模式下使用 glGenBuffer 的未处理异常 - QT
Posted
技术标签:
【中文标题】仅在发布模式下使用 glGenBuffer 的未处理异常 - QT【英文标题】:Unhandled Exception using glGenBuffer on Release mode only - QT 【发布时间】:2012-04-19 15:02:30 【问题描述】:我在 Windows 7 上使用 Qt 4.8 在发布模式下编译我的项目时遇到了一些麻烦。调试时一切正常,但在发布时我得到一个未处理的异常:0xC0000005:访问冲突。
我将范围缩小到发生这种情况的那一行,也就是我生成像素缓冲区的时候。 我的第一个猜测是加载了错误的 DLL,但我使用 Dependency Walker 检查了可执行文件,并且加载的每个 DLL 都是正确的。
这是我的一些代码:
class CameraView : public QGLWidget, protected QGLFunctions;
void CameraView::initializeGL()
initializeGLFunctions(this->context());
glGenBuffers(1, &pbo_); //<<<<< This is where I get the unhandled exception on Release mode
glBindBuffer(QGLBuffer::PixelUnpackBuffer, pbo_);
glBufferData(QGLBuffer::PixelUnpackBuffer, 3 * sizeof(BYTE) * image_width_ * image_height_, NULL, GL_STREAM_DRAW);
...
同样,这在调试时效果很好。为什么这只会在发布时发生?
【问题讨论】:
我会使用某种内存检查器来运行您的应用程序。 要么 pbo_ 是不应该的,要么你没有正确初始化扩展(glGenBuffers 指针为空)。 我相信我正在正确初始化扩展,因为它在调试模式下工作。 initializeGLFunctions() 是我认为的 glewInit 等价物。不过不确定... pbo_ 是我在类构造函数上初始化的 GLuint 成员。 【参考方案1】:我明白了。 似乎这个问题与这个有关: https://forum.qt.io/topic/12492/qt-4-8-qglfunctions-functions-crash-in-release-build
还有一个可能相关的错误报告: https://bugreports.qt.io/browse/QTBUG-5729
也许 initializeGLFunctions() 方法没有获取 GL 扩展函数的所有函数指针,我真的不知道为什么,但似乎就是这样。
我的解决方案是停止使用 Qt 的 GL 扩展并开始使用 glew。
所以,这对我有用:
#include <QtGui/QtGui>
#include <gl/glew.h>
#include <QtOpenGL/QGLWidget>
class CameraView : public QGLWidget;
void CameraView::initializeGL()
//initializeGLFunctions(this->context());
GLenum init = glewInit();
// Create buffers
glGenBuffers(1, &pbo_);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo_);
glBufferData(GL_PIXEL_UNPACK_BUFFER, 3 * sizeof(BYTE) * image_width_ * image_height_, NULL, GL_STREAM_DRAW);
// Set matrixes
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glOrtho(0, this->width(), 0, this->height(), 0, 1);
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
确保 glew.h 包含在任何 QTOpenGL 头文件之前,否则会出现编译错误。
【讨论】:
以上是关于仅在发布模式下使用 glGenBuffer 的未处理异常 - QT的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 消息传递仅在调试模式下工作,而不是在发布模式下工作 (iOS)