2009-05-12 7 views
14

donde do malloc() y free() almacenan las direcciones asignadas y sus tamaños (Linux GCC)? He leído que algunas implementaciones las guardan en algún lugar antes de la memoria real asignada, pero no pude confirmar eso en mis pruebas.Dónde hacer malloc()/free() Almacenar tamaños y direcciones asignados?

El fondo, tal vez alguien tiene otro consejo para esto: Estoy experimentando un poco con el análisis de la memoria de montón de un proceso para determinar el valor actual de una cadena en el otro proceso. Acceder a la memoria del montón de proceso y pasear por ella no es un problema. Sin embargo, como el valor de la cadena cambia y el proceso asigna una nueva parte de la memoria cada vez, la dirección de la cadena cambia. Como la cadena tiene un formato fijo, es fácil de encontrar, pero después de algunos cambios, las versiones anteriores de la cadena todavía están en la memoria del montón (probablemente liberadas, pero aún no reutilizadas/sobrescritas) y por lo tanto no puedo decir qué cadena es la actual.

Por lo tanto, para encontrar el actual, quiero verificar si todavía se utiliza una cadena que encuentro en la memoria al comparar su dirección con las direcciones malloc/free know.

ciao, Elmar

+0

Además de mi respuesta a continuación, esto podría ayudar un poco http://www.linuxforums.org/forum/linux-programming-scripting/52375-reading-memory-other-processes.html –

+0

Es posible que también desee excavar alrededor en la porción de mapeo de memoria del kernel/glibc –

Respuesta

12

Hay un montón de maneras en las que malloc/libre puede almacenar el tamaño del área de memoria. Por ejemplo, podría almacenarse justo antes del área devuelta por malloc. O podría almacenarse en una tabla de búsqueda en otro lugar. O podría almacenarse implícitamente: algunas áreas podrían reservarse para tamaños específicos de asignaciones.

Para saber cómo funciona la biblioteca C en Linux (glibc), obtenga el código fuente de http://ftp.gnu.org/gnu/glibc/ y mire el archivo malloc/malloc.c. Hay un poco de documentación en la parte superior, y se refiere a A Memory Allocator por Doug Lea.

+1

Agradable y sucinto, me cuesta mucho seguir la extraña respuesta de Aiden, realmente no creo que haya respondido de ninguna manera. – RandomNickName42

1

Esto depende de la implementación de la biblioteca estándar, por supuesto. Por lo tanto, su mejor opción sería explorar el origen de la biblioteca (glibc es el valor predeterminado en Linux) y ver si puede resolverlo. Probablemente no sea trivial.

Cuestiones relacionadas