我在pyglet 1.1.4上运行我的游戏代码,并且看到了我看起来像内存泄漏的东西。也就是说,当代码执行时,RSS不断增加,直到最终我的笔记本电脑开始交换,最终代码退出并出现总线错误。
我用guppy进行了调查:我在启动时进行了一次堆转储,在第一次减速之后由于内存不足而进行了交换,然后一旦检测到这一点,我退出了pyglet并进行了最后一次堆转储。我注意到所有三个转储显示大约相同的堆大小(大约18 MB),即使htop显示代码使用千兆字节的内存。
根据我的阅读,这些堆转储仅显示python内存使用情况,这意味着内存的其余部分将被C代码占用。如果我的理解是正确的,这似乎表明pyglet正在生成的ctypes中的内存泄漏。我对底层代码的理解是模糊的,所以请随时纠正我可能正在使用的任何不正确的术语或我的理解/描述中的任何其他错误。
当我遇到总线错误时,这是Apple崩溃报告: https://gist.github.com/1612500
以下是包含内存问题的代码: https://github.com/greenmoss/NotOrion/tarball/bus_error
我创建了一个自动触发条件的实用程序。要运行它,请下载/解压缩上面的tarball,然后cd到“demo”目录,然后执行“./label_move.py”。如果允许此实用程序连续运行,则应复制上述行为。如果你有大量的空闲内存,可能需要一段时间才能在交换之前使用它。
所以要调试/修复它,听起来我需要深入研究底层的pyglet(甚至是C)代码。我在另一个gamedev question中向我指出我应该使用gdb。我真的不知道C或gdb,添加python + pyglet的复杂性让我感到压力。
那么,有人可以使用我上面的代码给我一个gdb调试会话的例子吗?