paginacion - GDB: Enumerar todas las regiones de memoria asignadas por un proceso bloqueado
mapa de memoria de un proceso (6)
Tengo un volcado de núcleo completo de un proceso inactivo en una máquina Linux x86 (kernel 2.6.35-22 si es que importa), que estoy intentando depurar en GDB.
¿Existe un comando GDB que pueda usar que signifique "mostrarme una lista de todas las regiones de direcciones de memoria asignadas por este proceso?" En otras palabras, ¿puedo averiguar cuáles son todas las posibles direcciones de memoria válidas que puedo examinar en este vuelco?
La razón por la que pregunto es que necesito buscar todo el montón del proceso para una cierta cadena binaria, y para usar el comando find
, necesito tener una dirección de inicio y de finalización. Simplemente buscar de 0x00 a 0xff .. no funciona porque find
detiene tan pronto como encuentra una dirección a la que no puede acceder:
(gdb) encuentra / w 0x10000000, 0xff000000, 0x12345678
advertencia: no se puede acceder a la memoria de destino en 0x105ef883, deteniendo la búsqueda.
De modo que necesito obtener una lista de todas las regiones de direcciones legibles en la memoria para poder buscarlas de a una por vez.
(La razón por la que necesito hacer eso es que necesito encontrar todas las estructuras en la memoria que apuntan a cierta dirección).
Ninguno de show mem
, show proc
, info mem
, info proc
parecen hacer lo que necesito.
Acabo de ver lo siguiente:
set mem inaccessible-by-default [on|off]
Podría permitirle buscar sin importar si la memoria es accesible.
El problema con maintenance info sections
es que el comando intenta extraer información del encabezado de sección del archivo binario. No funciona si se dispara el binario (por ejemplo, mediante sstrip
) o si proporciona información incorrecta cuando el cargador puede cambiar el permiso de memoria después de la carga (por ejemplo, el caso de RELRO
).
En GDB 7.2:
(gdb) help info proc
Show /proc process information about any running process.
Specify any process id, or use the program being debugged by default.
Specify any of the following keywords for detailed info:
mappings -- list of mapped memory regions.
stat -- list a bunch of random process info.
status -- list a different bunch of random process info.
all -- list all available /proc info.
Desea info proc mappings
, excepto que no funciona cuando no hay /proc
(como durante la depuración post mortem).
Pruebe maintenance info sections
lugar.
Si tiene el programa y el archivo central, puede hacer los siguientes pasos.
1) Ejecute el gdb en el programa junto con el archivo core
$gdb ./test core
2) escriba archivos de información y vea qué segmentos diferentes hay en el archivo central.
(gdb)info files
Un resultado de muestra:
(gdb)info files
Symbols from "/home/emntech/debugging/test".
Local core dump file:
`/home/emntech/debugging/core'', file type elf32-i386.
0x0055f000 - 0x0055f000 is load1
0x0057b000 - 0x0057c000 is load2
0x0057c000 - 0x0057d000 is load3
0x00746000 - 0x00747000 is load4
0x00c86000 - 0x00c86000 is load5
0x00de0000 - 0x00de0000 is load6
0x00de1000 - 0x00de3000 is load7
0x00de3000 - 0x00de4000 is load8
0x00de4000 - 0x00de7000 is load9
0x08048000 - 0x08048000 is load10
0x08049000 - 0x0804a000 is load11
0x0804a000 - 0x0804b000 is load12
0xb77b9000 - 0xb77ba000 is load13
0xb77cc000 - 0xb77ce000 is load14
0xbf91d000 - 0xbf93f000 is load15
En mi caso tengo 15 segmentos. Cada segmento tiene el inicio de la dirección y el final de la dirección. Elija cualquier segmento para buscar datos. Por ejemplo, seleccione load11 y busque un patrón. Load11 tiene la dirección de inicio 0x08049000 y termina en 0x804a000.
3) Busca un patrón en el segmento.
(gdb) find /w 0x08049000 0x0804a000 0x8048034
0x804903c
0x8049040
2 patterns found
Si no tiene un archivo ejecutable, necesita usar un programa que imprima datos de todos los segmentos de un archivo central. Luego puede buscar datos específicos en una dirección. No encuentro ningún programa como tal, puede usar el programa en el siguiente enlace que imprime datos de todos los segmentos de un núcleo o un archivo ejecutable.
http://emntech.com/programs/printseg.c
También puede usar los info files
para enumerar todas las secciones de todos los archivos binarios cargados en el proceso binario.
(gdb) maintenance info sections
Exec file:
`/path/to/app.out'', file type elf32-littlearm.
0x0000->0x0360 at 0x00008000: .intvecs ALLOC LOAD READONLY DATA HAS_CONTENTS
Esto es del comentario de phihag anterior, merece una respuesta por separado. Esto funciona, pero el proceso de info proc
no está en el paquete de Ubuntu de arm-none-eabi-gdb v7.4.1.20130913-cvs del paquete Ubuntu de gcc-arm-none-eabi.