sistemas proceso paginacion operativos memoria marcos mapa gestion ejemplos asignacion algoritmos administracion c linux gdb

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]

here

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.