我一直在寻找Linux上的解决方案,以找出首先获得fd但现在没有运气的线程。
/proc/pid/task/
显示每个线程可用的fd,这是有意义的,因为描述符在整个进程空间中都可用。
lsof
对于这个用例来说当然没什么帮助。
该程序非常复杂,strace或gdb也没有帮助,使用了大量的闭源库。文件路径已知,但没有帮助,因为我无法访问库中的代码。我怀疑fd泄漏是由于某些竞争条件很少发生而且我需要跟踪打开文件的线程。
一个容易实现的解决方案是我在内核文件打开处理程序或c库中添加日志,但是出于好的理由我无法改变内核和内核也没有标准库。
一些建议?
答案 0 :(得分:3)
如果您有可用的内核符号,请使用SystemTap:
sudo stap -e 'probe syscall.open.return { \
printf("tid=%d, fd=%d\n", tid(), $return) }'