目前,我运行一个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 ?? ()