2

我在 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)代码。在另一个游戏开发问题中向我指出我应该使用 gdb。我不太懂 C 或 gdb,加上 python + pyglet 的复杂性让我不知所措。

那么,有人可以给我一个使用我上面的代码的 gdb 调试会话的例子吗?

4

0 回答 0