以下代码运行良好,并打印出一个空列表(在python3.4上):
import gc
# code interfacing with C and cython
print(gc.garbage, flush=True)将这一行追加到最后面使其为分段错误:
gc.collect()这似乎是纯粹的运气,自动收集不发生在它自己(它花了我一些时间来获得可复制的错误)。集合也不会运行在“程序的末尾”,因为我正在交互地运行这个集合。
一些googling让我相信一些C/Cython代码正在创建/销毁对象,而没有告诉python那些对象已经从内存中删除了。然后python尝试删除它们并崩溃。
我怎么才能找到那些东西呢?我以为他们会在坠机前在gc.garbage引发gc.collect()
还是我的假设完全不正确?
将gc.set_debug(gc.DEBUG_STATS | gc.DEBUG_LEAK)放在此代码的前面,将导致python异常,而不是分段错误。
---> print(gc.garbage, flush=True)
gc.collect()
...
ReferenceError: weakly-referenced object no longer exists编辑:在其中一个答案的注释后更改/简化
发布于 2015-10-24 03:55:14
你可能误解了gc.garbage和gc.disable()。gc.disable()关闭循环垃圾收集器,只保留引用计数内存管理活动。即使垃圾收集器被关闭,也没有单独的“垃圾检测器”一直在检测循环垃圾;垃圾检测是垃圾收集器的工作。
而且,gc.garbage中只填充了GC无法清除的特定类型的奇怪垃圾。大多数垃圾永远不会在那里结束。
至于您将如何进行调试,我不熟悉您将使用的工具。像瓦兰这样的通用工具可能会很有用,而像gc.DEBUG_LEAK这样的GC标志可能会有所帮助。
https://stackoverflow.com/questions/33314279
复制相似问题