找出什么线程打开了fd

Find out what thread opened fd

我一直在 Linux 上寻找解决方案,以找出哪个线程首先获得了 fd,但目前还没有成功。

/proc/pid/task/ 

显示每个线程可用的 fd,这是有道理的,因为描述符在整个过程中都可用 space。

lsof

对于这个用例当然也没有太大帮助。

程序非常复杂,strace 或 gdb 也无济于事,使用了大量的闭源库。文件路径已知但无济于事,因为我无权访问库中的代码。我怀疑 fd 泄漏是由于某些极少发生的竞争条件造成的,我需要跟踪打开文件的线程。

一个易于实施的解决方案是在内核文件打开处理程序或 c 库中添加一个日志,但出于充分的理由我既不能改变内核也不能改变标准图书馆。

有什么建议吗?

如果您有可用的内核符号,请使用 SystemTap:

sudo stap -e 'probe syscall.open.return { \ printf("tid=%d, fd=%d\n", tid(), $return) }'