sprof(1) General Commands Manual sprof(1)

sprof - Daten der Laufzeitbibliothek lesen und anzeigen

ÜBERSICHT

sprof [Option]… Laufzeitbibliothekpfad [Profilierungsdatenpfad]

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.

Die folgenden Befehlszeilenoptionen geben an, welche Profilierungsausgabe erstellt werden soll:

Gibt eine Liste von Paaren von Aufrufpfaden für die durch die Laufzeitbibliothek exportierten Schnittstellen aus, zusammen mit der Anzahl der Verwendungen jedes Pfades.
Erstellt ein flaches Profil aller Funktionen in dem überwachten Objekt, mit Zählern und Ticks.
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:

-?
Zeigt eine Zusammenfassung der Befehlszeilenoptionen und -argumente und beendet das Programm.
Zeigt eine kurze Gebrauchsinformation und beendet sich.
Zeigt die Programmversion an und beendet das Programm.

GNU.

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

gprof(1), ldd(1), ld.so(8)

Ü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.

15. Juni 2024 Linux man-pages 6.9.1