如何调试python/pyglet内存泄漏?

2024-05-16 19:53:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我在pyglet 1.1.4上运行我的游戏代码,发现了内存泄漏。也就是说,当代码执行时,RSS不断增加,直到我的笔记本电脑开始交换,最终代码以总线错误退出。在

我和guppy一起调查过:我在启动时做了一次堆转储,一次是由于内存不足和命中swap而导致的第一次减速之后,一旦检测到这一点,我就退出pyglet并进行最后一次堆转储。我注意到这三个转储显示的堆大小大致相同(大约18MB),尽管htop显示代码使用的是千兆字节的内存。在

根据我所读到的,这些堆转储只显示python内存使用情况,这意味着剩余的内存将被C代码占用。如果我的理解是正确的,这似乎表明pyglet正在生成的cype中存在内存泄漏。我对底层代码的理解是模糊的,所以请随时更正我可能使用的任何不正确的术语或我理解/描述中的任何其他错误。在

这是我遇到总线错误时的苹果崩溃报告: https://gist.github.com/1612500

以下是包含内存问题的代码: https://github.com/greenmoss/NotOrion/tarball/bus_error

我创建了一个工具来自动触发这个条件。要运行它,请下载/untar上面的tarball,然后cd到“demo”目录,然后执行“./label”_移动.py". 如果允许此实用程序持续运行,它应该复制上面描述的行为。如果您有大量的空闲内存,可能需要一段时间才能全部使用完,然后才能进行交换。在

所以要调试/修复这个问题,听起来我需要深入研究底层的pyglet(甚至C)代码。在另一个gamedevquestion中有人向我指出,我应该使用gdb。我不太懂C或gdb,加上python+pyglet的复杂性让我不知所措。在

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


Tags: 内存代码httpsgithubcom游戏错误笔记本电脑