从调试器中打印所有可用元组

9 投票
2 回答
857 浏览
提问于 2025-04-16 12:43

我发现一个Python脚本有内存泄漏的问题。一开始占用了大约25MB的内存,经过15天后,这个占用量已经超过了500MB。

我尝试了很多不同的方法,但作为一个Python新手,我还是没能找到问题的根源...

最后,我得到了以下内容:

objgraph.show_most_common_types(limit=20)
tuple                      37674
function                   9156
dict                       3935
list                       1646
wrapper_descriptor         1468
weakref                    888
builtin_function_or_method 874
classobj                   684
method_descriptor          551
type                       533
instance                   483
Kind                       470
getset_descriptor          404
ImmNodeSet                 362
module                     342
IdentitySetMulti           333
PartRow                    331
member_descriptor          264
cell                       185
FontEntry                  170

我设置了一个断点,每次循环后,情况是这样的...

objgraph.show_growth()
tuple    37674       +10

接下来我该怎么做比较好呢?

(Pdb) c
(Pdb) objgraph.show_growth()
tuple    37684       +10

我想打印出所有的元组,然后对比一下——每次这个10个元组里添加了什么,可能会给我一些线索?请告诉我怎么做。

或者有没有其他方法可以找出这个内存泄漏的问题。我使用的是Python 2.4.3,由于有很多其他产品的依赖关系,遗憾的是我不能/不应该升级。

2 个回答

0

我首先想到的是,你可能在你的脚本中创建了新的对象,并把它们放在某种全局列表里。通常,检查一下你的脚本,确保没有生成任何持久的数据,比起调试那些垃圾数据要简单得多。我觉得你使用的工具 objgraph 也可以让你打印出那些垃圾对象,以及指向它们的引用数量。你可以试试这个方法。

2

我理解得对吗?同一个脚本已经连续运行了15天,没有停过?

对于这样长时间运行的程序,定期重启是个好习惯,这比解决所有内存泄漏问题要简单得多。

更新:看看这个回答,它似乎正好满足你的需求——打印出所有新添加的、还没有被垃圾回收的对象。

撰写回答