web-dev-qa-db-fra.com

Obtenir une liste des bibliothèques utilisées par un processus en cours d'exécution (unix)

J'ai besoin de savoir quelles bibliothèques un processus Unix a chargé et peut utiliser tout au long de sa vie. Est-ce possible et comment. Ou mieux encore, j'ai un nom de bibliothèque et j'ai besoin de savoir quels processus l'utilisent, est-ce possible?.

Dans le même ordre d'idées, est-il possible de se faire notifier comment un processus unix est lancé et quand il est arrêté. Ils ne seraient pas des processus enfants de mon processus, j'ai juste besoin de savoir globalement.

Mettre à jour:

Je pense que je n'ai pas donné assez d'informations. L'Unix dont je parlais était MacOS X (même si certains disent que ce n'est pas vraiment complètement Unix), et je cherchais un moyen de trouver les bibliothèques chargées d'un processus et j'ai besoin de le faire en C/C++.

29
Alexander Cohen

Solaris a pldd . Pour Linux, vous pouvez appeler ldd sur l'exécutable ou pmap sur un processus en cours d'exécution ou rechercher dans /proc/PID/maps les bibliothèques mappées.

40
Nikolai Fetissov

si lsof n'est pas installé, vous pouvez simplement cat/proc/$ pid/maps 

vous pouvez également vérifier les exécutables de disque avec ldd pour voir quelles bibliothèques elles vont ouvrir (mais cela ne montre pas les bibliothèques ouvertes de manière dynamique en utilisant dlopen ()).

En ce qui concerne la surveillance de nouveaux processus, vous pouvez éventuellement ajouter une surveillance inotify sur/proc pour surveiller la création/destruction de nouveaux répertoires uniquement numériques.

Mise à jour: inotify sur/proc ne fonctionne pas, mais il y a apparemment des alternatives, voir ce fil

11
ggiroux

Sur Mac OS X, vous pouvez utiliser vmmap $pid pour obtenir une liste des régions de mémoire mappées pour un processus. Cela montre toutes les bibliothèques chargées (au moins ça marche pour moi ici 10.7.5).

ps -A vous donnera une liste de tous les processus, donc ps -A | grep $APPNAME vous donnera votre identifiant de processus $ pid à utiliser avec vmmap $pid. lsof -p $pid fonctionne également.

La question semble demander une méthode dynamique à partir de C++. Vous pouvez interroger avec ces commandes et analyser les résultats, même si vous pouvez rater des événements de chargement/déchargement rapide.

lsof est un logiciel open source sous licence BSD. Son code source fournit sans aucun doute des informations sur la manière de procéder à partir de C/C++. Voir: http://fr.wikipedia.org/wiki/Lsof

8
Ross Bencina

Sous OS X, il suffit de définir DYLD_PRINT_LIBRARIES

export DYLD_PRINT_LIBRARIES=1
./your_process
7
Cong Ma

vous pouvez utiliser lsof. Voir la page de manuel pour plus d'informations. Un autre outil est strace. Pour voir si un processus est lancé, vous pouvez utiliser ps -ef canalisé vers grep, ou des outils comme pgrep. vérifiez la valeur de retour pour savoir si elle est arrêtée ou non.

5
ghostdog74

J'essaie (et j'échoue) de faire cela aussi. Regardez mach_vm_read et vm_region_recurse_64. Les applications à source fermée telles que vmmap et Crash Reporter d’Apple utilisent également ces méthodes, ainsi que la GDB en source ouverte. Vous pouvez essayer de chercher une réponse, mais la source est difficile à lire.

2
alaska.alex

Je n'ai pas la réponse précise que vous cherchez, mais j'ai quelque chose de proche, qui vous mènera peut-être à ce que vous voulez. Vous pouvez afficher la bibliothèque liée d’un binaire spécifique (pas traiter) en:

  1. installer xcode https://developer.Apple.com/xcode/
  2. execute: otool -L PATH_TO_BINARY

EXEMPLE:

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)