2

我正在使用 VBO 扩展来存储顶点、法线和颜色缓冲区 (glBindBufferARB) 出于某种原因,在更改缓冲区或执行某些操作时,应用程序会因访问冲突而崩溃。附加调试器时,我看到崩溃发生在某个线程中,该线程不是我的主线程,该线程执行 opengl 调用,并在与 nvidia 图形驱动程序相关的某个 dll 中执行。

可能发生的事情是我给了一些缓冲区调用错误的缓冲区或大小错误。所以我的问题是,我该如何调试这种情况?崩溃似乎发生在实际调用之后的某个时间并且在不同的线程中。

4

3 回答 3

3

假设这是关于 Windows,NVIDIA 有一个GLExpert工具。它可以打印各种 OpenGL 警告/错误。

在其他一些情况下,使用打开错误检查的GLIntercept OpenGL 调用拦截器会很有用。

如果这些工具没有帮助,那么,这是很好的旧调试。尝试缩小问题范围并找出导致崩溃的确切原因。如果是 NVIDIA 特定问题,请尝试安装不同的驱动程序和/或在 NVIDIA 开发者论坛上提问。

于 2008-09-16T16:29:36.133 回答
0

我想你可能只需要暴力破解那个。即一次使用几行注释掉任何vbo,直到您的程序不再崩溃。然后,您将了解将注意力集中在哪些行上,并真正仔细检查您传递的参数。

还可以尝试在您的程序周围自由地使用 glError() 调用。通常,如果你传递了一个虚假参数,glError 会在它到达崩溃点之前告诉你有什么问题。

于 2008-09-15T19:35:41.217 回答
-1

最好的 OpenGl/D3D 调试工具之一是 nVidia 的 NvPerfHUD。它不会帮助您找到确切的问题,但它确实提供了您发送到渲染管道的内容的另一个视图。

但是,我会说我只将它用于 D3D 应用程序,所以我不知道它是否对 OpenGL 程序有同样的帮助。

编辑:

我不知道为什么这被否决了。我之前用 NvPerfHUD 调试过 VB 和 IB 问题。简单的事情,例如错误的原始计数,并通过查看每个单独的绘图调用来诊断。

于 2008-09-15T19:37:13.147 回答