1

我目前正在使用 Sandybridge 图形芯片的 2011 13" MacBook Pro 上编写 OpenGL 渲染器。

我发现在开发 OpenGL 代码时遇到了很多内核恐慌和重启。通常,每当我遇到错误时,我的系统只是重新启动,而不是让我有机会捕获错误并检索错误代码。

我知道它与图形驱动程序有关,因为在重新启动时显示的结果问题报告应用程序将其识别为崩溃的实体。

具体问题似乎与纹理创建密切相关。显然我的代码中有一些错误,但无论如何,这真的不应该在像 OpenGL 这样的高级 API 下重新启动操作系统。

OS X 是否具有我可能启用的任何调试模式功能,类似于 D3D 的功能,以便我可以更早地发现错误,而不必使用俄罗斯轮盘赌调试?

(我知道 OpenGL 分析器、驱动程序监视器等,但在使用这些工具来捕获这类问题方面收效甚微)

4

3 回答 3

1

正如您所提到的,OpenGL Profiler 是要使用的工具。您至少应该选中标记为“VAR 错误中断”和“线程错误中断”的框。如果您遇到问题,请告诉我,我可能会提供帮助。(我不是专家,但有一些运气。)

除此之外,您看到的崩溃可能与您提供指向 OpenGL 的指针有关,并且它试图从该指针读取或写入内存,但指针错误(或数据长度错误)。如果它与纹理相关,那么您可能正在尝试上传或下载纹理并传递了错误的宽度和高度,或者格式错误。我已经看到将不正确数量的元素传递给 glDrawElements() 时会发生这种情况。当它发生在我身上时,我对“元素”是顶点还是实际对象(如 QUAD 或 TRIANGLE)感到困惑。VAR 错误报告帮助我找到了这个问题。

于 2012-10-31T04:52:30.393 回答
1

只是为了让任何寻找的人回到这个......事实证明,这个问题完全与未能设置当前上下文有关,因为不同的线程开始发出 OpenGL 命令。

因此,每个线程都需要锁定一个互斥体,设置 open gl 上下文,然后开始其工作。然后它会释放上下文,然后释放锁,保证对一个 OpenGL 上下文的非同时访问。

因此,这里并没有真正未知的行为,只是一个没有完全执行指南的没有经验的新手。:-)

于 2012-12-19T14:42:32.353 回答
1

其他人则用潜在的解决方法做出了回应。但请注意,您的应用程序永远不会导致机器恐慌(现在只是重新启动机器并显示一个对话框以将报告提交给 Apple)。

至少,您应该将报告发送给 Apple。此外,您应该在http://bugreport.apple.com提交错误报告,包括恐慌日志、系统分析器报告以及您可以提供的有关如何重现的任何详细信息(理想情况下,示例应用程序二进制文件和/或源代码) )。提交您自己的错误报告将在许多方面有所帮助——确定您的错误的优先级(重复颠簸优先级),提供重现步骤以防问题和修复在恐慌报告中的回溯中不明显,并在您和 Apple 之间打开一个通道以防他们需要您提供更多信息来追踪它。

于 2013-04-22T02:02:44.613 回答