В Solaris вы можете просмотреть открытые в настоящее время файловые дескрипторы процесса, просто используя команду pfiles
. Если вы хотите отслеживать открытие / закрытие файлов, на ум приходит truss
(эквивалент Solaris strace
) с фильтром для системных вызовов (truss -e open,close
, но есть другие, которые создают файловые дескрипторы).
Если вы обнаружите, что вывод pfiles
увеличивается, сначала определите, являются ли то, что вы пропускаете, обычными файлами или такими вещами, как сокеты / каналы. Если он пропускает обычные файлы, тогда можно использовать скрипт dtrace
; Ниже приведена основа для собственных экспериментов. В настоящее время у меня нет под рукой системы Solaris, чтобы попробовать и усовершенствовать ее. Смотри ниже.
#!/usr/bin/dtrace -s
syscall::open:entry { self->t = ustack(); }
syscall::open:return /arg0 >= 0/ { trackedfds[arg0] = self->t; }
syscall::open:return { self->t = 0; }
syscall::close:entry { self->t = arg0; }
syscall::close:return /arg0 >= 0/ { trackedfds[self->t] = 0; }
syscall::close:return { self->t = 0; }
END { printa(trackedfds); }
Создает ассоциативный массив, индексированный по номеру файлового дескриптора, содержимое которого является трассировкой стека на стороне пользователя во время системного вызова open()
. При успешном закрытии запись для данного номера файлового дескриптора отбрасывается, а когда программа выходит (или сценарий останавливается), печатается оставшееся содержимое указанного ассоциативного массива - если что-нибудь останется, это будет кандидатом на утечки.
Обратите внимание, что зонд END {}
может быть неправильным местом для этого; proc::exit
или что-то подобное может потребоваться. Это зависит от того, когда именно это срабатывает, до или после очистки, выполняемой при разборке программы (при выходе из программы / ее завершении программа закрывает все свои файловые дескрипторы, что приведет к удалению массива trackedfds[]
). Вот почему я сказал выше, что это отправная точка, я не могу проверить без системы Solaris.