当前位置: 首页 > 知识库问答 >
问题:

glDebugMessageCallback导致segfault

柴辰阳
2023-03-14

我有点进退两难。我无法调试我的C OpenGL程序,因为激活调试消息会导致segfault。

我注册了一个调试回调函数:

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_版本)返回4.5.0 NVIDIA 375.39


共有1个答案

蓟雪峰
2023-03-14

您使用的是哪种GL加载机制?您的代码确实创建了一个上下文并使其成为最新的,但您从不加载任何GL函数指针。典型的gl. h标头将仅包含GL 1.1之前的GL函数,并且这些也是您可以依赖OpenGL库以独立于平台的方式导出的唯一函数。您的编译器(和链接器)不会抱怨glDebugMessageCallback这一事实表明您使用了一些GL加载器,例如glew、很高兴或其他任何东西。这些通常通过为每个GL函数声明一个函数指针来工作,这些函数被初始化为NULL,并将在您调用某个初始化函数后加载。由于您在尝试设置调试回调之前没有这样做,因此您只是调用了NULL指针。

 类似资料:
  • 问题内容: 我注意到执行和启动任务有时会抛出EXC_BAD_ACCESS。给出错误的实际调用方法似乎有所不同,但始终来自。在大多数情况下,调用方法来自。我在下面附加了两个崩溃日志,其中包含不同的调用方。我还附加了的实现。 不幸的是,我无法可靠地重现该错误,因此没有共享的示例脚本。创建和启动对象最终将产生错误。较大的文件似乎更经常发生。我在这里实施错了吗?有没有一种好的方法可以从此堆栈跟踪进行调试?

  • 问题内容: Javascript上找到的脚本是:如何获取在中断标签之后/之前的文本节点,并用ddb标签包装它们? 在通过WebDriver加载的每个页面上运行时, 测试运行3分钟后出现以下错误: 基本上,其目的是捕获xpath语法无法选择的文本节点。Javascript在带有break的break标签之前和之后包装文本节点。然后,WebDriver可以使用xpath语法获取文本。 事情似乎运行顺利

  • 问题内容: 我正在尝试使用Google Firebase实时数据库。我的用户可以创建要在数据库中作为独立表以及在用户类中作为列表进行的事件。这是我用来将事件写入数据库以及发生异常的位置: 问题是,当我尝试保存创建的事件时,我开始收到消息,表明垃圾回收运行了几次,然后在该异常结束时打印了100次相同的异常,然后应用程序重新启动。 同样在顶部异常的末尾,我又得到了一个 在我的Event类中,我尝试存储

  • 问题内容: 调用反射值的.FieldByName方法时出现以下错误,确切的错误是:- 和代码是:- 我了解的并不多,但这就是我所能获得的所有信息。 这是Go Playground上代码的链接:http : //play.golang.org/p/E038cPOoGp 问题答案: 您已经是一个指向结构的指针。尝试打印出您的代码。 没有理由使用的地址,然后调用that ,它会取消对刚创建的指针的引用。

  • 我有两个类与多对多关系相连: book.java category.java 添加@column注释后,的问题得到了解决。但是,映射集合的问题就出现了。下面是我收到的堆栈轨迹: 编辑2 当我将@jointable中的从id更改为book_id时,我收到了如下所示的DataIntegrityViolationException:

  • 当我尝试使用@autowired时,它给了我例外 当我在没有@autowired注释的情况下尝试它时,这段代码很好,但当我添加@autowired时,它给了我 像这样的很少,我认为spring-dispatcher-servlet.xml中有问题,我搜索了很多,仍然没有找到问题。我有任何jar文件需要添加到项目中....??