#include <mcheck.h> void mtrace(void); void muntrace(void);
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.
Interface | Attribut | Valeur |
mtrace(), muntrace() | Sécurité des threads | MT-Unsafe |
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.
$ cat t_mtrace.c #include <mcheck.h> #include <stdio.h> #include <stdlib.h>
int
main(void)
{
mtrace();
for (unsigned int j = 0; j < 2; j++)
malloc(100); /* Never freed--a memory leak */
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)).
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à