python代码中的垃圾回收segfault while`垃圾`是空的

2024-06-01 12:15:13 发布

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

下面的代码可以正常工作并打印出一个空列表(在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

编辑:根据其中一个答案的评论进行修改/简化


Tags: and对象代码debugimporttrue列表with
1条回答
网友
1楼 · 发布于 2024-06-01 12:15:13

您可能误解了gc.garbage和{}。gc.disable()关闭循环垃圾回收器,只保留引用计数内存管理处于活动状态。没有一个单独的“垃圾检测器”即使在垃圾收集器关闭时也能继续检测循环垃圾;垃圾检测是垃圾收集器的工作。在

而且,gc.garbage只填充了GC无法清除的特定种类的奇怪垃圾。大多数垃圾永远不会在那里结束。在

至于你如何调试这个,我对你使用的工具并不熟悉。像Valgrind这样的通用工具可能会有用,而像^{}这样的GC标志可能会有所帮助。在

相关问题 更多 >