找出什么线程打开了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) }'
我一直在 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) }'