下面的代码可以正常工作并打印出一个空列表(在python3.4
上):
import gc
# code interfacing with C and cython
print(gc.garbage, flush=True)
将这一行追加到末尾会使它成为segfault:
^{pr2}$似乎纯粹是运气,自动收集不会自动发生(我花了一些时间才得到可复制的错误)。这个集合不是在“程序结束”时运行的,因为我是以交互方式运行的。在
一些谷歌搜索让我相信,一些C/Cython代码正在创建/销毁对象,而没有告诉python这些对象已经从内存中删除了。然后python试图删除它们并崩溃。在
我怎么才能找到那些东西?我以为他们会在坠机前出现?在
还是我的假设完全不正确?在
在这段代码前面加一个gc.set_debug(gc.DEBUG_STATS | gc.DEBUG_LEAK)
会导致python异常,而不是segfault。在
---> print(gc.garbage, flush=True)
gc.collect()
...
ReferenceError: weakly-referenced object no longer exists
编辑:根据其中一个答案的评论进行修改/简化
您可能误解了}。
gc.garbage
和{gc.disable()
关闭循环垃圾回收器,只保留引用计数内存管理处于活动状态。没有一个单独的“垃圾检测器”即使在垃圾收集器关闭时也能继续检测循环垃圾;垃圾检测是垃圾收集器的工作。在而且,
gc.garbage
只填充了GC无法清除的特定种类的奇怪垃圾。大多数垃圾永远不会在那里结束。在至于你如何调试这个,我对你使用的工具并不熟悉。像Valgrind这样的通用工具可能会有用,而像^{} 这样的GC标志可能会有所帮助。在
相关问题 更多 >
编程相关推荐