glDebugMessageCallback 会导致段错误
glDebugMessageCallback causes segfault
我在这里有点像第22条军规。我无法调试我的 C++ OpenGL 程序,因为激活调试消息会导致段错误。
我注册了一个调试回调函数:
static void APIENTRY openglCallbackFunction(
GLenum source,
GLenum type,
GLuint id,
GLenum severity,
GLsizei length,
const GLchar* message,
const void* userParam) {
(void)source; (void)type; (void)id;
(void)severity; (void)length; (void)userParam;
fprintf(stderr, "%sn", message);
if (severity==GL_DEBUG_SEVERITY_HIGH) {
fprintf(stderr, "Aborting...n");
abort();
}
}
我在以下代码中启动调试上下文:
this->window = glfwCreateWindow(this->winx, this->winy, "Cortex Stretcher", NULL, NULL);
if(this->window == NULL) {
fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.n" );
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(this->window);
GLint flags; glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
if (flags & GL_CONTEXT_FLAG_DEBUG_BIT)
{
cout << "Debug output enabled!" << endl;
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDebugMessageCallback(openglCallbackFunction, nullptr);
// glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
}
如果我只是注释掉glDebugMessageCallback(openglCallbackFunction, nullptr);
那么我的代码运行没有任何错误(除了我的模型渲染不正确,这就是我尝试调试的原因(。
但是如果我尝试注册回调,那么我的代码就会出现段错误(在注册时(。知道为什么吗?这实质上只是复制粘贴的代码。
注意:glGetString(GL_VERSION)
返回 4.5.0 NVIDIA 375.39
您使用哪种 GL 加载机制?您的代码确实会创建一个上下文并使其处于当前状态,但您从不加载任何 GL 函数指针。典型的gl.h
标头将仅包含 GL 1.1 之前的 GL 函数,而这些函数也是 OpenGL 库以独立于平台的方式导出的唯一函数。事实上,你的编译器(和链接器(不抱怨glDebugMessageCallback
表明你使用了一些GL加载器,如glew,glad或其他什么。这些通常通过为每个 GL 函数声明一个函数指针来工作,这些函数指针被初始化为NULL
,并将在您调用某个初始化函数后加载。由于您在尝试设置调试回调之前没有执行此类操作,因此您只是调用NULL
指针。
相关文章:
- 为什么PyImport_ImportModule python 3.7.2 中出现段错误?
- 为什么在访问 vtkRenderWindow 的"交互器"变量时会发生段错误?
- 全局向量导致 C++ 程序结束时出现段错误
- 为什么重载运算符<<打印特征类成员会导致段错误?
- 更改条件段错误
- 使用 TTF_RenderText() 加载字体时获取段错误 TTF_OpenFontRW()
- 注册对对象工厂的调用会导致段错误
- pthread_create在构造函数段错误中
- Nanoflann发现邻居提出段错误
- C++ 中的构造函数、继承、堆栈、堆、this-pointer 和段错误
- 具有unique_ptr的 CRTP 会导致段错误
- 增强纤维work_stealing屏障会导致段错误
- 当我返回指向结构的指针向量时出现段错误
- C++为什么我的代码没有爆炸/段错误?
- Pthread段错误,使用指向main中变量的指针
- C++ 模板中的段错误
- 相当于Windows/MSVC上的段错误?
- 为什么我的 LLVM JIT 实现出现段错误?
- 为什么访问我的引用捕获变量会导致我的 lambda 函数出现段错误?
- 为什么自删除的全局 Vulkan 实例仅在添加层时才导致段错误?