如何调试托管代码中的本机 OpenGL 崩溃?

How to debug a native OpenGL crash in managed code?

我目前正在使用 LWJGL 3 和 Kotlin 编写游戏渲染引擎。几分钟内一切正常,直到程序突然退出并显示以下消息:

Process finished with exit code -1073740940 (0xC0000374)

我所做的只是加载几个模型,然后在主循环中使用 glDrawElements(...) 渲染它们 - 没有加载或更改任何其他内容。

现在,我知道这个错误代码意味着堆损坏,但我什至没有得到 hs_err_pid 日志文件并且 Java 调试器只是随程序崩溃。那么我将如何去调试这样的崩溃呢?这可能是因为与 Kotlin 不兼容吗?

因此,对于可能发现自己处于类似情况的每个人:感谢 LWJGLX debug tool by Kai Burjack,我立即找到了导致程序崩溃的原因。

我做了以下事情:在着色器 class 中,当上传矩阵时,我分配了一个托管的 FloatBuffer,然后我不小心尝试手动释放它:

val buf = BufferUtils.createFloatBuffer(16)
matrix.get(buf)
glUniformMatrix4fv(location, false, buf)
MemoryUtil.memFree(buf)

MemoryUtil.memFree() 调用实际上并没有崩溃,但是随着矩阵每帧都在变化,这种方法会随着时间的推移破坏堆 - 因此几分钟后就会崩溃。

我附加了 LWJGLX 调试器,现在我的程序立即崩溃了 - 一条准确的错误消息告诉我我正在尝试释放一个我没有使用 memAlloc() 分配的内存区域 - 所以在将我的代码更改为

val buf = MemoryUtil.memAllocFloat(16)
...
MemoryUtil.memFree(buf)

现在一切正常。我只能推荐 LWGLX 调试器——它还发现了一些我现在必须修复的内存泄漏 ;-)