mtrace(3) Suivi de malloc

Other Alias

muntrace

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(), 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.

CONFORMITÉ

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)).

COLOPHON

Cette page fait partie de la publication 3.65 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 à <[email protected]> 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> ».