sprof(1) General Commands Manual sprof(1)

sprof - citește și afișează datele de profilare a obiectelor partajate

sprof [opțiune]... rută-obiect-partajat [rută-date-profilare]

Comanda sprof afișează un rezumat al profilării pentru obiectul partajat (biblioteca partajată) specificat ca prim argument al liniei de comandă. Rezumatul de profilare este creat folosind datele de profilare generate anterior în cel de-al doilea argument (opțional) din linia de comandă. În cazul în care se omite ruta datelor de profilare, atunci sprof va încerca să le deducă folosind numele de fiu al obiectului partajat, căutând un fișier cu numele <soname>.profile în directorul curent.

Următoarele opțiuni ale liniei de comandă specifică rezultatul profilului care urmează să fie produs:

Afișează o listă de perechi de rute de apelare pentru interfețele exportate de obiectul partajat, împreună cu numărul de ori de câte ori este utilizată fiecare rută.
Generează un profil plat al tuturor funcțiilor din obiectul monitorizat, cu numărători și ticuri.
Generează graficul de apeluri.

Dacă nu se specifică niciuna dintre opțiunile de mai sus, atunci comportamentul implicit este de a afișa un profil plat și un grafic al apelurilor.

Sunt disponibile următoarele opțiuni suplimentare pentru linia de comandă:

-?
Afișează un rezumat al opțiunilor disponibile în linia de comandă și iese.
Afișează un scurt mesaj de utilizare și iese.
Afișează versiunea programului și iese.

GNU.

Următorul exemplu demonstrează utilizarea sprof. Exemplul constă într-un program principal care apelează două funcții dintr-un obiect partajat. Mai întâi, codul programului principal:


$ cat prog.c
#include <stdlib.h>
void x1(void);
void x2(void);
int
main(int argc, char *argv[])
{
    x1();
    x2();
    exit(EXIT_SUCCESS);
}

Funcțiile x1() și x2() sunt definite în următorul fișier sursă care este utilizat pentru a construi obiectul partajat:


$ 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);
}

Acum construim obiectul partajat cu numele real libdemo.so.1.1.0.1 și cu numele de fiu libdemo.so.1:


$ cc -g -fPIC -shared -Wl,-soname,libdemo.so.1 \
        -o libdemo.so.1.0.1 libdemo.c

Apoi, construim legături simbolice pentru numele fiului bibliotecii și pentru numele editorului de legături al bibliotecii:


$ ln -sf libdemo.so.1.0.1 libdemo.so.1
$ ln -sf libdemo.so.1 libdemo.so

În continuare, compilăm programul principal, legându-l de obiectul partajat și apoi enumerăm dependențele dinamice ale programului:


$ 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)

Pentru a obține informații de profilare pentru obiectul partajat, definim variabila de mediu LD_PROFILE cu numele de fiu al bibliotecii:


$ export LD_PROFILE=libdemo.so.1

Apoi definim variabila de mediu LD_PROFILE_OUTPUT cu numele de rută al directorului în care ar trebui să fie scrisă ieșirea profilului și creăm acel director dacă nu există deja:


$ export LD_PROFILE_OUTPUT=$(pwd)/prof_data
$ mkdir -p $LD_PROFILE_OUTPUT

LD_PROFILE determină ca ieșirea de profilare să fie adăugată la fișierul de ieșire dacă acesta există deja, astfel încât să ne asigurăm că nu există date de profilare preexistente:


$ rm -f $LD_PROFILE_OUTPUT/$LD_PROFILE.profile

Apoi executăm programul pentru a produce rezultatul profilării, care este scris într-un fișier din directorul specificat în LD_PROFILE_OUTPUT:


$ LD_LIBRARY_PATH=. ./prog
$ ls prof_data
libdemo.so.1.profile

Apoi folosim opțiunea sprof -p pentru a genera un profil plat cu numărători și ticuri:


$ sprof -p libdemo.so.1 $LD_PROFILE_OUTPUT/libdemo.so.1.profile
Flat profile:
Fiecare eșantion contează ca 0,01 secunde.
  %   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

Opțiunea sprof -q generează un grafic de apeluri:


$ 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]
-----------------------------------------------

Deasupra și dedesubt, șirurile „<UNKNOWN>” reprezintă identificatori care se află în afara obiectului profilat (în acest exemplu, acestea sunt instanțe ale main()).

Opțiunea sprof -c generează o listă de perechi de apeluri și numărul de apariții ale acestora:


$ 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)

Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.

15 iunie 2024 Pagini de manual de Linux 6.9.1