Programele Linux solicită
nucleu
să facă niște lucruri pentru ei. În
Strace
Comanda dezvăluie aceste apeluri de sistem. Le puteți folosi pentru a înțelege modul în care funcționează programele și de ce, uneori, ei nu.
Kernel-ul și apelurile de sistem
La fel de inteligenți cum ar putea fi, programele de calculator nu pot face totul pentru ei înșiși. Ei trebuie să facă cereri de a avea anumite funcții efectuate pentru ei. Aceste cereri merg la kernelul Linux. În mod obișnuit, există o bibliotecă sau altă interfață software pe care programul îl solicită, iar biblioteca face apoi solicitarea corespunzătoare - numită un apel de sistem - la kernel.
Fiind capabil să vadă sistemul de apeluri pe care un program a făcut-o și ce răspunsuri vă pot ajuta să înțelegeți funcționarea interioară a programelor care vă interesează sau pe care le-ați scris. Aceasta este
ce
Strace
face
. Acesta poate ajuta la depanarea problemelor și căutați blocaje.
Acest lucru nu este același cu
depanarea unei cereri
cu un instrument ca
GDB.
. Un program de depanare vă permite să investigați funcționarea internă a unui program așa cum funcționează. Vă permite să treceți prin logica programului dvs. și să inspectați memoria și valorile variabile. Prin comparație, ce
Strace
Are captarea informațiilor despre apelurile sistemului pe măsură ce programul funcționează. Când programul trasat se termină,
Strace
Afișează informațiile despre apelurile sistemului în fereastra Terminalului.
Apelurile de sistem oferă tot felul de funcționalitate la nivel scăzut, cum ar fi acțiunile de citire și scriere pe fișiere, uciderea proceselor și așa mai departe. Există o listă de sute de apeluri de sistem pe SYSCALLS MAN Pagina .
LEGATE DE: Debuging cu GDB: Începeți
Instalarea Fragmentului
Dacă
Strace
Nu este deja instalat pe computer, îl puteți instala foarte ușor.
Pe Ubuntu, utilizați această comandă:
sudo apt instalați strace
Pe Fedora, tastați această comandă:
Sudo DNF instalați Strace
Pe Manjaro, comanda este:
sudo Pacman -sy Strace
Primii pași cu Strace
Vom folosi un mic program pentru a demonstra
Strace
. Nu face prea mult: deschide un fișier și scrie o linie de text la ea și nu are nici o eroare de verificare în ea. Este doar un hack rapid, astfel încât să avem ceva de utilizat
Strace
.
#include & lt; stdio.h & gt;
int principal (int argc, char argv []) {
// mânerul fișierului
Fișier * Filegeek;
// Deschideți un fișier numit "Strace_demo.txt", sau creați-l
Filegeek = Fopen ("Strace_demo.txt", "W");
// scrieți un text în fișier
FPRINTF (Filegeek, scrieți acest fișier ");
// Închideți fișierul
FLOSE (FILEGEEK);
// Exit din program
retur (0);
} // Sfârșitul principal
Am salvat acest lucru într-un fișier numit "File-io.c" și am compilat-o
GCC.
într-un executabil numit
Stex.
, numit pentru "
Sf
rasă
ex
amplu."
GCC -O STEX FILE-IO.C
Vom suna
Strace
Din linia de comandă și trece numele noului nostru executabil la acesta ca proces pe care vrem să-l urmăresc. Am putea să urmărim la fel de ușor oricare dintre comenzile Linux sau orice alt executabil binar. Folosim programul nostru mic din două motive.
Primul motiv este acela
Strace
este verbose. Pot exista o mulțime de ieșire. Asta e minunat când utilizați
Strace
În mânie, dar poate fi copleșitor la început. Există limitată
Strace
ieșire pentru programul nostru mic. Al doilea motiv este că programul nostru are o funcționalitate limitată, iar codul sursă este scurt și simplu. Acest lucru facilitează identificarea care secțiuni ale producției se referă la diferitele părți ale funcționării interne ale programului.
Strace ./stex
Putem vedea clar
scrie
Apelul sistemului Trimiterea textului "Scrieți acest fișier" în fișierul nostru deschis și
EXIT_GROUP.
Apel de sistem. Aceasta termină toate firele din aplicație și trimite o valoare returnată înapoi la coajă.
Filtrarea ieșirii
Chiar și cu programul nostru simplu demonstrativ, există o mulțime de ieșire. Putem folosi
-E.
(expresie). Vom trece în numele sunării sistemului pe care vrem să-l vedem.
Strace -e Scrieți ./stex
Puteți raporta mai multe apeluri de sistem adăugându-le ca o listă separată prin virgulă. Nu includeți niciun spațiu alb în lista de apeluri de sistem.
strace -e close, scrie ./stex
Trimiterea ieșirii într-un fișier
Beneficiul de filtrare a ieșirii este, de asemenea, problema cu filtrarea ieșirii. Vedeți ce ați cerut să vedeți, dar nu vedeți nimic altceva. Și unele dintre celelalte rezultate ar putea fi mai utile pentru tine decât lucrurile pe care le-ați cerut să le vedeți.
Uneori, este mai convenabil să capturați totul și să căutați și să parcurgeți întregul set de rezultate. În acest fel, nu veți exclude accidental ceva important. În
-O.
(Output) vă permite să trimiteți ieșirea de la
Strace
sesiune la un fișier text.
strace -o trace-ieșire.txt ./stex
Apoi puteți
folosește
Mai puțin
comanda
Pentru a derula prin listarea și căutarea apelurilor de sistem - sau orice altceva-numitor.
mai puțin trace-ieșire.txt
Acum puteți folosi toate
Mai puțin
Capabilitățile de căutare pentru a investiga ieșirea.
LEGATE DE: Cum să utilizați comanda mai mică pe Linux
Adăugarea de marcaje
Puteți adăuga mai multe tipuri de timpi diferite la ieșire. În
-R.
(Opțiunea relativă TimestaMPS) adaugă marcaje de timp care prezintă diferența de timp între începutul fiecărui apel succesiv al sistemului. Rețineți că aceste valori de timp vor include timpul petrecut în apelul anterior al sistemului și orice altceva pe care programul a făcut programul înainte de următorul apel de sistem.
Strace -r ./stex
Timestele sunt afișate la începutul fiecărei linii de ieșire.
Pentru a vedea durata de timp petrecută în fiecare apel de sistem, utilizați
-T.
(Syscall-Times). Aceasta arată durata timpului petrecut în fiecare apel de sistem.
strace -t ./stex
Durata de timp sunt prezentate la sfârșitul fiecărei linii de apeluri de sistem.
Pentru a vedea timpul la care a fost apelat fiecare apel de sistem, utilizați
-ttt.
(Absolut TimestaMPS). Aceasta arată ora "ceasului de perete", cu o rezoluție microsecundă.
Strace -tt ./stex
Timpurile sunt afișate la începutul fiecărei linii.
Traducerea unui proces de funcționare
Dacă procesul pe care doriți să îl urmăriți deja funcționează, puteți atașa
Strace
la ea. Pentru a face acest lucru, trebuie să cunoașteți ID-ul procesului. Poti
utilizare
ps.
cu
grep.
pentru a găsi acest lucru. Avem Firefox care rulează. Pentru a afla ID-ul
Firefox.
Proces, putem folosi
ps.
și
o conductă
grep.
.
PS-E | GREP Firefox
Putem vedea că ID-ul procesului este 8483. Vom folosi
-p.
(ID-ul procesului) de a spune
Strace
care proces de atașare. Rețineți că va trebui să utilizați
sudo.
:
sudo strace -p 8483
Veți vedea o notificare că
Strace
sa atașat la proces, iar apoi apelurile de urmărire a sistemului vor fi afișate în fereastra terminalului ca de obicei.
Crearea unui raport
În
-C.
(numai pentru rezumat) Cauze de opțiune
Strace
pentru a imprima un raport. Acesta generează un tabel pentru informații despre apelurile de sistem care au fost efectuate de programul urmărit.
Strace-C ./stex
Coloanele sunt:
- % Timp : Procentul de timp de execuție care a fost petrecut în fiecare apel de sistem.
- secunde : Timpul total exprimat în câteva secunde și microsecundele petrecute în fiecare apel de sistem.
- USECS / CALL. : Timpul mediu în microsecundele petrecut în fiecare apel de sistem.
- Apeluri : De câte ori a fost executat fiecare apel de sistem.
- erori : Numărul de eșecuri pentru fiecare apel de sistem.
- SYSCALL. : Numele apelului de sistem.
Aceste valori vor afișa zerouri pentru programe triviale care execută și se termină rapid. Valorile lumii reale sunt afișate pentru programe care fac ceva mai semnificativ decât cererea noastră demonstrativă.
Profund perspective, ușor
În
Strace
Ieșirea vă poate arăta ce apeluri de sistem sunt făcute, care se fac în mod repetat și cât de mult timp de execuție este petrecut în codul lateral al kernelului. Sunt informații minunate. Adesea, când încercați să înțelegeți ce se întâmplă în interiorul codului dvs., este ușor să uitați că binarul dvs. interacționează aproape non-stop cu kernelul pentru a-și îndeplini multe funcții.
Prin utilizarea
Strace
, vedeți imaginea completă.