找出谁持有已被删除的文件的 fd?

找出谁持有已被删除的文件的 fd?

目前,我运行一个Java程序将调用一些C ++库,我发现在删除一些文件后,仍然有一些线程持有fd,例如

3515991655    0 lr-x------   1 user     group         64 Jul 29 10:52 /proc/81263/fd/658 -> /path/to/file.suffix\ (deleted)

我可以用来lsof查找哪个进程持有FD(用于读取目的)并能找出线程ID,但我仍然没有找到哪个代码持有FD。

我的问题是:有什么方法可以找出保存打开的 FD 的堆栈?这样我就能找出导致问题的代码

答案1

您可以附加到该进程并按gdb以下方式检查堆栈:

gdb /proc/81263/exe 81263
(gdb) bt
#0  0x00007f73808279a4 in __GI___nanosleep (requested_time=0x7ffef777b730, remaining=0x0)
    at ../sysdeps/unix/sysv/linux/nanosleep.c:28
#1  0x000055c7acccca44 in ?? ()
#2  0x000055c7acccc840 in ?? ()
#3  0x000055c7accc9aac in ?? ()
#4  0x00007f7380764b97 in __libc_start_main (main=0x55c7accc98d0, argc=2, argv=0x7ffef777b8f8, init=<optimized out>, 
    fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffef777b8e8) at ../csu/libc-start.c:310
#5  0x000055c7accc9b9a in ?? ()

相关内容