Cum să utilizați strace pentru a monitoriza apelurile de sistem Linux

Publicat: 2022-01-29
O fereastră de terminal stilizată pe un laptop.
fatmawati achmad zaenuri/Shutterstock.com

Programele Linux cer nucleului să facă unele lucruri pentru ele. Comanda strace dezvăluie aceste apeluri de sistem. Le puteți folosi pentru a înțelege cum funcționează programele și de ce, uneori, nu.

Kernel-ul și apelurile de sistem

Oricât de inteligente ar fi, programele de calculator nu pot face totul pentru ele însele. Ei trebuie să facă cereri pentru a avea anumite funcții îndeplinite pentru ei. Aceste solicitări ajung la nucleul Linux. De obicei, există o bibliotecă sau o altă interfață software pe care programul o apelează, iar biblioteca face apoi cererea corespunzătoare - numită apel de sistem - către nucleu.

Posibilitatea de a vedea apelurile de sistem pe care le-a făcut un program și care au fost răspunsurile vă poate ajuta să înțelegeți funcționarea interioară a programelor care vă interesează sau pe care le-ați scris. Asta face strace . Poate ajuta la depanarea problemelor și la căutarea blocajelor.

Acest lucru nu este același lucru cu depanarea unei aplicații cu un instrument precum gdb . Un program de depanare vă permite să investigați funcționarea internă a unui program în timp ce rulează. Vă permite să treceți prin logica programului dvs. și să inspectați memoria și valorile variabilelor. Prin comparație, ceea ce face strace este să captureze informațiile despre apelurile de sistem pe măsură ce programul rulează. Când programul urmărit se termină, strace listează informațiile despre apelurile de sistem în fereastra terminalului.

Apelurile de sistem oferă tot felul de funcționalități de nivel scăzut, cum ar fi acțiuni de citire și scriere pe fișiere, procese de ucidere și așa mai departe. Există o listă de sute de apeluri de sistem pe pagina de manual syscalls.

LEGATE: Depanare cu GDB: Noțiuni introductive

Instalarea strace

Dacă strace nu este deja instalat pe computer, îl puteți instala foarte ușor.

Pe Ubuntu, utilizați această comandă:

 sudo apt install strace 

Pe Fedora, tastați această comandă:

 sudo dnf install 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 mare lucru: deschide un fișier și scrie o linie de text în el și nu are nicio verificare a erorilor în el. Este doar un hack rapid, astfel încât să avem ceva de folosit cu strace .

 #include <stdio.h>

int main(int argc, char argv[]) { 

  // mânerul fișierului 
  FIȘIER *fileGeek;

  // deschide un fișier numit „strace_demo.txt”, sau creează-l 
  fileGeek = fopen("strace_demo.txt", "w");

  // scrie ceva text în fișier 
  fprintf(fileGeek, „Scrieți acest lucru în fișier”);

  // închide fișierul 
  fclose(fileGeek);

  // iese din program 
  întoarcere (0); 

} // sfârșitul principalului

Am salvat acest lucru într-un fișier numit „fișier-io.c” și l-am compilat cu gcc într-un executabil numit stex , numit pentru „ exemplu st race”.

 gcc -o stex file-io.c

Vom apela strace din linia de comandă și îi vom transmite numele noului nostru executabil ca proces pe care dorim să-l urmărim. Am putea urmări la fel de ușor oricare dintre comenzile Linux sau orice alt executabil binar. Folosim programul nostru mic din două motive.

Primul motiv este că strace este verbosă. Pot exista o mulțime de rezultate. Este grozav când folosești strace în mânie, dar poate fi copleșitor la început. Există o ieșire de strace limitată 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 ce secțiuni ale rezultatului se referă la diferitele părți ale funcționării interne a programului.

 strace ./stex 

Putem vedea clar apelul de sistem de write care trimite textul „Scrieți acest lucru în fișier” în fișierul nostru deschis și apelul de sistem exit_group . Aceasta termină toate firele de execuție din aplicație și trimite o valoare returnată înapoi către shell.

Filtrarea ieșirii

Chiar și cu programul nostru demonstrativ simplu, există destul de mult rezultate. Putem folosi opțiunea -e (expresie). Vom trece numele apelului de sistem pe care vrem să-l vedem.

 strace -e scrie ./stex 

Publicitate

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 apelurilor de sistem.

 strace -e close,write ./stex 

Trimiterea ieșirii la un fișier

Beneficiul de filtrare a ieșirii este, de asemenea, problema cu filtrarea ieșirii. Vezi ceea ce ai cerut să vezi, dar nu vezi nimic altceva. Și unele dintre celelalte rezultate ți-ar putea fi mai utile decât lucrurile pe care le-ai cerut să le vezi.

Uneori, este mai convenabil să capturați totul și să căutați și să defilați prin întregul set de rezultate. Astfel, nu vei exclude accidental nimic important. Opțiunea -o (ieșire) vă permite să trimiteți rezultatul dintr-o sesiune strace într-un fișier text.

 strace -o trace-output.txt ./stex 

Puteți folosi apoi comanda less pentru a parcurge lista și a căuta apeluri de sistem – sau orice altceva – după nume.

 mai puțin trace-output.txt 

Acum puteți utiliza toate capabilitățile de căutare ale lui less pentru a investiga rezultatul.

LEGATE: Cum să utilizați comanda less pe Linux

Adăugarea de marcaje temporale

Puteți adăuga mai multe marcaje temporale diferite la ieșire. Opțiunea -r (marcate temporale relative) adaugă marcaje temporale care arată diferența de timp dintre începutul fiecărui apel de sistem succesiv. Rețineți că aceste valori de timp vor include timpul petrecut în apelul de sistem anterior și orice altceva făcea programul înainte de următorul apel de sistem.

 strace -r ./stex 

Publicitate

Marcajele de timp sunt afișate la începutul fiecărei linii de ieșire.

Pentru a vedea timpul petrecut în fiecare apel de sistem, utilizați opțiunea -T (syscall-times). Aceasta arată durata de timp petrecută în cadrul fiecărui apel de sistem.

 strace -T ./stex 

Duratele de timp sunt afișate la sfârșitul fiecărei linii de apel de sistem.

Pentru a vedea ora la care a fost apelat fiecare apel de sistem, utilizați opțiunea -tt (marcate temporale absolute). Aceasta arată ora „ceas de perete”, cu o rezoluție de microsecunde.

 strace -tt ./stex 

Orele sunt afișate la începutul fiecărei linii.

Urmărirea unui proces de rulare

Dacă procesul pe care doriți să-l urmăriți este deja în curs de desfășurare, puteți în continuare să-i atașați strace . Pentru a face acest lucru, trebuie să cunoașteți ID-ul procesului. Puteți folosi ps cu grep pentru a găsi asta. Avem Firefox rulând. Pentru a afla ID-ul procesului firefox , putem folosi ps și îl putem trece prin grep .

 ps -e | grep firefox 

Publicitate

Putem vedea că ID-ul procesului este 8483. Vom folosi opțiunea -p (ID-ul procesului) pentru a-i spune lui strace la ce proces să se atașeze. Rețineți că va trebui să utilizați sudo :

 sudo strace -p 8483 

Veți vedea o notificare că strace s-a atașat procesului, iar apoi apelurile de urmărire a sistemului vor fi afișate în fereastra terminalului ca de obicei.

Crearea unui raport

Opțiunea -c (numai rezumatul) face ca strace să imprime 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 din timpul de execuție petrecut în fiecare apel de sistem.
  • secunde : timpul total exprimat în secunde și microsecunde petrecut în fiecare apel de sistem.
  • usecs/call : timpul mediu în microsecunde petrecut în fiecare apel de sistem.
  • apeluri : de câte ori a fost executat fiecare apel de sistem.
  • erori : numărul de erori pentru fiecare apel de sistem.
  • syscall : numele apelului de sistem.

Aceste valori vor afișa zerouri pentru programele banale care se execută și se termină rapid. Valorile din lumea reală sunt afișate pentru programele care fac ceva mai semnificativ decât aplicația noastră demonstrativă.

Perspective profunde, cu ușurință

Ieșirea strace vă poate arăta ce apeluri de sistem sunt efectuate, care sunt efectuate în mod repetat și cât timp de execuție este petrecut în codul din partea nucleului. Este o informație grozavă. Adesea, atunci când încercați să înțelegeți ce se întâmplă în codul dvs., este ușor să uitați că binarul interacționează aproape fără oprire cu nucleul pentru a îndeplini multe dintre funcțiile sale.

Folosind strace , vedeți imaginea completă.

LEGATE: Cele mai bune laptopuri Linux pentru dezvoltatori și entuziaști