В настоящее время я запускаю программу 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 (для чтения) и может узнать идентификатор потока, но я все еще не выяснил, какой код содержит FD.
мой вопрос: есть ли способ узнать стек, в котором хранится открытый FD? чтобы я мог узнать, что код приводит к проблеме
Вы можете присоединиться к процессу с помощью 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 ?? ()