¿Cómo encontrar qué biblioteca compartida se carga mediante un proceso en OSX?

2

Estoy tratando de compilar y usar una biblioteca de C compartida como un módulo de python y observo que, dependiendo del DYLD_LIBRARY_PATH de mi código, funciona o falla con un mensaje de error críptico.

Jul 24 02:44:44 master 
$ DYLD_LIBRARY_PATH=/opt/local/lib  python -c 'import opengm' 
OKAY

Jul 24 02:45:41 master 
$ DYLD_LIBRARY_PATH= python -c 'import opengm' 
python(86214,0x7fff70ccdcc0) malloc: *** error for object 0x7fff70177500: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap

He intentado inspeccionar manualmente qué bibliotecas son comunes entre /usr/lib y /usr/local/lib y /opt/local/lib pero no he podido encontrar la causa del bloqueo. Una forma de descubrir la causa del problema será averiguar qué archivos dylib utilizan los dos procesos. No pude calcular esto usando opensnoop o dtruss , pero tal vez estaba usando mal esas herramientas.

¿Cómo puedo averiguar la causa de este accidente?

DESCARGO DE RESPONSABILIDAD: publiqué esta misma pregunta en SO hace 2 días, donde no se recibió Cualquier respuesta y solo 8 visitas.

    
pregunta Pushpendre 25.07.2016 - 21:41

2 respuestas

2

Puede configurar DYLD_PRINT_LIBRARIES=YES en el entorno para que dyld imprima cada biblioteca dinámica que carga en el proceso:

$ DYLD_PRINT_LIBRARIES=YES /usr/bin/true 
dyld: loaded: /usr/bin/true
dyld: loaded: /usr/lib/libSystem.B.dylib
[ ... snip ... ]
dyld: loaded: /usr/lib/libc++.1.dylib
dyld: loaded: /usr/lib/libDiagnosticMessagesClient.dylib
$
    
respondido por el bdash 26.07.2016 - 19:11
2

Un programa que puede mostrar qué archivos dylib se han utilizado para ejecutar un programa es otool .

otool -L /path/to/program
    
respondido por el Christopher 25.07.2016 - 21:51

Lea otras preguntas en las etiquetas