Как проверить, какие разделяемые библиотеки загружаются во время выполнения для данного процесса? - PullRequest
45 голосов
/ 24 февраля 2011

Есть ли способ проверить, какие библиотеки используют запущенный процесс?

Точнее говоря, если программа загружает некоторые общие библиотеки, используя dlopen , то readelf или ldd несобираюсь показать это.Можно ли вообще получить эту информацию из запущенного процесса?Если да, то как?

Ответы [ 7 ]

73 голосов
/ 24 февраля 2011

Другие люди на правильном пути. Вот несколько способов.

cat /proc/NNNN/maps | awk '{print $6}' | grep '\.so' | sort | uniq

Или с помощью strace:

strace CMD.... 2>&1 | grep '^open(".*\.so"'

Обе они предполагают, что разделяемые библиотеки имеют где-то ".so", но вы можете изменить это. Первый дает довольно симпатичный вывод в виде списка библиотек, по одной на строку. Второй будет продолжать перечислять библиотеки по мере их открытия, так что это хорошо.

Редактировать: И, конечно, lsof ...

lsof -p NNNN | awk '{print $9}' | grep '\.so'
13 голосов
/ 24 февраля 2011

Может быть lsof - швейцарский армейский нож linux поможет?

edit: to run, lsof -p <pid>, перечисляет все виды полезной информации, например, если процесс является Java, спискивсе открытые банки - очень круто ...

10 голосов
/ 17 декабря 2014

На самом деле вы можете сделать это в своем коде следующим образом:

#include <link.h>

using UnknownStruct = struct unknown_struct {
   void*  pointers[3];
   struct unknown_struct* ptr;
};
using LinkMap = struct link_map;

auto* handle = dlopen(NULL, RTLD_NOW);
auto* p = reinterpret_cast<UnknownStruct*>(handle)->ptr;
auto* map = reinterpret_cast<LinkMap*>(p->ptr);

while (map) {
  std::cout << map->l_name << std::endl;
  // do something with |map| like with handle, returned by |dlopen()|.
  map = map->l_next;
}

Структура link_map содержит как минимум базовый адрес и абсолютное имя файла.Это структура, которая на самом деле возвращается dlopen() с ненулевым первым аргументом.Подробнее см. здесь .

6 голосов
/ 24 февраля 2011

В Linux /proc/<processid>/maps содержит список всех файлов, отображаемых в памяти, который, как я считаю, должен включать любые файлы, загруженные dlopen().

6 голосов
/ 24 февраля 2011

ltrace кажется твоим другом.

С ltrace руководство:

ltrace - это программа, которая просто запускает указанную команду до выходы. Он перехватывает и записывает динамические вызовы библиотеки которые вызывается выполненным процессом и сигналами, которые получил этот процесс. Он также может перехватывать и распечатывать системные вызовы EXE- отредактировано программой.

       Its use is very similar to strace(1).
3 голосов
/ 24 февраля 2011

На солярисе есть также команда pldd.

1 голос
/ 24 февраля 2011

Будет ли strace отслеживать открываемый файл библиотеки?

...