memusage(1) General Commands Manual memusage(1) NOM memusage - Profiler l'utilisation par un programme de la memoire SYNOPSIS memusage [option]... programme [optionprogramme]... DESCRIPTION memusage est un script bash qui profile l'utilisation de la memoire par le programme programme. Il precharge la bibliotheque libmemusage.so dans l'environnement de l'appelant (au moyen de la variable d'environnement LD_PRELOAD ; voir ld.so(8)). La bibliotheque libmemusage.so trace l'allocation de memoire en interceptant les appels a malloc(3), calloc(3), free(3) et realloc(3) ; facultativement, les appels a mmap(2), mremap(2) et munmap(2) peuvent aussi etre interceptes. memusage peut produire les donnees collectees sous une forme textuelle ou il peut utiliser memusagestat(1) (voir l'option -p ci-dessous) pour creer un fichier PNG fournissant la representation graphique des donnees collectees. Resume de l'utilisation de la memoire La ligne << Memory usage summary >> produite par memusage contient trois champs : heap total Somme des parametres taille de tous les appels malloc(3), les produits (nmemb*taille) de tous les appels calloc(3) et la somme des parametres longueur de tous les appels mmap(2). Dans le cas d'appels realloc(3) et mremap(2), si la nouvelle taille d'une allocation est plus grande que la taille precedente, la somme de toutes les differences (nouvelle taille moins ancienne taille) est ajoutee. heap peak Maximum de tous les parametres taille de malloc(3), de tous les produits (nmemb*taille) de calloc(3) et de tous les parametres taille de realloc, des parametres longueur de mmap(2) et des parametres nouvelle_taille de mremap(2). stack peak Avant le premier appel a toute fonction suivie, l'adresse du pointeur de pile (pointeur de pile de base) est sauvegardee. Apres chaque appel de fonction, l'adresse du pointeur de pile effectif est lue et la difference avec le pointeur de pile de base est calculee. La plus grande de ces differences est alors le << pic de la pile >> (<< stack peak >>). Immediatement apres la ligne de resume, un tableau montre le nombre d'appels, le total de la memoire allouee ou desallouee et le nombre d'echecs d'appels pour chaque fonction interceptee. Pour realloc(3) et mremap(2), le champ supplementaire << nomove >> montre les reallocations qui ont change l'adresse d'un bloc et le champ supplementaire << dec >> montre les reallocations qui ont diminue la taille du bloc. Pour realloc(3), le champ supplementaire << free >> montre les reallocations qui ont provoque la liberation d'un bloc (c'est-a-dire dont la taille reallouee est de 0). La colonne << realloc/total memory >> du tableau produit par memusage ne reflete pas les cas ou realloc(3) est utilise pour reallouer un bloc de memoire pour qu'il ait une taille plus petite qu'avant. Ce cas peut faire que la somme de toutes les cellules << total memory >> (sauf << free >>) est plus grande que la cellule << free/total memory >>. Histogrammes des tailles de bloc L'<< Histogram for block sizes >> fournit une repartition des allocations de memoire en paquets de tailles diverses. OPTIONS -n nom, --progname=nom Nom du fichier de programme a profiler. -p fichier, --png=fichier Creer un fichier graphique PNG et l'enregistrer dans fichier. -d fichier, --data=fichier Creer un fichier de donnees binaires et l'enregistrer dans fichier. -u, --unbuffered Ne pas mettre la sortie en tampon. -b taille, --buffer=taille Rassembler les entrees de taille avant de les ecrire. --no-timer Desactiver l'echantillonnage base sur le temporisateur (SIGPROF) de la valeur du pointeur de pile. -m, --mmap Tracer aussi mmap(2), mremap(2) et munmap(2). -?, --help Afficher l'aide puis quitter. --usage Afficher une breve description sur l'utilisation et quitter. -V, --version Afficher les informations de version, puis quitter. Les options suivantes ne s'appliquent que lors de la creation d'une sortie graphique : -t, --time-based Utiliser le temps (plutot que le nombre d'appels de fonction) comme echelle de l'axe X. -T, --total Creer aussi un graphique de l'usage total de la memoire. --title=nom Utiliser nom comme titre du graphique. -x taille, --x-size=taille Creer un graphique d'une largeur de taille pixels. -y taille, --y-size=taille Creer un graphique d'une hauteur de taille pixels. CODE DE RETOUR Le code de retour est egal au code de retour du programme profile. BOGUES Pour signaler des bogues, voir EXEMPLES Ci-dessous se trouve un programme simple qui realloue de facon cyclique un bloc de memoire qui atteint un sommet avant de reallouer la memoire de facon cyclique dans des blocs plus petits qui diminuent jusqu'a zero. Apres compilation du programme et execution des commandes suivantes, un graphique de l'utilisation de la memoire par le programme se trouve dans le fichier memusage.png : $ memusage --data=memusage.dat ./a.out ... Memory usage summary: heap total: 45200, heap peak: 6440, stack peak: 224 total calls total memory failed calls malloc| 1 400 0 realloc| 40 44800 0 (nomove:40, dec:19, free:0) calloc| 0 0 0 free| 1 440 Histogram for block sizes: 192-207 1 2% ================ ... 2192-2207 1 2% ================ 2240-2255 2 4% ================================= 2832-2847 2 4% ================================= 3440-3455 2 4% ================================= 4032-4047 2 4% ================================= 4640-4655 2 4% ================================= 5232-5247 2 4% ================================= 5840-5855 2 4% ================================= 6432-6447 1 2% ================ $ memusagestat memusage.dat memusage.png Source du programme #include #include #define CYCLES 20 int main(int argc, char *argv[]) { int i, j; size_t size; int *p; size = sizeof(*p) * 100; printf("malloc: %zu\n", size); p = malloc(size); for (i = 0; i < CYCLES; i++) { if (i < CYCLES / 2) j = i; else j--; size = sizeof(*p) * (j * 50 + 110); printf("realloc: %zu\n", size); p = realloc(p, size); size = sizeof(*p) * ((j + 1) * 150 + 110); printf("realloc: %zu\n", size); p = realloc(p, size); } free(p); exit(EXIT_SUCCESS); } VOIR AUSSI memusagestat(1), mtrace(1), ld.so(8) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 memusage(1)