table of contents
sprof(1) | General Commands Manual | sprof(1) |
BEZEICHNUNG¶
sprof - Daten der Laufzeitbibliothek lesen und anzeigen
ÜBERSICHT¶
sprof [Option]… Laufzeitbibliothekpfad [Profilierungsdatenpfad]
BESCHREIBUNG¶
Der Befehl sprof zeigt die Profilierungszusammenfassung für die als erstes Befehlszeilenargument angegebene Laufzeitbibliothek an. Die Profilierungszusammenfassung wird aus vorab erstellten Profilierungsdaten in dem (optionalen) zweiten Befehlszeilenargument erzeugt. Falls der Profilierungsdatenpfad nicht angegeben wird, dann wird sprof versuchen, ihn mittels des Sonamens der Laufzeitbibliothek abzuleiten, indem es nach einer Datei mit dem Namen <Soname>.profile im aktuellen Verzeichnis sucht.
OPTIONEN¶
Die folgenden Befehlszeilenoptionen geben an, welche Profilierungsausgabe erstellt werden soll:
- --call-pairs
- -c
- Gibt eine Liste von Paaren von Aufrufpfaden für die durch die Laufzeitbibliothek exportierten Schnittstellen aus, zusammen mit der Anzahl der Verwendungen jedes Pfades.
- --flat-profile
- -p
- Erstellt ein flaches Profil aller Funktionen in dem überwachten Objekt, mit Zählern und Ticks.
- --graph
- -q
- Erstellt einen Aufrufgraphen.
Falls keine der obigen Optionen angegeben ist, dann ist das Standardverhalten die Anzeige eines flachen Profils und eines Aufrufgraphen.
Die folgenden zusätzlichen Befehlszeilenoptionen sind verfügbar:
STANDARDS¶
GNU.
BEISPIELE¶
Das folgende Beispiel zeigt die Verwendung von sprof. Das Beispiel besteht aus einem Hauptprogramm, das zwei Funktionen in einer Laufzeitbibliothek aufruft. Zuerst der Code des Hauptprogramms:
$ cat prog.c #include <stdlib.h> void x1(void); void x2(void); int main(int argc, char *argv[]) {
x1();
x2();
exit(EXIT_SUCCESS); }
Die Funktionen x1() und x2() sind in der folgenden Quelldatei definiert, die zur Erstellung der Laufzeitbibliothek verwandt wird:
$ cat libdemo.c #include <unistd.h> void consumeCpu1(int lim) {
for (unsigned int j = 0; j < lim; j++) getppid(); } void x1(void) {
for (unsigned int j = 0; j < 100; j++) consumeCpu1(200000); } void consumeCpu2(int lim) {
for (unsigned int j = 0; j < lim; j++) getppid(); } void x2(void) {
for (unsigned int j = 0; j < 1000; j++) consumeCpu2(10000); }
Jetzt wird die Laufzeitbibliothek mit dem echten Namen libdemo.so.1.0.1 und dem Sonamen libdemo.so.1 erstellt:
$ cc -g -fPIC -shared -Wl,-soname,libdemo.so.1 \
-o libdemo.so.1.0.1 libdemo.c
Dann werden symbolische Links für die Bibliothek-Sonamen und den Bibliothek-Linkernamen konstruiert:
$ ln -sf libdemo.so.1.0.1 libdemo.so.1 $ ln -sf libdemo.so.1 libdemo.so
Dann wird das Hauptprogramm kompiliert, gegen die Laufzeitbibliothek gelinkt und dann die dynamischen Abhängigkeiten des Programms aufgelistet:
$ cc -g -o prog prog.c -L. -ldemo $ ldd prog linux-vdso.so.1 => (0x00007fff86d66000) libdemo.so.1 => not found libc.so.6 => /lib64/libc.so.6 (0x00007fd4dc138000) /lib64/ld-linux-x86-64.so.2 (0x00007fd4dc51f000)
Um die Profilierungsinformationen für die Laufzeitbibliothek zu erhalten, wird die Umgebungsvariable LD_PROFILE mit dem Sonamen der Bibliothek definiert:
$ export LD_PROFILE=libdemo.so.1
Dann wird die Umgebungsvariable LD_PROFILE_OUTPUT mit dem Pfadnamen des Verzeichnisses, in dem die Profilierungsausgabe geschrieben werden soll, definiert und das Verzeichnis erstellt, falls es nicht bereits existiert:
$ export LD_PROFILE_OUTPUT=$(pwd)/prof_data $ mkdir -p $LD_PROFILE_OUTPUT
LD_PROFILE führt dazu, dass die Profilierungsausgabe an die Ausgabedatei angehängt wird, falls diese bereits existiert, daher wird jetzt sichergestellt, dass noch keine Profilierungsdaten existieren:
$ rm -f $LD_PROFILE_OUTPUT/$LD_PROFILE.profile
Dann wird das Programm ausgeführt, um die Profilierungsausgabe zu erstellen, die dann in die Datei in dem in LD_PROFILE_OUTPUT festgelegten Verzeichnis geschrieben wird:
$ LD_LIBRARY_PATH=. ./prog $ ls prof_data libdemo.so.1.profile
Anschließend wird die Option sprof -p verwandt, um ein flaches Profil mit Zählern und Ticks zu erstellen:
$ sprof -p libdemo.so.1 $LD_PROFILE_OUTPUT/libdemo.so.1.profile Flat profile: Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls us/call us/call name
60.00 0.06 0.06 100 600.00 consumeCpu1
40.00 0.10 0.04 1000 40.00 consumeCpu2
0.00 0.10 0.00 1 0.00 x1
0.00 0.10 0.00 1 0.00 x2
Die Option sprof -q erstellt einen Aufrufgraphen:
$ sprof -q libdemo.so.1 $LD_PROFILE_OUTPUT/libdemo.so.1.profile index % time self children called name
0.00 0.00 100/100 x1 [1] [0] 100.0 0.00 0.00 100 consumeCpu1 [0] -----------------------------------------------
0.00 0.00 1/1 <UNKNOWN> [1] 0.0 0.00 0.00 1 x1 [1]
0.00 0.00 100/100 consumeCpu1 [0] -----------------------------------------------
0.00 0.00 1000/1000 x2 [3] [2] 0.0 0.00 0.00 1000 consumeCpu2 [2] -----------------------------------------------
0.00 0.00 1/1 <UNKNOWN> [3] 0.0 0.00 0.00 1 x2 [3]
0.00 0.00 1000/1000 consumeCpu2 [2] -----------------------------------------------
Oberhalb und unterhalb der Zeichenketten »<UNKNOWN> werden Kennzeichner dargestellt, die außerhalb der profilierten Bibliothek sind (in diesem Beispiel sind es Instanzen von main()).
Die Option sprof -c erstellt eine Liste der Aufrufpaare und ihrer Auftrittsanzahl.
$ sprof -c libdemo.so.1 $LD_PROFILE_OUTPUT/libdemo.so.1.profile <UNKNOWN> x1 1 x1 consumeCpu1 100 <UNKNOWN> x2 1 x2 consumeCpu2 1000
SIEHE AUCH¶
ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer.
2. Mai 2024 | Linux man-pages (unveröffentlicht) |