2009-05-12 5 views
14

où malloc() et free() stockent les adresses allouées et leurs tailles (Linux GCC)? J'ai lu que certaines implémentations les stockent quelque part avant la mémoire allouée, mais je n'ai pas pu confirmer cela dans mes tests. L'arrière-plan, peut-être quelqu'un a un autre conseil pour cela: J'expérimente un peu en analysant la mémoire de tas d'un processus afin de déterminer la valeur actuelle d'une chaîne dans l'autre processus. Accéder à la mémoire de processus et la parcourir n'est pas un problème. Cependant, comme la valeur de la chaîne change et que le processus alloue une nouvelle partie de la mémoire à chaque fois, l'adresse de la chaîne change. Parce que la chaîne a un format fixe, il est toujours facile à trouver, mais après quelques changements, les anciennes versions de la chaîne sont toujours dans la mémoire de tas (probablement libérées, mais pas encore réutilisées/écrasées) et donc je ne peux pas Indique quelle chaîne est la chaîne actuelle. Donc, afin de trouver encore le courant, je veux vérifier si une chaîne que je trouve dans la mémoire est toujours utilisée en comparant son adresse avec les adresses malloc/free.Où est-ce que malloc()/free() stocke les tailles et les adresses allouées?

ciao, Elmar

+0

En plus de ma réponse ci-dessous, cela pourrait aider un peu http://www.linuxforums.org/forum/linux-programming-scripting/52375-reading-memory-other-processes.html –

+0

Vous pourriez aussi vouloir creuser dans la partie cartographie de la mémoire du noyau/glibc –

Répondre

12

Il y a beaucoup de façons dont malloc/gratuit permet de stocker la taille de la zone de mémoire. Par exemple, il peut être stocké juste avant la zone retournée par malloc. Ou il pourrait être stocké dans une table de recherche ailleurs. Ou il peut être stocké implicitement: certaines zones peuvent être réservées pour des tailles d'allocation spécifiques.

Pour savoir comment la bibliothèque C dans Linux (glibc) le fait, obtenez le code source de http://ftp.gnu.org/gnu/glibc/ et consultez le fichier malloc/malloc.c. Il y a de la documentation en haut, et il fait référence à A Memory Allocator par Doug Lea.

+1

Agréable et succincte, j'ai du mal à suivre la réponse étrange d'Aiden, je ne pense pas vraiment qu'il y ait répondu de toute façon. – RandomNickName42

1

Cela dépend de l'implémentation de la bibliothèque standard, bien sûr. Donc, votre meilleur pari serait probablement de creuser à travers la source de la bibliothèque (glibc est la valeur par défaut sur Linux) et voir si vous pouvez le comprendre. Ce ne sera probablement pas trivial.

Questions connexes