Подтвердить что ты не робот

Получение списка используемых библиотек с помощью запущенного процесса (unix)

Мне нужно узнать, какие библиотеки загрузил unix-процесс и может ли он использовать его всю жизнь. Возможно ли это и как. Или еще лучше, у меня есть имя библиотеки, и мне нужно выяснить, какие процессы используют его, возможно ли это.

В том же примечании можно ли получить уведомление о том, как при запуске процесса unix и при его завершении. Они не будут дочерними процессами моего процесса, мне просто нужно знать глобально.

Update:

Думаю, я не дал достаточно информации. Unix, о котором я говорил, был MacOS X (хотя некоторые говорят, что он не совсем полностью unix), и я искал способ найти загруженные библиотеки, которые есть у процесса, и мне нужно сделать это на C/С++.

4b9b3361

Ответ 1

Solaris имеет pldd. Для Linux вы можете вызвать ldd в исполняемом файле или pmap в запущенном процессе или просмотрите /proc/PID/maps для отображаемых библиотек.

Ответ 2

Если lsof не установлен, вы можете просто cat/proc/$pid/maps

вы также можете проверить исполняемые файлы на диске с помощью ldd, чтобы узнать, какие библиотеки они будут открывать (но это не показывает динамические библиотеки, открытые с помощью dlopen()).

Что касается мониторинга новых процессов, вы можете добавить inotify watch в /proc для мониторинга создания/уничтожения новых числовых каталогов.

Обновление: inotify on/proc не работает, но есть, по-видимому, альтернативы, см. this thread

Ответ 3

В Mac OS X вы можете использовать vmmap $pid, чтобы получить список отображаемых областей памяти для процесса. Это показывает все загруженные библиотеки (по крайней мере, это работает для меня здесь 10.7.5).

ps -A предоставит вам список всех процессов, поэтому ps -A | grep $APPNAME предоставит вам ваш идентификатор процесса $pid для использования с vmmap $pid. lsof -p $pid также работает.

Вопрос, похоже, требует динамического метода из С++. Вы можете опросить эти команды и проанализировать результаты, хотя вы можете пропустить быстрые события загрузки/выгрузки.

lsof - это программное обеспечение с открытым исходным кодом под лицензией BSD. Его исходный код, без сомнения, дает некоторое представление о том, как это сделать с C/С++. См.: http://en.wikipedia.org/wiki/Lsof

Ответ 4

вы можете использовать lsof. См. Справочную страницу для получения дополнительной информации. Другим инструментом является strace. Чтобы узнать, запущен ли процесс, вы можете использовать ps -ef с номером grep или с инструментами вроде pgrep. проверьте, чтобы возвращаемое значение знало, если оно завершено или нет.

Ответ 5

Я пытаюсь (и не могу) сделать это. Посмотрите на mach_vm_read и vm_region_recurse_64. Приложения с закрытым исходным кодом, такие как vmmap и Apple Crash Reporter, также используют эти методы, а также GDB с открытым исходным кодом. Вы можете попробовать найти ответ, но источник сложно прочитать.

Ответ 6

В OS X просто нужно установить DYLD_PRINT_LIBRARIES

export DYLD_PRINT_LIBRARIES=1
./your_process

Ответ 7

У меня нет конкретного ответа, который вы ищете, но у меня есть что-то близкое, что, возможно, приблизит вас к тому, что вы хотите. Вы можете отобразить связанную библиотеку определенного двоичного файла (а не процесса) с помощью:

Пример:

chris$ otool -L /usr/local/bin/mtr
mtr:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    /usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 46.1.0)