gdb - tecnicas - tipos de archivos de documentos
Formato de archivo central ELF (5)
El formato de archivo de volcado de núcleo está utilizando el formato ELF pero no se describe en el estándar ELF. AFAIK, no hay referencia autorizada sobre esto.
Entonces, ¿cómo es la información sobre qué archivo corresponde a un segmento, almacenado en el archivo central?
Una gran cantidad de información adicional se incluye en las notas ELF. Puedes usar readelf -n
para verlos.
La nota CORE / NT_FILE define la asociación entre el rango de direcciones de memoria y el archivo (+ desplazamiento):
Page size: 1
Start End Page Offset
0x0000000000400000 0x000000000049d000 0x0000000000000000
/usr/bin/xchat
0x000000000069c000 0x00000000006a0000 0x000000000009c000
/usr/bin/xchat
0x00007f2490885000 0x00007f24908a1000 0x0000000000000000
/usr/share/icons/gnome/icon-theme.cache
0x00007f24908a1000 0x00007f24908bd000 0x0000000000000000
/usr/share/icons/gnome/icon-theme.cache
0x00007f24908bd000 0x00007f2490eb0000 0x0000000000000000
/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf
[...]
Para cada hilo, debe tener una nota CORE/NT_PRSTATUS
que le proporcione los registros del hilo (incluido el puntero de pila). Es posible que pueda inferir la posición de las pilas a partir de esto.
Más información sobre el formato de los archivos básicos ELF:
Sin excavar a través de la fuente GDB, ¿dónde puedo encontrar documentación sobre el formato utilizado para crear los archivos centrales?
La especificación ELF deja el formato de archivo central abierto, así que supongo que esto debería ser parte de las especificaciones GDB. Tristemente, no encontré ninguna ayuda en este sentido de la documentación gdb de GNU.
Esto es lo que trato de hacer: Asignar direcciones virtuales a nombres de funciones en ejecutables / bibliotecas que comprenden el proceso en ejecución. Para hacer eso, primero me gustaría averiguar, desde el archivo central, el mapa desde el espacio de direcciones virtuales hasta el nombre del archivo / bibliotecas ejecutables, y luego profundizar en el archivo relevante para obtener la información simbólica.
Ahora ''readelf -a core'' me dice que casi todos los segmentos en el archivo core son del tipo ''load'' - Supongo que estos son los segmentos .text y .bss / .data de todos los archivos participantes, más un segmento de pila. A excepción de estos segmentos de carga, hay un segmento de nota, pero eso no parece contener el mapa. Entonces, ¿cómo es la información sobre qué archivo corresponde a un segmento, almacenado en el archivo central? ¿Están esos segmentos de ''carga'' formateados de una manera particular para incluir la información del archivo?
La información adicional sobre el proceso que generó el archivo central se almacena en una sección de nota ELF, aunque de una manera específica del sistema operativo. Por ejemplo, consulte la página de manual de core (5) para NetBSD .
Un volcado de núcleo es la imagen en memoria del proceso cuando se colgó. Incluye los segmentos del programa, la pila, el montón y otros datos. Todavía necesitará el programa original para dar sentido a los contenidos: las tablas de símbolos y otros datos hacen que las direcciones y estructuras sin formato en la imagen de la memoria sean significativas.
Una solución más simple a su problema puede ser analizar el texto de / proc / $ pid / maps para determinar a qué archivo se asigna una dirección virtual determinada. Luego puede analizar el archivo correspondiente.
El VDB (depurador) de código abierto de Kenshoto utiliza este enfoque, si puedes leer Python, es un buen ejemplo.
No tanto gdb
como la biblioteca bfd
utilizada por gdb
, binutils
, etc.