GNU/Linux >> Tutoriels Linux >  >> Linux

Comment installer et utiliser l'outil de profilage Gprof sous Linux

Il ne fait aucun doute que les tests font partie intégrante et constituent l'un des aspects les plus importants du processus de développement logiciel. Et par test, nous n'entendons pas seulement tester le code pour détecter les bogues - bien sûr, la détection des bogues est importante car personne ne voudrait que son logiciel soit bogué - les performances du code sont également importantes de nos jours.

S'ils sont décomposés jusqu'au dernier bit, les tests de performances testent efficacement le temps qu'un morceau de code particulier - disons une fonction - consomme. Comme c'est généralement le cas, une fonction ou un groupe de fonctions peut correspondre à l'une des nombreuses fonctionnalités d'un logiciel. Ainsi, si grâce à des tests de performances, nous pouvons améliorer les performances de ces fonctions dans le code, les performances globales du logiciel s'en trouvent améliorées.

Si vous êtes un programmeur, qui écrit du code en langage de programmation C, Pascal ou Fortran77 et utilise Linux comme plate-forme de développement, vous serez heureux de savoir qu'il existe un outil puissant grâce auquel vous pouvez vérifier les performances de votre code - l'outil en question est Gprof. Dans ce didacticiel, nous discuterons des détails de la façon dont vous pouvez télécharger, installer et utiliser cet outil.

Avant de continuer, veuillez noter que tous les exemples et instructions mentionnés dans ce tutoriel ont été testés sur Ubuntu 14.04LTS et que la version Gprof utilisée est la 2.24.

Qu'est-ce que Gprof ?

Alors, qu'est-ce que Gprof exactement ? Selon la documentation officielle de l'outil, il donne aux utilisateurs un profil d'exécution de leurs programmes C, Pascal ou Fortran77. Ce que Gprof fait essentiellement, c'est qu'il calcule le temps passé dans chaque routine ou fonction. "Ensuite, ces temps sont propagés le long des bords du graphe d'appels. Des cycles sont découverts et des appels dans un cycle sont effectués pour partager le temps du cycle."

Si tout cela semble un peu déroutant à ce stade (en particulier la partie entre guillemets), ne vous inquiétez pas, car nous allons clarifier les choses à travers un exemple. Alors, lisez la suite.

Télécharger et installer Gprof

Vérifiez d'abord si l'outil est déjà installé sur votre système. Pour ce faire, exécutez simplement la commande suivante dans un terminal.

$ gprof

Si vous obtenez une erreur comme :

$ a.out :aucun fichier ou répertoire de ce type

cela signifierait alors que l'outil est déjà installé. Sinon, vous pouvez l'installer à l'aide de la commande suivante :

$ apt-get install binutils

Utilisation de Gprof

Inutile de dire que la meilleure façon de comprendre un outil comme Gprof est à travers un exemple pratique. Donc, nous allons commencer avec un programme en langage C, que nous allons profiler via Gprof. Voici le programme :

//test_gprof.c

#include

void func4(void)
{
    printf("\n À l'intérieur de func4() \n");
    for(int count=0;count<=0XFFFF;count++);
}

void func3(void)
{
    printf("\n Inside func3() \n");
    for(int count=0;count<=0XFFFFFFF;count++);
}

void func2(void)
{
    printf("\n Inside func2() \n");

    for(int count=0;count<=0XFFF;count++ );

    func3();
}

void func1(void)
{
    printf("\n Inside func1() \n");
    for(int count=0;count<=0XFFFFFF;count++);

    func2();
}

int main(void)
{
    printf("\n main() starts...\n");
    for(int count=0;count<=0XFFFFF;count++);

    func1();
    func4();
    printf("\n main() se termine...\n");

    return 0;
}

Veuillez noter que le code ci-dessus (test_gprof.c ) est spécifiquement écrit pour expliquer Gprof - il n'est tiré d'aucun projet réel.

Maintenant, poursuivons, l'étape suivante consiste à compiler ce code à l'aide de gcc. Notez qu'idéalement j'aurais compilé le code ci-dessus en utilisant la commande suivante :

$ gcc -Wall -std=c99 test_gprof.c -o test_gprof

Mais puisque nous devons profiler le code en utilisant Gprof, je vais devoir utiliser le -pg option de ligne de commande fournie par le compilateur gcc. Ainsi, la commande devient :

$ gcc -Wall -std=c99 -pg test_gprof.c -o test_gprof

Si vous jetez un œil à la page de manuel de gcc, voici ce qu'elle dit à propos de -pg choix :

"Générer du code supplémentaire pour écrire des informations de profil adaptées au programme d'analyse gprof. Vous devez utiliser cette option lors de la compilation des fichiers source sur lesquels vous souhaitez obtenir des données, et vous devez également l'utiliser lors de la liaison."

Maintenant, revenons à la commande ci-dessus, une fois exécutée avec succès, elle produira un binaire nommé test_gprof dans la sortie. L'étape suivante consiste à lancer cet exécutable. Voici comment j'ai lancé le binaire dans mon cas : 

$ ./test_gprof

Une fois la commande exécutée, vous verrez qu'un fichier nommé gmon.out sera généré dans le répertoire de travail courant.

$ ls gmon*
gmon.out


C'est ce fichier qui contient toutes les informations dont l'outil Gprof a besoin pour produire une donnée de profilage lisible par l'homme. Alors, utilisez maintenant l'outil Gprof de la manière suivante :

$ gprof test_gprof gmon.out> profile-data.txt

En gros, la syntaxe générique de cette commande est :

$ gprof [nom-exécutable] gmon.out> [nom-du-fichier-qui-contiendra-les-données-de-profilage]

Maintenant, avant de voir les informations, le profile-data.txt contient, il convient de mentionner que la sortie lisible par l'homme produite par Gprof est divisée en deux parties :le profil plat et le graphique d'appel. Voici ce que dit la page de manuel de Gprof à propos des informations contenues dans ces deux sections :

"Le profil plat montre combien de temps votre programme a passé dans chaque fonction et combien de fois cette fonction a été appelée. Si vous voulez simplement savoir quelles fonctions brûlent le plus de cycles, c'est indiqué de manière concise ici."

"Le graphique des appels indique, pour chaque fonction, quelles fonctions l'ont appelée, quelles autres fonctions elle a appelées et combien de fois. Il existe également une estimation du temps passé dans les sous-routines de chaque fonction. Cela peut suggérer endroits où vous pourriez essayer d'éliminer les appels de fonction qui prennent beaucoup de temps."

Armé de ces informations, vous serez désormais mieux placé pour comprendre les données présentes dans votre fichier de sortie de profilage (profile-data.txt dans mon cas). Voici le profil plat dans mon cas :

Profil plat :

Chaque échantillon compte pour 0,01 seconde.
% cumulatif auto auto total
temps secondes secondes appels ms/appel ms/nom de l'appel
96,43 0,81 0,81 1 810,00 810,00 fonction3
3,57 0,84 0,03 1 30,00 840,00 fonction1
0,00 0,84 0,00 1 0,00 810,00 fonction2
0,00 0,84 0,00 1

Et voici ce que signifie chaque champ :

Passant à autre chose, voici le graphique des appels dans mon cas :

Graphique d'appel (explication ci-dessous)


granularité :chaque hit d'échantillon couvre 4 octet(s) pendant 1,19 % de 0,84 seconde

index % time self enfants appelés nom
0,03 0,81 1/1 principal [2]
[1] 100,0 0,03 0,81 1 func1 [1]
0,00 0,81 1/1 func2 [3]
-- ---------------------------------------------

[2] 100,0 0,00 0,84 principal [2]
0,03 0,81 1/1 func1 [1]
0,00 0,00 1/1 func4 [5]
---- ------------------------------------------------
0,00 0,81 1 /1 fonction1 [1]
[3] 96,4 0,00 0,81 1 fonction2 [3]
0,81 0,00 1/1 fonction3 [4]
------------ -----------------------------------
0,81 0,00 1/1 fonc2 [3]
[4] 96,4 0,81 0,00 1 fonction3 [4]
--------------------------------------------- ----------- ---
0.00 0.00 1/1 principal [2]
[5] 0.0 0.00 0.00 1 func4 [5]

Les captures d'écran suivantes expliquent les informations contenues dans le graphique des appels :

Si vous vous interrogez sur la source des captures d'écran ci-dessus, laissez-moi vous dire que toutes ces informations sont présentes dans le fichier de sortie qui contient les informations de profilage, y compris le profil plat et le graphique des appels. Si vous souhaitez que ces informations soient omises de la sortie, vous pouvez utiliser le -b option fournie par Gprof.

Conclusion

Inutile de dire que nous n'avons fait qu'effleurer la surface ici, car Gprof offre de nombreuses fonctionnalités (il suffit de jeter un œil à sa page de manuel). Cependant, tout ce que nous avons couvert ici devrait être suffisant pour vous aider à démarrer. Si vous utilisez déjà Gprof et que vous souhaitez partager quelque chose lié à l'outil avec tout le monde ici, déposez simplement un commentaire ci-dessous.


Linux
  1. Comment installer et utiliser telnet sur Kali Linux

  2. Comment installer et utiliser Flatpak sous Linux

  3. Comment installer et utiliser Traceroute sous Linux

  4. Comment installer et utiliser l'outil de ligne de commande Mosh Linux

  5. Tutoriel GPROF - Comment utiliser l'outil de profilage Linux GNU GCC

Comment installer et utiliser Thunderbird sous Linux

Comment installer et utiliser Git dans le système Linux

Comment installer et utiliser la commande Ping sous Linux

Comment installer et utiliser l'outil Pigz sous Linux

Comment installer et utiliser la commande fd sous Linux

Comment installer et utiliser Nu Shell sous Linux