Contents

问题诊断系列「2」文件描述符用尽等

在这个大模型横行的时代,有时候会怀疑写博客的意义。毕竟,任何技术问题都可以直接问 ChatGPT、Claude 或者其他 AI 助手,它们能给出更全面、更即时的答案。相比之下,写博客似乎成了一种低效的知识传递方式。

但转念一想,或许写博客本来就不应该承载太多"意义"。它更像是一种个人记录,是闲暇时对工作、学习中的一些思考的沉淀。不是为了教育他人,也不是为了证明什么,只是单纯地记录下那些曾经困扰过自己、最终被解决的问题。也许未来的某一天,当自己再次遇到类似问题时,这些记录能帮助快速回忆起当时的解决思路。

所以,就当作闲暇时的记录吧。(上边这段话都是cursor帮我写的)

FD用尽的问题在Linux非常好debug,下面记录下问题解决过程。

在项目中重复压测某个动作多次后程序崩溃,gdb看了下堆栈是popen执行命令失败导致的崩溃。没有打印对应的失败原因,gpt了下popen最有可能失败的情况是FD用尽。

再gpt了下,Linux可以通过如下命令实时统计进程打开的FD数量。

shell

ls /proc/<pid>/fd | wc -l

在目录/proc/<pid>/fd下每个文件都对应进程打开的一个文件描述符,文件名即是fd的值,同时是个软链指向打开的文件路径。

重试操作发现FD确实在一直增长,通过查看目录下的文件软链到的路径(即打开的文件路径),发现v4l2的dmabuf fd随着重复操作一直在增加,定位到问题就很好解决。找到对应的代码,确实FD有泄漏。