glDebugMessageCallback 导致段错误
glDebugMessageCallback causes segfault
我有点陷入困境。我无法调试我的 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, "%s\n", 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)
returns 4.5.0 NVIDIA 375.39
您使用的是哪种 GL 加载机制?您的代码确实创建了一个上下文并使其成为当前代码,但您从不加载任何 GL 函数指针。典型的 gl.h
header 将只包含 GL 1.1 之前的 GL 函数,而且这些也是您唯一可以依赖的由 OpenGL 库以 platform-independent 方式导出的函数。您的编译器(和链接器)没有抱怨 glDebugMessageCallback
的事实表明您使用了一些 GL 加载器,如 glew、glad 或其他。这些通常通过为每个初始化为 NULL
的 GL 函数声明一个函数指针来工作,并将在您调用一些初始化函数后加载。因为你在尝试设置调试回调之前没有做这样的事情,所以你只是在调用一个 NULL
指针。
我有点陷入困境。我无法调试我的 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, "%s\n", 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)
returns 4.5.0 NVIDIA 375.39
您使用的是哪种 GL 加载机制?您的代码确实创建了一个上下文并使其成为当前代码,但您从不加载任何 GL 函数指针。典型的 gl.h
header 将只包含 GL 1.1 之前的 GL 函数,而且这些也是您唯一可以依赖的由 OpenGL 库以 platform-independent 方式导出的函数。您的编译器(和链接器)没有抱怨 glDebugMessageCallback
的事实表明您使用了一些 GL 加载器,如 glew、glad 或其他。这些通常通过为每个初始化为 NULL
的 GL 函数声明一个函数指针来工作,并将在您调用一些初始化函数后加载。因为你在尝试设置调试回调之前没有做这样的事情,所以你只是在调用一个 NULL
指针。