logo http://www.gnu.org/manual/gprof-2.9.1/gprof.html

gprof

Autor: Gerrit Bruchhäuser

Quellenverzeichnis:

Online Manual

Einleitung
Benutzen von gprof
Symspecs
Beispiel


Einleitung

Profileing bietet eine recht einfache Möglichkeit, aus einem Programm zu lernen. Eine der wichtigsten Errungenschaften ist das leichte feststellen, welche Funktionen in einem Programm besonders häufig aufgerufen werden. Mit diesem Wissen kann man dann das Laufzeitverhalten seines Programms ziemlich einfach verbessern, indem man zum Beispiel die am häufigsten aufgerufene Funktion in Assembler neu schreibt oder diese einfach nur noch einmal strukturell überarbeitet.

Da gprof seine Informationen während der laufzeit des Programmes bezieht, ist besonders der Funktionfluss aus komplexeren Programmen (bei welchen eine Quelltextanalyse zu Zeitaufwendig ist) recht gut ersichtlich. Wichtig: Anweisungen die nicht aussgeführt werden, werden beim profile auch nicht mit aufgeführt.

Benutzen von gprof

Um sein Programm mit gprof zu testen, muss man es mit der Compileroption -pg übersetzen. Startet man es nun, wird standardmässig eine sogenante profiling Datei mit dem Namen gmon.out erstellt. Diese Datei enthällt dann alle vom Programmlauf erfassten informationen, welche anschliessend mit gprof proc gmon.out lesbar gemacht werden können.

Die -pg Option funktioniert gut bei den folgenden Aufrufen:

cc -g -c myprog.c utils.c -pg
cc -o myprog myprog.o utils.o -pg

Wenn man allerdings getrennt vom compiler den Linker aufruft, so muss man zusätzlich die profiling start Datei /lib/gcrt0.o anstatt crt0.o mit angeben. Ausserdem empfiehlt es sich die Standart C Bibliothek durch die Standart profiling C Bibliothek c_p ausszutauschen. Das bewirkt dann, dass profile informationen von standard Funktionen mit aussgegeben werden können.

ld -o myprog /lib/gcrt0.o myprog.o utils.o -lc_p

Übersetzt man nur Teile des programms mit der -pg Option, so ist es natürlich auch nur möglich von diesen Teilen profiling informationen zu gewinnen.

Die -g und -a Compiler optionen verbessern unter umständen die profiling ausgaben, weshalb diese beim Erstellen eines profiles gegebenfalls mit berüksichtigt werden sollten. (es können bei angabe der beiden Optionen auch Zeitwerte von Bedingungen und Schleifen ermittelt werden)

Ist das Programm einmal übersetzt, muss es gestartet werden, um die informationen für gprof zu erstellen. Das Programm wird dabei die gleichen Aussgaben wie sonnst auch machen, allerdings ein wenig langsamer ablaufen. Beim beenden, schreibt es ausserdem zusätzlich die berreits erwähnte profiling Datei mit dem Namen gmon.out. Existiert diese Datei berreits, wird diese ohne zu zögern überschrieben werden. Bis jetzt gibt es noch keine möglichkeit, gprof oder dem compiler mit zu teilen, die Ausgabedatei nicht zu überschreiben.

Die profiling Datei wird in das aktuelle Arbeitsverzeichnis vor dem Beenden des Programms geschrieben. Wechselt also zum Beispiel das Programm mittels chdir das Verzeichnis, so befindet sich die gmon.out Datei eventuell nicht im start Verzeichnis des Programms, sondern dort wo sich das Programm zuletzt befand.

Es ist wichtig zu wissen, das die Art und Weise, wie man das Programm startet, also mit welchen Parametern oder mit welchen Daten, die Aussgabe des Graphen dramatisch durch den veränderten funktionsfluss beeinflussen kann.

Syntax

Nachdem man die Datendatei gmon.out erstellt hat, kann man gprof dazu verwenden diese Datei zu interpretieren. gprof wird dabei eine ganze menge Informationen, welche auch als funktions Graphen bezeichnet werden, auf die standart Ausgabe schreiben. Typischerweise wird man die Ausgabe allerdings in eine Datei mittels '>' umleiten wollen.

gprof [options] [ausführbare-datei [profiling-dateien...]] [> outfile]

Wird kein ausführbares Programm angegeben, so wird die Datei a.out angenommen. Das gleiche gild bei einer fehlenden profiling Datei. Dort wird als standart gmon.out gesetzt.

Es ist auch möglich mehrere profiling Dateien anzugeben, was dann zu einer Summierung der einzelnen Zeitwerte führt.

Ausgabe optionen

-A --annotated-source -b --brief -C --exec-counts -i --file-info -I --directory-path=dirs -J --no-annotated-source -L --print-path -p --flat-profile -P --no-flat-profile -g --graph -Q --no-graph -Y --separate-files -Z --no-exec-counts --function-ordering --file-ordering -T --traditional -w --width -x --all-lines --demagle --no-demangle

Analyse optionen

-a --no-static -c --static-call-graph --ignore-non-functions -k -l --line -m --min-count -n --times -N --no-times

Ausgabe optionen

Um geziehlt auf die Ausgabe von gprof einwirken zu können stehen die folgenden Kommandopzeilen Optionen zur verfügung.

-A[symspec]
--annotated-source[=symspec]
Veranlasst gprof dazu nur angemerkte (annotated) Funktionen auszugeben. Wenn eine symspec mit angegeben ist, werden nur die Funktionen welche zu der specifikation passen, angezeigt.
-b
--brief
Wenn diese Option angegeben ist, wird gprof keine erklärende Ausgabebeschreibung mit ausgeben. Das ist ziemlich nützlich wenn man die Ausgabe zum Beispiel in Scripten weiterverarbeiten möchte oder man einfach schon ziemlich genervt von der Beschreibung ist.
-C[symspec]
--exec-counts[=symspec]
Mit dieser Option gibt gprof die Anzahl aller Funktionen und ihre Aufruf häfigkeit mit aus. Wenn symspec mit angegeben wird, werden die Ausgaben passend zu dieser Option auf die dort enthaltene specifikation abgebildet. Wenn die Datei, für welche das profile angelegt werden soll, basis-block Datensätznummern enthällt, k&oml;nnen diese zusammen mit der -l gezählt und ausgegeben werden.
-i
--file-info
Diese Optionen veranlassen gprof eine Zusammenfassung der angebebenen Dateien auszugeben und sich dann zu beenden. Es wird eine zusammengefasste Version vom Histogram, Aufruf Graphen, und die basic-block count records, mit ausgegeben.
-I dirs
--directory-path=dirs
Hiermit kann man eine Liste von Verzeichnissen angeben, die gprof dann zum auffinden von Sourcen benutzt. Man kann alternativ auch die Umgebungsvariable GPROF_PATH zum Abbilden dieser Funktionalität benutzen. Diese Option wird oft zusammen mit --annotated-source verwendet.
-J[symspec]
--no-annotated-source[=symspec]
Hiermit kann man angemerkte Sourcen ausschliessen. Ist eine symspec angegeben, werden nur die auf diese abbildbaren Berreiche, ausgeschlossen.
-L
--print-path
Normalerweise werden Dateinamen mit einer unterdrückten Pfad angabe ausgegeben. Mit dieser Option kann man nun gprof anweisen den Pfad aus den debug informationen in den Sourcen zu entnehmen und relativ zum Aktuellen Pfad mit auszugeben.
-p[symspec]
--flat-profile[=symspec]
Veranlasst gprof ein einfaches (flaches) profile zu erstellen. Is symspec angegeben, so wird das einfache Profile nur auf diese dort angegebenen Teile übertragen.
-P[symspec]
--no-flat-profile[=symspec]
Unterdrückt die Ausgabe eines einfachen profiles, wobei man mit der Angabe von symspec Funktionen hiervon ausschliessen kann.
-g[symspec]
--graph[=symspec]
Hiermit kann man gprof anweisen einen funktions Graphen zu zeichnen. Mit symspec kann man diesen auf bestimmte Funktionen begrenzen.
-Q[symspec]
--no-graph[=symspec]
Weist gprof an den funktions Graphen zu unterdrücken. Mit symspec kann man diese Option auf bestimmte Funktionen begrenzen.
-Y
--separate-files
Diese Option wirkt sich nur auf angemerkte Sourcen aus. Normalerweise gibt gprof angemerkte Sourcen auf die std. Ausgabe aus. Wenn diese Option angegeben ist, werden die angemerkten Sourcen in eine Datei mit dem Namen Dateiname-ann ausgegeben.
-Z[symspec]
--no-exec-counts[=symspec]
Unterdrückt die Ausgabe einer Summierung aller Funktionen und deren Aufruf häufigkeit. Ist symspec angegeben, so wird diese Option auf die dort angegebenen patterns abgebildet.
--function-ordering
Die '--function-ordering' Option weist gprof an Funktionene basierend auf den profiling informationen zu sortieren.
--file-ordering map_file
Diese Option ortnet die Ausgabe nach Dateinamen. Das angegebene map_file ist eine Datei welche funktionsnamen auf Dateinamen abbildet. Das Format dieser Datei ist an das Format vom nm kommando angelehnt. Es wird empfohlen die -a Option mit anzugeben.
c-parse.o:00000000 T yyparse
c-parse.o:00000004 C yyerrflag
c-lang.o:00000000 T maybe_objc_method_name
c-lang.o:00000000 T print_lang_statistics
c-lang.o:00000000 T recognize_objc_keyword
c-decl.o:00000000 T print_lang_identifier
c-decl.o:00000000 T print_lang_type
-T
--traditional
Weist gprof an, seine Ausgabe dem traditionellem BSD style anzupassen.
-w width
--width=width
Setzt die Weite der Ausgabezeilen auf den angegeben Wert. Diese Einstellung wird im Moment allerdings nur bei der Ausgabe des Funktionsindexes im unterem aufruf Graphen ausgewertet.
-x
--all-lines
Diese Option wirkt sich nur auf vermerkte Quelltext ausgaben aus. Normalerweise werden nur die Zeilen welche am Beginn eines Basisblockes stehen vermerkt. Wenn nun diese Option benutzt wird, wird jede Zeile in einem Basisblock vermerkt. Dieses Verhalten ist also gleich der -a Option.
--demagle
--no-demangle
Diese Option kontrolliert ob C++ Symbol namen bei der Ausgabe berücksichtigt werden sollen. Standartmässig ist diese Option eingeschaltet.

Analyse optionen

-a
--no-static
Unterdrückt als static declarierte (also modul private) Funktionen. Die Zeiten für diese Funktionen werden dann der aufrufenden Funktion beigerechnet.
-c
--static-call-graph
Diese Option weist den Aufrufgraphen an, den Object text Berreich durch befragen des Maschienen codes zu vergrössern, was einen vermutlich genaueren Funktionsfluss bewirkt. Normalerweise erkennt der Aufrufgraph nur solche Funktionen, welche auch wirklich aufgerufen wurden. Mit dieser Option zeigt er aber auch solche Funktionen an, welche aufgerufen sein könnten, obwohl diese Funktionen nicht mit profiling informationen übersetzt wurden. Funktionen, welche allerdings nicht mit Symbol informationen übersetzt wurden, werden auch mit dieser Option nicht erkannt werden.
-D
--ignore-non-functions
Erzwinkt das Ignorieren von Symbolen welche nicht gezwugenermassen Funktionen zugeordnet werden können. Diese Option bewirkt dann also ein lesbareres profile, wenn diese Option vom Betriebsystem unterstützt wird (z.B. auf Solaris oder HPUX)
-k from/to
Erlaubt das löschen von jeglichen argc auf dem Aufrufgraphen welche der symspec zugeordnet werden können.
-l
--line
Diese Option schaltet das Zeile für Zeile profiling ein. Dadurch ist es z.B. möglich das gprof für jede Zeile code ausgibt, wie oft diese aufgerufen wurde. Ist diese Option eingeschaltet, so braucht gprof allerdings mehr Zeit um die Analyse zu erstellen.
-m num
--min-count=num
Hiermit kann man die Ausgabe von Funktionen welche weniger als num mal aufgerufen wurden unterdrücken.
-n[symspec]
--time[=symspec]
Weist gprof an nur die Funktionen im Aufrufgraphen zu berücksichtigen welche zu der symspec passen.
-N[symspec]
--no-times=[symspec]
Weist gprof an nur die Funktionen im Aufrufgraphen zu berücksichtigen welche nicht zu der symspec passen.
-z
--display-unused-functions
Wenn diese Option eingeschaltet ist, wird gprof auch Funktionen anzeigen, welche nicht aufgerufen wurden. Diese Option macht besonders mit der -c Option sinn, da man dadurch sehen kann, welche Funktionen niemals aufgerufen werden.

Symspecs

Viele Optionen erlauben das ein- oder ausschliessen von Funktionen mittels einer symspec. Die Syntax ist dabei wie folgt declariert:

filename_containing_a_dot
| funcname_not_containing_a_dot
| linenumber
| ( [ any_filename ] `:' ( any_funcname | linenumber ) )

Hier ein paar Beispiel symspecs:

main.c
Markiert alles in der Datei main.c. Der Punkt in der symspec besagt, das es sich um einen Dateinamen handelt. Wenn man einen Dateinamen hat, der blöderweise keinen Punkt beinhaltet, so kann man am Ende des Namens einen normalerweise unüblichen ":" anhängen. Die Zeichenkette "odd:" wird zum Beispiel als Dateiname "odd" interpretiert.
main
Markiert alle Funktionen mit dem Namen main. Es ist zu beachten das es die Funktion mehrmals, zum Beispiel als static declariert, geben kann.
main.c:main
Markiert die Funktion main in der main.c Datei.
main.c:134
Markiert Zeile 134 in der Datei main.c

Beispiel

Nehmen wir einmal folgendes C programm an:

#include <stdio.h>
#include <stdlib.h>
 
void func(int y)
{	int i;
	for (i=0; i<y; i++) {
		func(i);
	}
}
  

int main(int argc, char **argv)
{	int i;
	for (i=0; i<10; i++) {
		func(i);
	}

	return(0);
}

Auch wenn der Sinn dieses Programms dahingestellt sein mag, ist es doch recht gut zum veranschaulichen von gprof geeignet.

Übersetzen wir es einmal und benutzen zusätzlich die vorhin erwähnte -gp Option beim compiler aufruf.

cc -pg -g -o myproc myprog.c

Das Programm sollte nun nach einem start die profileing Datei gmon.out erstellt haben, welche man mit gprof -b myproc auswerten kann.

$: gprof -b myproc
Flat profile:

Each sample counts as 0.01 seconds.
 no time accumulated

  %   cumulative   self              self     total
 time   seconds   seconds    calls  Ts/call  Ts/call  name
  0.00      0.00     0.00       10     0.00     0.00  func


			Call graph


granularity: each sample hit covers 4 byte(s) no time propagated

index % time    self  children    called     name
                                  1013       func [1]
                0.00    0.00      10/10      main [14]
[1]      0.0    0.00    0.00      10+1013    func [1]
                                  1013       func [1]
-----------------------------------------------

Index by function name

[1] func

Sehr schön kann man hier sehen, wie häfig die Funktion func insgesammt von welcher Funktion (also von der main oder von sich selbst) aufgerufen worden ist.

Copyright (c) 2001-2002 by: Gerrit Bruchhäuser