Când programele care rulează pe Linux doresc să utilizeze resursele gestionate de sistemul de operare (citirea fișierelor, crearea de procese etc.), ele efectuează apeluri de sistem către sistemul de operare. Apelurile de sistem funcționează la nivel de kernel și efectuează operațiunile necesare, lăsând controlul înapoi programului apelant. Instrumentul strace oferă posibilitatea de a urmări aceste apeluri de sistem pe Linux.

Utilizarea tipică a comenzii strace

Pentru a monitoriza apelurile de sistem pentru o aplicație, trebuie doar să invocați comanda cu strace în următorul format:

strace ls /tmp

Cu toate acestea, există adesea procese care încep mult mai devreme și continuă să funcționeze în fundal. Din cauza oricăror probleme, este posibil să doriți să colectați informații suplimentare asociate cu astfel de procese. Puteți atașa strace la orice aplicație care rulează, dând ID-ul procesului -p parametru:

strace -p 2759

Ieșire:

Urmăriți firele și furcile unei aplicații

Cu strace, puteți verifica toate firele și alte procese secundare care sunt o furcă a aplicației folosind -f steag.

instagram viewer
strace -f -p 2759

Ieșire:

Verificați anumite apeluri de sistem cu strace

Ieșirea implicită de strace poate fi destul de aglomerată de urmărit uneori. Dacă doriți să urmăriți doar anumite apeluri de sistem, puteți face acest lucru cu ajutorul -e parametru:

strace -f -e trace=deschide, scrie, închide, conectează,Selectați -p 19770

Pentru a urmări numai apelurile de sistem legate de operațiunile cu fișiere, utilizați -e trace=fișier:

strace -e trace=file -p 19770

Pentru a filtra numai apelurile de sistem legate de rețea, specificați -e trace=network in comanda:

strace -e trace=network -p 19770

Obțineți informații despre timp în secunde

Când scoateți apeluri de sistem, puteți utiliza -t parametru pentru a obține informații despre timp cu precizie în secunde. De cele mai multe ori precizia nu va fi suficienta pentru nevoile tale. În astfel de situații, puteți utiliza -tt parametru pentru a obține informații despre timp cu precizie de microsecunde:

strace -tt ls /tmp

Colectați statistici despre apelurile de sistem

Cu -c parametru, puteți colecta statistici despre apelurile de sistem atât timp cât doriți:

strace -f -c -p 19770

Salvați jurnalele într-un fișier

Dacă rulați Strace pentru o lungă perioadă de timp și doriți să examinați mai târziu jurnalele rezultate mai detaliat, va trebui să salvați jurnalele. Cu -o parametrul puteți specifica fișierul în care strace ar trebui să salveze jurnalele:

strace -f -o /tmp/strace.log -e trace=fișier ls /tmp

Procesul de blocare ptrace

Folosind apelul de sistem prctl, orice aplicație sub Linux se poate împiedica să fie controlată de utilizatori non-root folosind ptrace. Dacă aplicația șterge PR_SET_DUMPABLE flag pentru sine prin prctl, utilizatorii alții decât root nu vor putea controla această aplicație cu ptrace, chiar dacă au dreptul de a semnala aplicația.

Una dintre cele mai tipice utilizări ale acestei caracteristici este văzută în software-ul agentului de autentificare OpenSSH. Astfel, controlul aplicației de către o altă aplicație cu ptrace este împiedicat la autentificarea utilizatorului.

ptrace și Securitate

Datorită facilității ptrace stabilite în modelul tradițional de proces Linux, orice software pe care îl rulați pe sistemul dvs. împreună cu utilizatorul dvs. are autoritatea de a introduce cod rău intenționat în el. De la cel mai simplu instrument xterm la aplicații avansate de browser web, un astfel de malware poate prelua controlul asupra tuturor celorlalte aplicații care rulează — mulțumită apelului de sistem ptrace — și poate copia informații importante fără ca tu să observi.

Ca răspuns la această situație, de care mulți utilizatori nu o cunosc, a fost dezvoltat un mecanism de protecție cu modulul de securitate numit Yama în nucleul Linux.

Puteți controla răspunsul la apelul de sistem ptrace prin intermediul /proc/sys/kernel/yama/ptrace_scope fişier. În mod implicit, acest fișier scrie o valoare de 0.

Sunt acceptate următoarele valori:

Valoare Sens
0 Comportament convențional: Toate aplicațiile care au dreptul la ptrace poate fi verificat.
1 Ptrace restricționat: Numai părintele direct al aplicației sau aplicațiile de depanare permise de aplicație cu PR_SET_PTRACER opțiunea are controlul. Astfel, utilizările de gdb program_name și strace program_name va continua să funcționeze, dar nu veți putea atașa o aplicație care rulează ulterior.
2 Ptrace către administratorul de sistem: Numai aplicațiile cu definite CAP_SYS_PTRACE proprietatea sau procesele copil care definesc PTRACE_TRACEME opțiunea cu prctl poate fi controlat.
3 Complet dezactivat: Nu ptrace este permisă în orice împrejurare. Dacă această proprietate este definită o dată, nu o puteți modifica din nou în timpul execuției.

Mulți dezvoltatori nu știu că aplicațiile pot dezactiva ptrace prin prctl, cu excepția utilizatorului root. Deși software-ul legat de securitate, cum ar fi agentul OpenSSH, efectuează aceste operațiuni, nu ar fi corect să ne așteptăm la același comportament de la toate programele care rulează pe sistem.

Recent, unele distribuții Linux au început să seteze valoarea implicită a ptrace_scope dosar, descris mai sus, la 1. Astfel, cu operațiunile de urmărire limitate, se asigură un mediu de lucru mai sigur în întregul sistem.

Folosind o strace Exemplu

Înregistrați aplicația exemplu de mai jos cu numele ministrace.c. Apoi îl puteți compila cu următoarea comandă:

gcc-oslujireslujire.c

Cod:

#include <sys/ptrace.h>
#include <sys/reg.h>
#include <sys/wait.h>
#include <sys/tipuri.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <sfoară.h>
intwait_for_syscall(copil pid_t)
{
int stare;
in timp ce (1) {
ptrace (PTRACE_SYSCALL, copil, 0, 0);
waitpid (copil, &stare, 0);
dacă (WIFSTOPPED(stare) && WSTOPSIG(stare) & 0x80)
întoarcere0;
dacă (WIFEXITED(stare))
întoarcere1;
}
}

intface_copil(int argc, char **argv)
{
char *args [argc+1];
memcpy (args, argv, argc * sizeof(char*));
args[argc] = NUL;
ptrace (PTRACE_TRACEME);
ucide(getpid(), SIGSTOP);
întoarcere execvp (args[0], args);
}

intdo_trace(copil pid_t)
{
int status, syscall, retval;
waitpid (copil, &stare, 0);
ptrace (PTRACE_SETOPTIONS, copil, 0, PTRACE_O_TRACESYSGOOD);
in timp ce(1) {
dacă (wait_for_syscall (copil) != 0) pauză;

syscall = ptrace (PTRACE_PEEKUSER, copil, dimensiunea(lung)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", syscall);

dacă (wait_for_syscall (copil) != 0) pauză;

retval = ptrace (PTRACE_PEEKUSER, copil, dimensiunea(lung)*RAX);
fprintf (stderr, "%d
", retval);
}
întoarcere0;
}
intprincipal(int argc, char **argv)
{
dacă (argc < 2) {
fprintf (stderr, "Utilizare: %s prog args
", argv[0]);
Ieșire(1);
}
pid_t copil = furculiță();
dacă (copil == 0) {
întoarcere do_child (argc-1, argv+1);
} altfel {
întoarcere do_trace (copil);
}
}

După compilarea aplicației, puteți rula orice comandă cu slujire și examinați rezultatul:

Puteți folosi strace în mai multe scopuri

strace poate ajuta la găsirea erorilor în programele care utilizează în mod inutil resursele sistemului. De asemenea, caracteristica pe care o prezintă un program în timpul utilizării resurselor sistemului de operare poate fi, de asemenea, dezvăluită cu strace.

Deoarece strace ascultă direct apelurile de sistem, poate dezvălui dinamica timpului de execuție, indiferent dacă codul programului rulat este deschis/închis. Este posibil să vă faceți o idee despre motivul pentru care programele aruncă o eroare atunci când au început să folosească strace.

În mod similar, strace vă ajută să înțelegeți de ce un program se termină în mod neașteptat. Prin urmare, familiarizarea cu strace este foarte importantă în dezvoltarea kernel-ului Linux și în administrarea sistemului.

Creați-vă propriul sistem de operare cu Linux de la zero [Linux]

Citiți în continuare

AcțiuneTweetAcțiuneE-mail

Subiecte asemănătoare

  • Linux
  • Comenzi Linux
  • Kernel Linux

Despre autor

Fatih Küçükkarakurt (6 articole publicate)

Un inginer și dezvoltator de software care este un fan al matematicii și al tehnologiei. Întotdeauna i-au plăcut computerele, matematica și fizica. El a dezvoltat proiecte de motoare de jocuri, precum și învățare automată, rețele neuronale artificiale și biblioteci de algebră liniară. În plus, continuă să lucreze la învățarea automată și la matrice liniare.

Mai multe de la Fatih Küçükkarakurt

Aboneaza-te la newsletter-ul nostru

Alăturați-vă buletinului nostru informativ pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!

Click aici pentru a te abona