如何跟踪和隔离文件处理程序泄漏



>我在运行程序时运行此错误(尽管从未打开/dev/null)

无法打开"/dev/null":打开的文件太多

我假设我在某个时候泄漏了文件处理程序。但是,由于我没有使用原始openclose而是with-open-filesb-ex:process-close我用sb-ext:run-prgram创建的任何过程,所以我感到困惑。由于我不知道我在哪里泄漏,因此发布任何代码都是没有意义的,因为复制粘贴太多了,随机样本也无济于事。

因此,如何跟踪文件处理程序并隔离泄漏?

这可能与你的Lisp程序是分开的,而是你的系统上的背景问题。因为你提到了/dev/null,听起来你使用的是某种 Unix,而像 lsof 这样的东西可能有助于追踪仍然打开的内容。错误消息不是特定于 SBCL 的,因此典型搜索只会帮助您找到一般答案,尽管某些调查技术可能相关。由于您尚未发布任何 SBCL 代码,因此很难提供任何特定于 SBCL 的响应。(但也许有特定于 SBCL 的分析工具。在允许关闭文件描述符的调用与 SBCL 实际关闭它们的调用之间也可能存在断开连接。

现在,即使听起来你正确地使用了Common Lisp API,也可能存在一些令人惊讶的边缘情况。 你确定你没有在任何地方保留对它们的引用来阻止它们被释放吗?某处的全局列表,或者在 REPL 中执行 *、** 和 *** 变量保存过去结果的操作,都可能有所贡献。

现在,另一种选择是,即使 Common Lisp 流已关闭,实现可能仍会打开文件描述符。 with-open-file 为你绑定一个流,这是围绕文件描述符的实现包装器。(不过,如果 SBCL 像那样泄漏,我会感到惊讶。例如,如果输出尚未刷新,则可能是文件描述符保留了一段时间。使用强制输出或清除输出可能有助于解决其中一些问题。

最新更新