2010-02-02 10 views
28

Ho bisogno di scoprire quali librerie un processo unix è stato caricato e potrebbe essere utilizzato per tutta la sua durata. È possibile, e come. O meglio ancora, ho un nome di libreria e ho bisogno di scoprire quali processi lo stanno usando, è possibile.Ottenere un elenco di librerie utilizzate con un processo in esecuzione (unix)

Sulla stessa nota, è possibile ricevere notifiche su come quando viene avviato un processo unix e quando viene chiuso. Non sarebbero processi figli del mio processo, ho solo bisogno di sapere a livello globale.

Aggiornamento:

penso non ho dato abbastanza informazioni. L'unix di cui stavo parlando era MacOS X (anche se alcuni dicono che non è veramente completamente unix), e stavo cercando un modo per trovare le librerie caricate di un processo e ho bisogno di farlo in C/C++.

risposta

5

è possibile utilizzare lsof. Vedi la pagina man per maggiori informazioni. Un altro strumento è strace. Per verificare se viene avviato un processo, è possibile utilizzare ps -ef con piping su grep o strumenti come pgrep. controlla il valore restituito per sapere se è uscito o meno.

11

se lsof non è installato, si può semplicemente cat/proc/$ pid/mappe

è anche possibile controllare il disco eseguibili con LDD per vedere cosa librerie si aprirà (ma che non mostra le biblioteche aperte usando dinamicamente dlopen()).

Come per il monitoraggio di nuovi processi, è possibile aggiungere un orologio inotify su/proc per monitorare la creazione/distruzione di nuove directory numeriche.

Aggiornamento: inotify su/proc non funziona, ma ci sono apparentemente alternative, vedi this thread

39

Solaris ha pldd. Per Linux è possibile chiamare ldd sull'eseguibile o pmap su un processo in esecuzione o cercare in /proc/PID/maps per le librerie mappate.

+1

'pldd' è stato aggiunto a Linux nel marzo 2012. [glibc 2.15 annuncio di rilascio] (http://savannah.gnu.org/forum/forum.php?forum_id=7163) – Mikel

+0

Buono a sapersi, grazie. –

+5

Per Mac OS X ['otool -L'] (http://developer.apple.com/library/mac/#documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html) è l'equivalente di' ldd' –

2

Sto provando (e non riuscendo) a fare anche questo. Guarda mach_vm_read e vm_region_recurse_64. Applicazioni closed-source come vmmap e Apple Crash Reporter fanno anche questo usando questi metodi, così come il GDB open-source. Potresti provare a cercare lì una risposta, ma la fonte è difficile da leggere.

8

Su Mac OS X è possibile utilizzare vmmap $pid per ottenere un elenco di regioni di memoria mappate per un processo. Questo mostra tutte le librerie caricate (almeno funziona per me qui su 10.7.5).

ps -A vi darà un elenco di tutti i processi, in modo da ps -A | grep $APPNAME ti porterà il processo di identificazione $ pid per l'uso con vmmap $pid. lsof -p $pid funziona anche.

La domanda sembra richiedere un metodo dinamico da C++. Puoi eseguire il polling con questi comandi e analizzare i risultati, anche se potresti perdere eventi di carico/scarico veloce.

lsof è un software open source con una licenza BSD. Il suo codice sorgente fornisce senza dubbio alcune indicazioni su come farlo da C/C++. Vedi: http://en.wikipedia.org/wiki/Lsof

0

Non ho la risposta specifica che stai cercando, ma ho qualcosa vicino, che ti avvicina di più a quello che vuoi.È possibile visualizzare la biblioteca collegata di una specifica binario (non di processo) da:

  1. installare Xcode https://developer.apple.com/xcode/
  2. eseguire: otool -L PATH_TO_BINARY

ESEMPIO:

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) 
3

On OS X, è sufficiente impostare DYLD_PRINT_LIBRARIES

export DYLD_PRINT_LIBRARIES=1 
./your_process 
Problemi correlati