Befehl "gprof"
Zweck
Zeigt Profildaten für Aufrufgraphen an.
Syntax
/usr/ccs/bin/gprof [ -b ] [ -c [ Dateiname ]] [ -e Name ] [ -E Name ] [ -f Name ] [-g Dateiname ] [-i Dateiname] [-p Dateiname ] [ -F Name ] [ -L PathName ] [ -s ] [ -x [ Dateiname ]] [ -z ] [ a.out [ gmon.out ...]]
Beschreibung
Der Befehl gprof erzeugt ein Ausführungsprofil von C-, FORTRAN- oder COBOL-Programmen. Die Wirkung aufgerufener Routinen wird in das Profil jedes aufrufenden Programms integriert. Mithilfe des Befehls gprof kann ermittelt werden, wie ein Programm die Prozessorressource konsumiert. Um festzustellen, welche Funktionen (Routinen) im Programm den Prozessor verwenden, können Sie mit dem Befehl gprof ein Profil des Programms erstellen.
Die Profildaten werden der Profildatei für Aufrufgraphen (standardmäßig gmon.out) entnommen, die von Programmen erstellt wird, die mit dem Befehl cc unter Verwendung der Option -pg kompiliert wurden. Die Option -pg verlinkt auch Versionen von Bibliotheksroutinen, die für die Profilerstellung kompiliert werden, und liest die Symboltabelle in der benannten Objektdatei (standardmäßig a.out), wobei sie sie mit der Profildatei für Aufrufgraphen korreliert. Wenn mehrere Profildateien angegeben werden, zeigt der Befehl gprof die Summe der Profilinformationen in den angegebenen Profildateien an.
GPROF = profile:<profile-type>,scale:<scaling-factor>,file:<file-type>,filename:<filename>Erläuterungen:- <Profiltyp> beschreibt, welcher Typ von Profilerstellung vorgenommen werden soll. Die gültigen Werte sind "process" und "thread". Der Typ "process" legt als Granularität für die Profilerstellung die Prozessebene fest, der Typ "thread" legt als Granularität für die Profilerstellung die Treadebene fest.
- <Skalierungsfaktor> beschreibt, wie viel Hauptspeicher für das Profil für Aufrufgraphen zugeordnet werden muss. Der Skalierungsfaktor für die Profilerstellung auf Prozessebene ist standardmäßig 2 und für die Profilerstellung auf Threadebene 8. Ein Skalierungsfaktor von 2 zeigt an, dass für jeden Prozess oder Thread die Hälfte der Prozessgröße als Hauptspeicher zugeordnet wird. Ein Skalierungsfaktor von 8 gibt an, dass für jeden Prozess oder Thread ein Achtel der Prozessgröße als Hauptspeicher zugeordnet wird. Dieser Hauptspeicher ist der Pufferbereich zum Speichern der Aufrufgrapheninformationen.
- < file-type> beschreibt, welcher Typ von gmon.out -Datei erforderlich ist. Der Wert multi gibt an, dass eine gmon.out -Datei pro Prozess erforderlich ist. Der Wert 'multithread' gibt an, dass eine gmon.out -Datei pro Thread erforderlich ist. Wenn das Profil einer Anwendung mit der Option -pg erstellt und aus der Anwendung dann ein Unterprozess erstellt wird,
wird bei Angabe des Dateityps multi eine gmon.out-Datei für den übergeordneten Prozess und eine weitere für den untergeordneten Prozess
generiert. Die Namenskonvention für die generierten gmon.out-Dateien ist wie folgt:
- Für den Dateityp "multi": <Präfix>-Prozessname-pid.out
- Für den Dateityp "multithread": <Präfix>-Prozessname-pid-Pthread<Thread-ID>.out
- < Dateiname> beschreibt das Präfix, das für die generierten gmon.out -Dateien verwendet werden muss. Standardmäßig ist das Präfix gmon.
profile:thread erzeugt eine Datei im Format gmon.out, die nur vom AIX® 5.3 gprof gelesen werden kann. Wenn Sie eine gmon.out-Datei im alten Format verwenden und trotzdem provile:thread angeben möchten, müssen Sie
file:multithread angeben. Damit wird pro Thread eine gmon.out-Datei im alten Format generiert. Wenn Ihre Anwendung 2 Threads hat, werden somit unter Verwendung der Namenskonvention zwei gmon.out-Dateien generiert, eine pro Thread. Sie können die Profilerstellung auf Threadebene nicht aktivieren, indem Sie eine Anwendung mit dem Flag -pg in AIX 5.2 oder früher kompilieren und in AIX 5.3ausführen. Zur Aktivierung der Profilerstellung auf Threadebene müssen Sie diese Anwendung mit dem Flag -pg in AIX 5.3 und höherkompilieren.Der Befehl gprof erzeugt drei Elemente:
- Zuerst wird ein unstrukturiertes Profil erzeugt, das dem Profil gleicht, das vom Befehl prof bereitgestellt wird. Diese Auflistung enthält die Gesamtausführungszeiten und Aufrufzahlen für jede Funktion im Programm in absteigender Reihenfolge. Die Zeiten werden dann den Kanten des Aufrufgraphen zugeordnet. Zyklen werden erkannt und es werden Knoten in ihnen aufgerufen, um die Zykluslaufzeiten zu erfassen.
- Eine zweite Auflistung enthält die Funktionen nach Zeit sortiert. Die Zeiten beinhalten die Zeiten der untergeordneten Aufrufgraphen. Unterhalb jedes Funktionseintrags werden die (direkten) untergeordneten Aufrufgraphen mit einem Hinweis dazu, wie deren Zeiten an diese Funktion weitergegeben werden, aufgeführt. Eine ähnliche Anzeige oberhalb der Funktion zeigt, wie die Zeit der Funktion und die Zeiten der untergeordneten Funktionen an die (direkten) übergeordneten Aufrufgraphen weitergegeben werden.
- Es werden auch Zyklen angezeigt, mit einem Eintrag für den Zyklus als Ganzes und einer Auflistung der Zykluselemente deren Beiträgen zu den Zeiten und Aufrufzahlen des Zyklus.
Der Befehl grpof kann auch verwendet werden, um das Ausführungsprofil eines Programms auf einer fernen Maschine zu analysieren. Dazu kann der Befehl gprof mit der Option -c für die Profildatei für Aufrufgraphen (standardmäßig gmon.out) ausgeführt werden, um eine Datei zu generieren (standardmäßig gprof.remote), die dann auf einer fernen Maschine verarbeitet werden kann. Wenn eine andere Profildatei für Aufrufgraphen als die gmon.out-Datei verwendet werden soll, muss der Name der Profildatei für Aufrufgraphen hinter -cDateiname und dem Namen der ausführbaren Datei angegeben werden. Der Parameter Dateiname muss angegeben werden, wenn das Attribut file der Umgebungsvariablen GPROF auf multi gesetzt ist. Es werden mehrere gmon.out-Dateien erstellt, eine gmon.out-Datei für jede PID, wenn das aktive Programm aufgespaltet wird. Die Option -x kann auf der fernen Maschine verwendet werden, um die Datei gprof.remote (standardmäßig) zu verarbeiten, um Profilberichte zu generieren.
Profilerstellung mit den Subroutinen fork und exec
Die Profilerstellung mit dem Befehl gprof ist problematisch, wenn Ihr Programm die Subroutine fork oder exec auf mehreren gleichzeitig ablaufende Prozesse. Die Profilerstellung ist ein Attribut der Umgebung jedes Prozesses. Wenn Sie also ein Profil für einen Prozess erstellen, der einen neuen Prozess erzeugt, wird auch ein Profil für den untergeordneten Prozess erstellt. Beide Prozesse schreiben jedoch eine gmon.out-Datei in das Verzeichnis, in dem Sie den übergeordneten Prozess ausführen, und überschreiben eine davon. Der Befehl tprof wird für die Profilerstellung mit mehreren Prozessen empfohlen. Durch Angabe von file: multi können Sie verhindern, dass die gmon.out-Datei des übergeordneten Prozesses gelöscht wird. file:multi bewirkt, dass die AIX-Namenskonventionen zum Generieren der gmon.out-Dateien verwendet werden. Deshalb haben die gmon.out-Dateien der ungeordneten Prozesse nicht denselben Namen wie der übergeordnete Prozess, wodurch das Überschreiben verhindert wird.
Profilerstellung ohne Quellcode
Wenn Sie keine Quelle für Ihr Programm haben, können Sie ein Profil mit dem Befehl gprof erstellen, ohne das Programm neu kompilieren zu müssen. Sie müssen jedoch in der Lage sein, Ihre Programmmodule mit dem entsprechenden Compilerbefehl (z. B. cc für C) neu zu verlinken. Wenn Sie das Programm nicht neu kompilieren, erhalten Sie keine Aufrufhäufigkeitszähler, obwohl das unstrukturierte Profil auch ohne diese weiterhin hilfreich ist. Ein weiterer Vorteil ist der, dass Ihr Programm fast so schnell wie gewöhnlich ausgeführt wird. Das folgende Beispiel veranschaulicht, wie ein Profil erstellt wird:
cc -c dhry.c # Create dhry.o without call counting code.
cc -pg dhry.o -L/lib -L/usr/lib -o dhryfast
# Re-link (and avoid -pg libraries).
dhryfast # Create gmon.out without call counts.
gprof >dhryfast.out # You get an error message about no call counts
# -- ignore it.Ein Ergebnis der Ausführung ohne Anrufzähler ist, dass einige schnell ausführende Funktionen (von denen Sie wissen, dass sie aufgerufen werden mussten) nicht in der Liste erscheinen. Dieses Ergebnis ist zwar nicht intuitiv, aber für den Befehl gprof normal. Der Befehl gprof listet nur Funktionen auf, die mindestens einmal aufgerufen wurden oder die mindestens einen Zeitschritt registriert haben. Schnell ausführende Funktionen erhalten häufig keine Zeitschritte, auch wenn sie ausgeführt wurden. Da die Aufrufzählung ausgesetzt wurde, werden diese kleinen Funktionen überhaupt nicht aufgelistet. (Sie können Aufrufzähler für die Laufzeitroutinen abrufen, indem Sie die Option -L in der Befehlszeile cc -pg weglassen.)
Weniger Realspeicher verwenden
Die Profilerstellung mit dem Befehl gprof kann dazu führen, dass Programme übermäßig viele Seiten auslagern, weil die Option -pg Pufferbereich aus dem fixierten Realspeicher dediziert, dessen Größe der Hälfte der Größe Ihres Programmtexts entspricht. Übermäßiges Paging hat keine Auswirkung auf die Daten, die bei der Profilerstellung generiert werden, weil Programme mit Profilen keine Zeitschritte generieren, wenn Sie auf Eingaben/Ausgaben warten, sondern nur, wenn sie den Prozessor verwenden. Wenn die durch übermäßige Auslagerung verursachte Zeitverzögerung nicht akzeptabel ist, wird die Verwendung des Befehlstprof empfohlen.
Flags
| Element | Beschreibung |
|---|---|
| -b | Unterdrückt die Ausgabe einer Beschreibung jedes Felds im Profil. |
| -c Dateiname | Erstellt eine Datei, die die Informationen enthält, die für die Fernverarbeitung von Profilinformationen benötigt werden. Verwenden Sie das Flag -c nicht in Kombination mit anderen Flags. |
| -E Name | Unterdrückt das Drucken des Diagrammprofileintrags für die Routine Name und ihre Nachkommen, ähnlich wie das Flag -e, schließt aber die Zeit, die von der Routine Name und ihren Nachkommen verbraucht wird, von den Berechnungen der Gesamtzeit und des Prozentsatzes aus.(-E MonitorCount -E MonitorCleanup ist die Voreinstellung) |
| -e Name | Unterdrückt die Ausgabe des Graphenprofileintrags für die Routine Name und alle ihre untergeordneten Routinen (sofern sie keine anderen übergeordneten Routinen haen, die nicht unterdrückt werden). Es können mehrere Flags -e angegeben werden. Mit jedem Flag -e kann nur eine einzige Routine angegeben werden. |
| -F Name | Gibt den Graphenprofileintrag der Routine Name und ihren untergeordneten Routinen aus. Dieses Flag gleicht dem Flag -f, verwendet aber nur die Zeiten der ausgegebenen Routinen für die Berechnung der Gesamtzeit und der prozentualen Zeit. Es können mehrere Flags -f angegeben werden. Mit jedem Flag -f kann nur eine einzige Routine angegeben werden. Das Flag -F überschreibt das Flag -E. |
| -f Name | Gibt den Graphenprofileintrag der angegebenen Routine Name und ihren untergeordneten Routinen aus. Es können mehrere Flags -f angegeben werden. Mit jedem Flag -f kann nur eine einzige Routine angegeben werden. |
| -g Dateiname | Schreibt Aufrufgrapheninformationen in die für Dateiname angegebene Ausgabedatei. Außerdem werden die Profilinformationen unterdrückt, sofern das Flag -p nicht verwendet wird. |
| -i Dateiname | Schreibt die Routinenindextabelle in die für Dateiname angegebene Ausgabedatei. Wenn dieses Flag nicht verwendet wird, wird die Indextabelle entweder am Ende der Standardausgabe oder am Ende der mit den Flags -p und -g angegebenen Datei ausgegeben. |
| -L PathName | Verwendet einen alternativen Pfadnamen zum Auffinden gemeinsam genutzter Objekte. |
| -p Dateiname | Schreibt unstrukturierte Profilinformationen in die angegebene Ausgabedatei. Außerdem werden die Anrufgrapheninformationen unterdrückt, sofern das Flag -g nicht verwendet wird. |
| -s | Erzeugt die Profildatei gmon.sum, die die Summe der Profilinformationen in allen angegebenen Profildateien darstellt. Diese zusammenfassende Profildatei kann in nachfolgenden Ausführungen des Befehls gprof (mit dem Flag -s) übergeben werden, um Profildaten über mehrere Durchläufe einer Datei a.out hinweg zu sammeln. |
| -x Dateiname | Ruft Informationen aus der für Dateiname angegebenen Datei ab (einer Datei, die mit der Option -c erstellt wird), um Profilberichte zu generieren. Wenn Sie den Parameter Dateiname nicht angeben, sucht der Befehl gprof die Standarddatei gprof.remote. |
| -z | Zeigt Routinen an, die keine Nutzung aufweisen (gemäß Aufrufzähler und kumulierter Zeit). |
Beispiele
- Geben Sie den folgenden Befehl ein, um eine Profilausgabe abzurufen:
gprof - Geben Sie den folgenden Befehl ein, um eine Profilausgabe für einen Befehl abzurufen, der zuvor ausgeführt und ggf. verschoben wurde:
In diesem Beispiel wird die Datei runfile.gmon für Beispieldaten und die Datei runfile für lokale Symbole und überprüft die Datei /u/score/lib auf ladbare Objekte.gprof -L/home/score/lib runfile runfile.gmon - Gehen Sie wie folgt vor, um ein Profil für das Beispielprogramm dhry.c zu erstellen:
- Kompilieren Sie das Anwendungsprogramm mit dem Befehl cc -pg wie folgt neu:
cc -pg dhry.c -o dhry # Re-compile to produce gprof output. - Führen Sie das neu kompilierte Programm aus. Eine Datei mit dem Namengmon.outwird im aktuellen Arbeitsverzeichnis erstellt (nicht im Verzeichnis, in dem sich die ausführbare Programmdatei befindet).
dhry # Execute program to generate ./gmon.out file. - Führen Sie den Befehl gprof in dem Verzeichnis mit demgmon.outDatei, um das Aufrufdiagramm und unstrukturierte Profilberichte zu erstellen.
gprof >gprof.out # Name the report whatever you like vi gprof.out # Read flat profile first. - Geben Sie den folgenden Befehl ein, um ein Profil mit Granularität auf Threadebene zu generieren, die Umgebungsvariable
GPROF wie folgt zu exportieren und die Anwendung auszuführen:
export GPROF=profile:thread dhry # Execute program to generate ./gmon.out file which has thread level granularity - Geben Sie den folgenden Befehl ein, um prozesspezifische Dateien gmon.out mit dem Präfix
mygmonzu generieren:export GPROF=file:multi,filename:mygom dhry # Execute program to generate ./gmon-dhry-2468.out - Geben Sie den folgenden Befehl ein, um threadspezifische Dateien gmon.out mit dem Skalierungsfaktor 10 und dem Präfix
tgmonzu generieren:export GPROF=profile:thread,file:multithread,scale:10,filename:tgmon dhry # Execute program to generate ./tgmon-dhry-2468-Pthread215.out - Geben Sie den folgenden Befehl ein, um nur den unstrukturierten Profilbericht aus
gmon-dhry-2468.outanzuzeigen:gprof -p fprofile.out ./dhry ./gmon-dhry-2468.out - Geben Sie den folgenden Befehl ein, um nur den Profilbericht für Aufrufgraphen aus
gmon-dhry-2468.outanzuzeigen:gprof -g callgraph.out ./dhry ./gmon-dhry-2468.out
- Kompilieren Sie das Anwendungsprogramm mit dem Befehl cc -pg wie folgt neu:
- Gehen Sie zur Verwendung des Fernverarbeitungsfeatures des Befehls gprof wie folgt vor:
- Kompilieren Sie das Anwendungsprogramm mit dem Befehl cc -pg neu:
cc -pg thread.c -o thread -lpthread - Aktivieren Sie Profilerstellung mit Granularität auf Threadebene und verwenden Sie einen anderen Namen für gmon.out:
export GPROF=profile:thread,filename:mygmon - Führen Sie das neu kompilierte Programm aus. Es wird eine Datei mit dem Namen mygmon.out
im aktuellen Arbeitsverzeichnis erstellt (nicht in dem Verzeichnis, in dem sich die ausführbare Programmdatei befindet):
thread # Execute program to generate mygmon.out file. - Verwenden Sie das Flag -c, um die Datei my.remote zu generieren, die dann zur Verarbeitung an eine ferne Maschine übergeben werden kann:
gprof -c my.remote thread mygmon.out - Verwenden Sie auf einer fernen Maschine das Flag -x-, um Informationen aus der Datei my.remote zu extrahieren:
gprof -x my.remote
- Kompilieren Sie das Anwendungsprogramm mit dem Befehl cc -pg neu:
In dieser Beschreibung des Befehls gprof wird in in den meisten Beispielen das C-Programm dhry.c verwendet. Die Erläuterungen und Beispiele gelten jedoch gleichermaßen für FORTRAN- und COBOL-Module. Sie müssen lediglich anstelle des C-Compilers cc den entsprechenden Compilernamen und anstelle des Worts Funktion das Wort Subroutine verwenden. Die folgenden Befehle zeigen beispielsweise, wie ein Profil für ein FORTRAN-Programm mit dem Namenmatrix.f:
xlf -pg matrix.f -o matrix # FORTRAN compile of matrix.f program
matrix # Execute with gprof profiling,
# generating gmon.out file
gprof > matrix.out # Generate profile reports in
# matrix.out from gmon.out
vi matrix.out # Read flat profile first.Dateien
| Element | Beschreibung |
|---|---|
| a.out | Namensliste und Textbereich |
| gmon.out | Dynamischer Aufrufgraph und Profil |
| gmon.sum | Zusammengefasster dynamischer Aurufgraph und Profil |
| gprof.remote | Datei für ferne Profilerstellung |
| /usr/ucb/gprof | Enthält den Befehl gprof. |
| /usr/ccs/bin/gprof | Enthält den Befehl gprof. |