Получение списка используемых библиотек запущенным процессом (unix) - PullRequest
30 голосов
/ 02 февраля 2010

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

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

Обновление:

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

Ответы [ 7 ]

41 голосов
/ 02 февраля 2010

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

11 голосов
/ 02 февраля 2010

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

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

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

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

8 голосов
/ 08 марта 2016

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

export DYLD_PRINT_LIBRARIES=1
./your_process
8 голосов
/ 01 апреля 2013

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

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

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

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

5 голосов
/ 02 февраля 2010

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

2 голосов
/ 10 августа 2011

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

1 голос
/ 26 апреля 2013

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...