sprof(1) | General Commands Manual | 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ă:
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
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 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 |