sprof(1)

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

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

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

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

--call-pairs
-c
    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ă.

--flat-profile
-p
    Generează un profil plat al tuturor funcțiilor din obiectul monitorizat, cu numărători și ticuri.

--graph
-q
    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ă:

--help
-?
    Afișează un rezumat al opțiunilor disponibile în linia de comandă și iese.

--usage
    Afișează un scurt mesaj de utilizare și iese.

--version
-V
    Afișează versiunea programului și iese.

STANDARDE
GNU.

EXEMPLE
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

CONSULTAȚI ȘI
gprof(1), ldd(1), ld.so(8)

TRADUCERE
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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.