Как обнаружить утечку файла и соответствующий код в Solaris? - PullRequest
2 голосов
/ 27 июля 2011

Как обнаружить утечку файла и соответствующий стек в Solaris?Я вижу, что Valgrind хорошо сообщил об этом в Linux.Пожалуйста, дайте мне знать, если у нас есть какие-либо инструменты на Solaris?

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

В 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.

2 голосов
/ 27 июля 2011

В Linux вы можете использовать strace для регистрации всех файлов открытия и закрытия вызовов.Затем вы можете проанализировать журнал утечки ресурсов - количество вызовов open должно совпадать с количеством вызовов close .Если это не так, то у вас есть утечка.На Солярисе есть аналогичный инструмент - DTrace .

...