Créer une fonction wrapper pour malloc et free en C
Je suis en train de créer des fonctions wrapper free
et malloc
en C pour aider à me signaler les fuites de mémoire. Personne ne sait comment déclarer ces fonctions, donc quand je l'appelle malloc()
et free()
il va appeler mes fonctions personnalisées et non pas des normes lib fonctions?
- Note de côté, c'est ce que des outils comme Valgrind ne. Si vous préférez utiliser quelque chose hors de la boîte sur Unix ou Linux, Valgrind est une bonne option.
Vous devez vous connecter pour publier un commentaire.
Vous avez un peu d'options:
GLIBC-solution spécifique (principalement Linux). Si votre environnement de compilation est
glibc
avecgcc
, le meilleur moyen est d'utiliser malloc crochets. Non seulement il vous permet de spécifier personnalisémalloc
etfree
, mais également d'identifier l'appelant par l'adresse de retour sur la pile.POSIX solution spécifique. Définir
malloc
etfree
comme emballages pour l'allocation initiale des routines dans votre exécutable, qui va "remplacer" la version de la libc. À l'intérieur de l'emballage, vous pouvez appeler dans l'originalmalloc
mise en œuvre, que vous pouvez rechercher à l'aide dedlsym
avecRTLD_NEXT
poignée. Votre application ou de la bibliothèque qui définit des fonctions wrapper doit lien avec-ldl
.Spécifique à Linux. Vous pouvez remplacer les fonctions de bibliothèques dynamiques non-invasive en précisant dans le
LD_PRELOAD
variable d'environnement.Mac OSX spécifiques.
Même que Linux, sauf que vous allez utiliser
DYLD_INSERT_LIBRARIES
variable d'environnement.LD_PRELOAD=./malloc.so ls
. N'est-ce pas la création d'une récursion infinie? Comment dire les fonctions à l'intérieur de notre coutume malloc l'utilisation de la libc-malloc?Vous pouvez faire wrapper et "écraser" la fonction avec LD_PRELOAD, de manière similaire à l'exemple montré plus tôt.
Mais je recommande de le faire "un peu" plus intelligente, je veux dire appel dlsym une fois.
exemple que j'ai trouvé ici: http://www.jayconrod.com/cgi/view_post.py?23 post par Jay Bielle.
Mais ce que j'ai trouvé vraiment cool à cette page, c'est que: éditeur de liens GNU fournit une option utile, --envelopper . Quand je vérifie "l'homme ld", il est l'exemple suivant:
Je suis d'accord avec eux c'est "trivial" exemple :). Même dlsym n'est pas nécessaire.
Laissez, moi de citer encore une partie de mon "homme ld" page:
Je l'espère, la description est complète et montre comment utiliser ces choses.
LD_PRELOAD=/tmp/libjmalloc.so ./a.out
. Il résout le problème dans mon cas. Il aide à la vôtre?Désolé pour la réouverture de 7 ans post.
Dans mon cas, j'avais besoin d'envelopper memalign/aligned_malloc en vertu de malloc. Après avoir essayé d'autres solutions j'ai fini la mise en œuvre de l'un de ceux énumérés ci-dessous. Il semble fonctionner correctement.
mymalloc.c.
En C, la méthode que j'ai utilisé était similaire à:
Cela m'a permis de détecter la ligne et le fichier de où la mémoire a été allouée sans trop de difficulté. Il convient de croix-plate-forme, mais permettra de rencontrer des problèmes si la macro est déjà défini (qui ne devrait être le cas si vous utilisez un autre détecteur de fuite de mémoire.)
Si vous souhaitez mettre en œuvre la même en C++, la procédure est un peu plus complexe mais utilise la même astuce.
__
et les noms commençant par_
et une lettre majuscule sont réservés par la norme. Les noms commençant par un seul trait de soulignement sont pas réservés, mais ils doivent être contenues dans le fichier, c'est à dire l'éditeur de liens ne devraient pas voir. Donc, tant que_my_malloc
et_my_free
sont des fonctions statiques, c'est ok. Sur l'autre main, la redéfinition des fonctions de la bibliothèque est un comportement indéfini._my_malloc()
comme une fonction statique tombe sous le coup de la deuxième restriction.static void *_my_malloc(size_t)
est définie uniquement dans la portée du fichier dans l'ordinaire de l'espace de nom (et ce n'est pas une struct/union/enum, de sorte qu'il n'a même pas entrer le nom de la balise de l'espace).static void *_my_malloc(size_t)
est défini dans le fichier de la portée ordinaire de l'espace de nom' en collision, tête-à-tête avec la norme en disant: "tous les identifiants qui commencent avec le caractère de soulignement sont toujours réservés pour une utilisation comme identificateurs de fichier portée dans l'ordinaire de l'espace de nom'. Ce qui me manque?Voici un ensemble de fonctions wrapper j'ai utilisé pendant des années (et encore quand je dip en C) pour détecter libres avais de mémoire, la mémoire libre avais plusieurs fois références à la libre avais de la mémoire, les dépassements de tampon/underflows, et de libérer de la mémoire qui n'a pas attribué.
ftp://ftp.digitalmars.com/ctools.zip
Ils ont été autour depuis 25 ans et qui ont fait leurs preuves.
Vous pouvez utiliser la macro du préprocesseur de redéfinir la fonction malloc et free pour utiliser le mem paquet, mais je ne le recommandons pas, car il ne sera pas rediriger la bibliothèque des appels à malloc comme ce strdup n'.
Si votre but est d'éliminer les fuites de mémoire, plus facile, moins intrusif façon est d'utiliser un outil comme Valgrind (gratuit) ou Purifier (coûteuse).
Si vous définissez vos propres fonctions à malloc() et free() et explicitement le lien avec vos applications, vos fonctions doivent être utilisées de préférence à ceux de la bibliothèque.
Cependant, votre fonction appelée 'malloc' ne peut pas appeler la bibliothèque en fonction de malloc, parce que " c " il n'y a pas de notion de séparer les espaces de noms. En d'autres termes, vous auriez à mettre en œuvre les mécanismes internes de malloc et free vous-même.
Une autre approche serait d'écrire des fonctions my_malloc() et my_free(), qui appellent le standard de la bibliothèque celles de. Cela signifie que le code d'appel de malloc devrait être modifié pour appeler votre my_xxx fonctions.
Si vous utilisez Linux, vous pouvez utiliser malloc_hook() (avec GNU glibc). Cette fonction vous permet d'avoir malloc appeler votre fonction avant d'appeler le réel malloc. La page de man a un exemple sur la façon de l'utiliser.
Si vous êtes seulement de parler de mémoire que vous avez sous contrôle, c'est à dire que vous malloc et free sur votre propre, vous pouvez prendre un coup d'oeil sur rmdebug. C'est probablement ce que vous allez écrire de toute façon, de sorte que vous pouvez enregistrer de temps en temps. Il a une très libérale de la licence, si cela devait être important pour vous.
Personnellement, je les utiliser dans un projet, de rechercher des fuites de mémoire, les belles choses, c'est qu'il est beaucoup plus rapide, valgrind, cependant il n'est pas si puissant afin de ne pas obtenir la pleine pile d'appel.