tutorial que online linux path gdb core

que - ¿Cómo anexar un directorio a la ruta de la biblioteca al cargar un archivo core en gdb en Linux?



gdb tutorial (5)

Encontré este extracto en developer.apple.com

set solib-search-path path

Si se establece esta variable, la ruta es una lista de directorios separados por dos puntos para buscar bibliotecas compartidas. solib-search-path'' is used after solib-absolute-prefix'' falla al ubicar la biblioteca, o si la ruta a la biblioteca es relativa en lugar de absoluta. Si desea utilizar solib-search-path'' instead of solib-absolute-prefix'', asegúrese de establecer `solib-absolute-prefix ''en un directorio nonexistant para evitar que GDB encuentre las bibliotecas de su host.

EDITAR:

No creo que el uso de la configuración anterior prepeda los directorios que agregué, pero parece agregarlos, por lo que los archivos que faltan de mi sistema actual se recogen en las rutas que agregué. Supongo que establecer el prefijo solib-absolute-a algo falso y agregar directorios en la ruta solib-search-path en el orden que necesito podría ser una solución completa.

Tengo un archivo central generado en un sistema remoto al que no tengo acceso directo. También tengo copias locales de los archivos de la biblioteca del sistema remoto y el archivo ejecutable del programa bloqueado.

Me gustaría analizar este volcado de núcleo en gdb.

Por ejemplo:

gdb path/to/executable path/to/corefile

Mis bibliotecas están en el directorio actual.

En el pasado, he visto depuradores implementar esto mediante el suministro de la opción "-p". o "-p / =."; entonces mi pregunta es:

¿Cómo puedo especificar que las bibliotecas se carguen primero desde las rutas relativas a mi directorio actual al analizar un archivo core en gdb?


Inicie gdb sin especificar el archivo ejecutable o core, luego escriba los siguientes comandos:

set solib-absolute-prefix ./usr file path/to/executable core-file path/to/corefile

Tendrá que asegurarse de reflejar la ruta de su biblioteca exactamente desde el sistema de destino. Lo anterior está destinado a depurar objetivos que no coinciden con su host, por eso es importante replicar la estructura de su sistema de archivos raíz que contiene sus bibliotecas.

Si está depurando remotamente un servidor que tiene la misma arquitectura y la misma versión de Linux / glibc que su servidor, entonces puede hacer lo siguiente:

set solib-search-path <path>

Si intenta sobrescribir algunas de las bibliotecas, pero no todas, puede copiar la estructura del directorio de la biblioteca de destino en un lugar temporal y usar la solib-absolute-prefix descrita anteriormente.


No estoy seguro de que esto sea posible en absoluto en gdb, pero entonces no soy un experto.

Sin embargo, puedo comentar sobre el enlazador dinámico de Linux . Lo siguiente debe imprimir la ruta de todas las bibliotecas compartidas resueltas y las no resueltas.

ldd path/to/executable

Necesitamos saber cómo se vincularon sus bibliotecas compartidas con su ejecutable. Para hacer esto, use el siguiente comando:

readelf -d path/to/executable | grep RPATH

  • Si el comando no imprime nada, el enlazador dinámico usará las ubicaciones estándar más la variable de entorno LD_LIBRARY_PATH para encontrar las bibliotecas compartidas.

  • Si el comando imprime algunas líneas, el enlazador dinámico ignorará LD_LIBRARY_PATH y usará las rutas de acceso codificadas en su lugar.

    Si los recorridos enumerados son absolutos, la única solución que conozco es copiar (o vincular simbólicamente) sus bibliotecas a las ubicaciones enumeradas.

    Si los rpath enumerados son relativos, contendrán $ ORIGIN que será reemplazado en el tiempo de ejecución por la ruta del ejecutable. Mueva el ejecutable o las bibliotecas para que coincidan.

Para obtener más información, puede comenzar con:

man ld.so


También puede establecer LD_PRELOAD en cada una de las bibliotecas o LD_LIBRARY_PATH en el directorio actual al invocar gdb. Esto solo causará problemas si gdb intenta usar cualquiera de las bibliotecas que está cargando.


Una nota importante:

Si está haciendo una compilación cruzada e intenta depurar con gdb, entonces después de que haya terminado
file ECECUTABLE_NAME si ve smth. me gusta :

Using host libthread_db library "/lib/libthread_db.so.1"

luego verifique si tiene libthread_db para su sistema de destino. Encontré muchos problemas similares en la web. Tal problema no puede resolverse simplemente usando "set solib-", también debe compilar libthread_db usando su compilador cruzado.