2010-02-02 4 views
28

Necesito averiguar qué bibliotecas ha cargado un archivo Unix y podría usar a lo largo de su vida. ¿Es esto posible y cómo? O mejor aún, tengo un nombre de biblioteca y necesito saber qué procesos lo están usando, si es posible.Obteniendo una lista de bibliotecas usadas por un proceso en ejecución (Unix)

En la misma nota, ¿es posible recibir notificaciones sobre cómo se inicia un proceso de Unix y cuándo se cierra? No serían procesos secundarios de mi proceso, solo necesito saber globalmente.

Actualización:

Creo que no me dan suficiente información. El Unix del que estaba hablando era MacOS X (aunque algunos dicen que no es realmente unix por completo), y estaba buscando una forma de encontrar las bibliotecas cargadas que tiene un proceso y necesito hacerlo en C/C++.

Respuesta

5

puede usar lsof. Vea la página de manual para más información. Otra herramienta es strace. Para ver si se inicia un proceso, puede usar ps -ef canalizado a grep, o herramientas como pgrep también. verifique el valor de retorno para saber si se cierra o no.

11

si lsof no está instalado, puede simplemente cat/proc/PID $/Mapas

también se puede comprobar en los ejecutables de disco con ldd para ver qué bibliotecas abrirán (pero eso no quiere mostrar las bibliotecas abiertas dinámicamente usando dlopen()).

En cuanto a la supervisión de nuevos procesos, puede agregar un reloj inotify en/proc para supervisar la creación/destrucción de nuevos directorios numéricos.

Actualización: Inotify en/proc no funciona, pero aparentemente hay alternativas, consulte this thread

39

Solaris tiene pldd. Para Linux, puede llamar al ldd en el ejecutable o al pmap en un proceso en ejecución o consultar /proc/PID/maps para las bibliotecas mapeadas.

+1

'pldd' se agregó a Linux en marzo de 2012. [anuncio de lanzamiento de glibc 2.15] (http://savannah.gnu.org/forum/forum.php?forum_id=7163) – Mikel

+0

Es bueno saberlo, gracias. –

+5

Para Mac OS X ['otool -L'] (http://developer.apple.com/library/mac/#documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html) es el equivalente de' ldd' –

2

Estoy intentando (y fracasando) hacer esto también. Mire mach_vm_read y vm_region_recurse_64. Las aplicaciones de código cerrado como vmmap y Apple's Crash Reporter también utilizan estos métodos, así como GDB de fuente abierta. Puede intentar buscar una respuesta, pero la fuente es difícil de leer.

8

En Mac OS X puede usar vmmap $pid para obtener una lista de regiones de memoria asignadas para un proceso. Esto muestra todas las bibliotecas cargadas (al menos funciona para mí aquí en 10.7.5).

ps -A le dará una lista de todos los procesos, por lo que ps -A | grep $APPNAME obtendrá su proceso id $ pid para usar con vmmap $pid. lsof -p $pid también funciona.

La pregunta parece estar pidiendo un método dinámico de C++. Puede sondear estos comandos y analizar los resultados, aunque puede perder eventos rápidos de carga/descarga.

lsof es un software de fuente abierta bajo una licencia BSD. Sin duda, su código fuente proporciona una idea de cómo hacer esto desde C/C++. Ver: http://en.wikipedia.org/wiki/Lsof

0

No tengo la respuesta específica que usted está buscando, pero tengo algo cercano, que quizás lo acerque a lo que desea.Se puede visualizar la biblioteca enlazada de un binario (no en el proceso) específica por:

  1. instalar Xcode https://developer.apple.com/xcode/
  2. ejecutar: otool -L PATH_TO_BINARY

Ejemplo:

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

En OS X, solo necesita establecer DYLD_PRINT_LIBRARIES

export DYLD_PRINT_LIBRARIES=1 
./your_process 
Cuestiones relacionadas