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

Kotlin 如何在托管代码中调试本机OpenGL崩溃?,kotlin,lwjgl,Kotlin,Lwjgl,我目前正在使用LWJGL3和Kotlin编写一个游戏渲染引擎。在几分钟内一切正常,直到程序突然退出,并显示以下消息: Process finished with exit code -1073740940 (0xC0000374) 我所要做的就是加载一些模型,然后在主循环中使用glpaurements(…)渲染它们-没有加载或更改任何其他内容 现在,我知道这个错误代码意味着堆损坏,但我甚至没有得到hs_err_pid日志文件,Java调试器只是与程序一起崩溃。那么,我该如何调试这样的崩溃呢?这

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

Process finished with exit code -1073740940 (0xC0000374)
我所要做的就是加载一些模型,然后在主循环中使用
glpaurements(…)
渲染它们-没有加载或更改任何其他内容


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

因此,对于每个可能发现自己处于类似情况的人来说:多亏了,我立即找到了导致程序崩溃的原因

我所做的是:在着色器类中,当上载矩阵时,我分配了一个托管FloatBuffer,然后我意外地尝试手动释放它:

val buf=BufferUtils.createFloatBuffer(16)
矩阵。获取(buf)
glUniformMatrix4fv(位置,假,buf)
MemoryUtil.memFree(buf)
MemoryUtil.memFree()
调用实际上不会崩溃,但随着矩阵每帧的变化,此方法会随着时间的推移损坏堆,因此几分钟后就会崩溃

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

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

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

还可以看到@KaiBurjack,非常感谢,我立即用这个工具发现了我的堆损坏bug:我很高兴这有帮助。也许你可以写一个答案来详细说明你的问题。这也会帮助我(该工具的作者)改进它。@KaiBurjack当然。我已经写了一个关于这个工具和我的问题的答案:)顺便说一句,请阅读:对于这种短期缓冲区,有一个更好的选择:
MemoryStack
:)@KaiBurjack-Ohh谢谢,这真的很酷。我今天学到了很多:)