【问题标题】:Is it possible to set breakpoint at OpenGL functions?是否可以在 OpenGL 函数处设置断点?
【发布时间】:2019-12-19 09:22:29
【问题描述】:

有时我需要找出代码的哪一部分调用了某个OpenGL函数,所以我试试这个:

b glEnableVertexAttribArray
----------------------------
Breakpoint 3 at 0x7ffff0326c80 (2 locations)

但它不起作用,有什么办法可以使它起作用?

我在ubuntu18.04 中使用gdb,我的GPU 是GeForce GTX 1050 Ti

【问题讨论】:

  • 你的程序是否使用了像 GLAD 或 GLEW 这样的 OpenGL 加载器?
  • @Botje 我已经尝试过 GLAD c-debug 生成器,它运行良好。如何用 GLEW 做到这一点?

标签: debugging opengl gdb breakpoints


【解决方案1】:

如果您查看 GL/glew.h 标头,您会看到它包含类似于以下内容的行:

#define GLEW_GET_FUN(x) x
#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D)
#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements)
#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D)
#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D)

当您调用glewInit 时,这些__glew* 变量将填充有从您的OpenGL 实现中提取的指针。 在你的情况下,你应该在这样一个指针的内容上设置一个断点,所以*__glewEnableVertexAttribArray

对于 GLAD,您必须在 *glad_glEnableVertexAttribArray 上放置一个断点。请注意这两种情况下的*:它告诉您的调试器取消引用指针并将断点放在正确的位置。

【讨论】:

  • 同样的方法不适用于GLAD,gdb 不允许我在填充了 OpenGL 实现的函数上设置断点,我只能在 glad_debug_impl_* 上设置断点,这是真正的函数调用填充函数。用glew没试过,看起来很可疑,以后再试试。
  • GLAD 加载完所有指针后,你不能在*glad_glEnableVertexAttribArray 上设置断点吗? (注意 *)
猜你喜欢
  • 1970-01-01
  • 2012-08-31
  • 2021-08-15
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多