NOM¶
mtrace, muntrace - Suivi de malloc
SYNOPSIS¶
#include <mcheck.h>
void mtrace(void);
void muntrace(void);
DESCRIPTION¶
La fonction
mtrace() installe des fonctions de rappel
(« hook ») pour les fonctions d'allocation mémoire
malloc(3),
realloc(3) memalign(3), et
free(3). Ces
fonctions de rappel enregistrent l'historique des allocations et
désallocations de mémoire. Ces informations permettent de
découvrir des fuites mémoire ou des libérations de mémoire
non allouée dans un programme.
La fonction
muntrace() désactive les fonctions de rappel
(« hook ») installées par
mtrace() afin
d'arrêter l'enregistrement des appels aux fonction d'allocation
mémoire. Si aucune fonction de rappel n'était installée par
mtrace(),
muntrace() ne fait rien.
Lors de l'appel à
mtrace(3), la valeur de la variable
d'environnement
MALLOC_TRACE est lue pour y trouver le chemin du
fichier où enregistrer l'historique des appels. Si ce fichier est
correctement ouvert, il est remis à zéro.
Si
MALLOC_TRACE n'est pas définie, ou si le chemin passé en
paramètre est invalide ou ne peut pas être écrit, alors aucune
fonction de rappel (« hook ») n'est installé et
mtrace() n'aura pas d'effet. Pour les programmes
setuid ou
setgid,
MALLOC_TRACE est ignoré et
mtrace() n'est
pas d'effet.
Ces fonctions sont des extensions GNU.
NOTES¶
En utilisation habituelle,
mtrace() est appelé une fois au
début de l'exécution du programme, et
muntrace() n'est jamais
appelé.
La sortie produite lors d'un appel à
mtrace() est sous forme de
texte, mais n'a pas été prévue pour être lisible par un
humain. La bibliothèque GNU C fournit un script Perl,
mtrace(1),
qui interprète l'enregistrement des appels mémoire et affiche une
sortie lisible. Pour de meilleurs résultats, le programme
instrumenté devrait être compilé avec les symboles de
débogage, afin que les numéros de ligne soient inscrits dans
l'exécutable.
Le suivi des appels d'allocation mémoire effectué par
mtrace()
pénalise les performances.
BOGUES¶
Le numéro de ligne indiqué par
mtrace(1) n'est pas toujours
précis : il peut faire référence à la ligne de code
(non vide) précédente ou suivante.
EXEMPLE¶
L'exemple de session suivant montre comment utiliser la fonction
mtrace()
et la commande
mtrace(1) dans un programme qui renferme des fuites
mémoire à deux endroits différents.
$ cat t_mtrace.c
#include <mcheck.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
int j;
mtrace();
for (j = 0; j < 2; j++)
malloc(100); /* Jamais libéré -- une fuite mémoire */
calloc(16, 16); /* Jamais libéré -- une fuite mémoire */
exit(EXIT_SUCCESS);
}
Lorsque ce programme est exécuté comme ci-dessous,
mtrace()
diagnostique des fuites mémoire à deux endroits différents.
$ cc -g t_mtrace.c -o t_mtrace
$ export MALLOC_TRACE=/tmp/t
$ ./t_mtrace
$ mtrace ./t_mtrace $MALLOC_TRACE
Memory not freed:
-----------------
Address Size Caller
0x084c9378 0x64 at /home/cecilia/t_mtrace.c:12
0x084c93e0 0x64 at /home/cecilia/t_mtrace.c:12
0x084c9448 0x100 at /home/cecilia/t_mtrace.c:16
Les deux premiers messages liés à la mémoire non
libérée correspondent aux deux appels à
malloc(3) dans
la boucle
for. Le dernier message correspond à l'appel
calloc(3) (qui à son tour appelle
malloc(3)).
VOIR AUSSI¶
mtrace(1),
malloc(3),
malloc_hook(3),
mcheck(3)
COLOPHON¶
Cette page fait partie de la publication 3.44 du projet
man-pages Linux.
Une description du projet et des instructions pour signaler des anomalies
peuvent être trouvées à l'adresse
<
http://www.kernel.org/doc/man-pages/>.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Thierry Vignaud (2002), Alain Portal
<
http://manpagesfr.free.fr/> (2006). Florentin Duneau et
l'équipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet
manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande «
man -L C
<section> <page_de_man> ».