Wie man das Profilierungstool Gprof unter Linux installiert und verwendet

Es besteht kein Zweifel, dass das Testen ein integraler und einer der wichtigsten Aspekte des Softwareentwicklungsprozesses ist. Und mit Testen meinen wir nicht nur das Testen des Codes auf Fehler – natürlich ist die Fehlererkennung wichtig, da niemand möchte, dass seine Software fehlerhaft ist – die Leistung des Codes ist heutzutage ebenfalls wichtig.

Bei einem Ausfall bis zum letzten Bit testet der Leistungstest effektiv, wie viel Zeit ein bestimmtes Stück Code – zum Beispiel eine Funktion – verbraucht. Wie üblich kann eine Funktion oder eine Gruppe von Funktionen einer der vielen Funktionen einer Software entsprechen. Wenn wir also durch Leistungstests die Leistung dieser Funktionen im Code verbessern können, wird die Gesamtleistung der Software besser.

Wenn Sie Programmierer sind, der Code in der Programmiersprache C, Pascal oder Fortran77 schreibt und Linux als Entwicklungsplattform verwendet, werden Sie sich freuen zu wissen, dass es ein leistungsfähiges Werkzeug gibt, mit dem Sie die Leistung Ihres Codes überprüfen können – es handelt sich um Gprof. In diesem Tutorial werden wir die Details besprechen, wie Sie dieses Tool herunterladen, installieren und verwenden können.

Bevor wir weitermachen, beachten Sie bitte, dass alle in diesem Tutorial genannten Beispiele und Anweisungen auf Ubuntu 14.04LTS getestet wurden und die verwendete Gprof-Version 2.24 ist.

Was ist Gprof?

Also, was genau ist Gprof? Gemäß der offiziellen Dokumentation des Tools gibt es den Benutzern ein Ausführungsprofil ihrer C-, Pascal- oder Fortran77-Programme. Was Gprof im Grunde genommen macht, ist, dass es die Zeit berechnet, die in jeder Routine oder Funktion verbracht wird. „Als nächstes werden diese Zeiten entlang der Kanten des Anrufdiagramms propagiert. Zyklen werden entdeckt, und Aufrufe in einen Zyklus werden gemacht, um die Zeit des Zyklus zu teilen.“

Wenn all dies an dieser Stelle etwas verwirrend klingt (besonders der Teil in Anführungszeichen), machen Sie sich keine Sorgen, da wir die Dinge durch ein Beispiel verdeutlichen werden. Also, lies weiter.

Gprof herunterladen und installieren

Überprüfen Sie zunächst, ob das Tool bereits auf Ihrem System installiert ist oder nicht. Um dies zu tun, führen Sie einfach den folgenden Befehl in einem Terminal aus.

$ gprof

Wenn Sie einen Fehler wie:

$ a.out: No such file or directory

dann würde das bedeuten, dass das Tool bereits installiert ist. Ansonsten kannst du es mit dem folgenden Befehl installieren:

$ apt-get install binutils

Gprof-Nutzung

Natürlich ist der beste Weg, ein Tool wie Gprof zu verstehen, ein praktisches Beispiel. Also, wir beginnen mit einem C-Sprachprogramm, das wir durch Gprof profilieren werden. Hier ist das Programm:

//test_gprof.c
#include<stdio.h>

void func4(void)
{
printf("\n Inside 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() ends...\n");

return 0;
}

Bitte beachten Sie, dass der oben gezeigte Code (test_gprof.c) speziell zur Erklärung von Gprof geschrieben wurde – er stammt nicht aus einem realen Projekt.

Nun, um fortzufahren, ist der nächste Schritt, diesen Code mit gcc zu kompilieren. Beachten Sie, dass ich den obigen Code idealerweise mit dem folgenden Befehl kompiliert hätte:

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

Aber da wir den Code mit Gprof profilieren müssen, muss ich die Befehlszeilenoption -pg verwenden, die vom gcc-Compiler bereitgestellt wird. So wird der Befehl:

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

Wenn du einen Blick auf die Man Page von gcc wirfst, ist hier, was sie über die Option -pg sagt:

„Zusatzcode generieren, um Profilinformationen zu schreiben, die für das Analyseprogramm gprof geeignet sind. Diese Option müssen Sie bei der Kompilierung der Quelldateien verwenden, über die Sie Daten wünschen, und Sie müssen sie auch bei der Verknüpfung verwenden.“

Nun, um auf den obigen Befehl zurückzukommen, nachdem er erfolgreich ausgeführt wurde, wird er ein Binärprogramm namens test_gprof in der Ausgabe erzeugen. Der nächste Schritt ist der Start dieser ausführbaren Datei. Hier ist, wie ich das Binary in meinem Fall gestartet habe:

$ ./test_gprof

Sobald der Befehl ausgeführt wird, sehen Sie, dass eine Datei namens gmon.out wird im aktuellen Arbeitsverzeichnis erzeugt.

$ ls gmon*
gmon.out

Es ist diese Datei, die alle Informationen enthält, die das Gprof-Tool benötigt, um menschenlesbare Profildaten zu erzeugen. Verwenden Sie nun das Gprof-Tool wie folgt:

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

Grundsätzlich ist die generische Syntax dieses Befehls:

$ gprof [executable-name] gmon.out > [name-of-file-that-will-contain-profiling-data]

Bevor wir nun die Informationen sehen, die die Datei profile-data.txt enthält, ist es erwähnenswert, dass die menschenlesbare Ausgabe, die Gprof erzeugt, in zwei Teile geteilt ist: Flachprofil und Aufrufdiagramm. Hier ist, was die Man Page von Gprof über Informationen unter diesen beiden Abschnitten sagt:

„Das flache Profil zeigt an, wie viel Zeit Ihr Programm in jeder Funktion verbracht hat und wie oft diese Funktion aufgerufen wurde. Wenn Sie einfach nur wissen wollen, welche Funktionen die meisten Zyklen verbrennen, wird es hier kurz erklärt.“

„Die Aufrufgrafik zeigt für jede Funktion, welche Funktionen sie aufgerufen haben, welche anderen Funktionen sie aufgerufen haben und wie oft. Es gibt auch eine Schätzung, wie viel Zeit in den Unterprogrammen der einzelnen Funktionen verbracht wurde. Dies kann Hinweise darauf geben, wo man versuchen könnte, Funktionsaufrufe zu eliminieren, die viel Zeit in Anspruch nehmen.“

Mit diesen Informationen ausgestattet, sind Sie nun in der Lage, die in Ihrer Profiling-Ausgabedatei (in meinem Fall profile-data.txt) vorhandenen Daten besser zu verstehen. Hier ist das flache Profil in meinem Fall:

Flat profile:

Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
96.43 0.81 0.81 1 810.00 810.00 func3
3.57 0.84 0.03 1 30.00 840.00 func1
0.00 0.84 0.00 1 0.00 810.00 func2
0.00 0.84 0.00 1 0.00 0.00 func4

Und hier ist, was jedes Feld bedeutet:

Weiter geht’s, hier ist das Anrufdiagramm in meinem Fall:

Call graph (explanation follows)

granularity: each sample hit covers 4 byte(s) for 1.19% of 0.84 seconds

index % time self children called name
0.03 0.81 1/1 main [2]
[1] 100.0 0.03 0.81 1 func1 [1]
0.00 0.81 1/1 func2 [3]
———————————————–
<spontaneous>
[2] 100.0 0.00 0.84 main [2]
0.03 0.81 1/1 func1 [1]
0.00 0.00 1/1 func4 [5]
———————————————–
0.00 0.81 1/1 func1 [1]
[3] 96.4 0.00 0.81 1 func2 [3]
0.81 0.00 1/1 func3 [4]
———————————————–
0.81 0.00 1/1 func2 [3]
[4] 96.4 0.81 0.00 1 func3 [4]
———————————————–
0.00 0.00 1/1 main [2]
[5] 0.0 0.00 0.00 1 func4 [5]

Die folgenden Screenshots erklären den Inhalt der Grafik des Informationsaufrufs:

Wenn Sie sich über die Quelle der obigen Screenshots wundern, lassen Sie mich Ihnen sagen, dass all diese Informationen in der Ausgabedatei vorhanden sind, die die Profilinformationen enthält, einschließlich Flat Profile und Call Graph. Falls Sie möchten, dass diese Informationen bei der Ausgabe weggelassen werden, können Sie die von Gprof bereitgestellte Option -b verwenden.

Fazit

Unnötig zu erwähnen, dass wir hier gerade erst die Oberfläche verkratzt haben, da Gprof viele Funktionen bietet (schauen Sie sich einfach seine Man Page an). Was auch immer wir hier behandelt haben, sollte jedoch ausreichen, um Ihnen den Einstieg zu erleichtern. Falls Sie bereits Gprof verwenden und etwas über das Tool mit allen hier teilen möchten, geben Sie einfach einen Kommentar unten ein.

Das könnte Dich auch interessieren …