Cum să utilizați strace pentru a monitoriza apelurile de sistem Linux
Publicat: 2022-01-29 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
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
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
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ă.
Comenzi Linux | ||
Fișiere | tar · pv · cat · tac · chmod · grep · diff · sed · ar · om · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · tip · redenumire · zip · dezarhivare · montare · demontare · instalare · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm | |
Procese | alias · ecran · sus · frumos · renice · progres · strace · systemd · tmux · chsh · istoric · la · lot · gratuit · care · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · da · kill · sleep · sudo · su · time · groupadd · usermod · grupuri · lshw · shutdown · repornire · stop · poweroff · passwd · lscpu · crontab · data · bg · fg | |
Rețele | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
LEGATE: Cele mai bune laptopuri Linux pentru dezvoltatori și entuziaști