Kui Linuxis töötavad programmid soovivad kasutada operatsioonisüsteemi hallatavaid ressursse (failide lugemine, protsesside loomine jne), teevad nad süsteemikutseid OS-ile. Süsteemikutsed töötavad kerneli tasemel ja sooritavad vajalikke toiminguid, jättes juhtimise tagasi kutsuvale programmile. Strace'i tööriist võimaldab neid süsteemikõnesid Linuxis jälgida.
Käsu strace tüüpiline kasutamine
Rakenduse süsteemikutsete jälgimiseks käivitage lihtsalt käsk jälg järgmises vormingus:
strace ls /tmp
Siiski on sageli protsesse, mis algavad palju varem ja jätkavad töötamist taustal. Probleemide tõttu võiksite koguda selliste protsessidega seotud lisateavet. Saate lisada jälg mis tahes töötavale rakendusele, andes protsessi protsessi ID -lk parameeter:
strace - lk 2759
Väljund:
Jälgige rakenduse lõime ja haru
Strace abil saate kontrollida kõiki lõime ja muid alamprotsesse, mis on rakenduse hargiks, kasutades -f lipp.
strace -f -p 2759
Väljund:
Kontrollige teatud süsteemikõnesid strace'ga
Vaikimisi strace väljund võib kohati olla üsna ülerahvastatud. Kui soovite jälgida ainult teatud süsteemikõnesid, saate seda teha rakendusega
-e parameeter:strace -f -e trace=ava, kirjuta, sulge, ühenda,vali -lk 19770
Ainult failitoimingutega seotud süsteemikutsete jälgimiseks kasutage -e jälg=fail:
strace -e trace=file -p 19770
Ainult võrguga seotud süsteemikõnede filtreerimiseks määrake -e jälg = võrk käsus:
strace -e trace=network -p 19770
Hankige ajateavet sekunditega
Süsteemikõnede väljastamisel saate kasutada -t parameeter, et saada ajateavet sekundites täpselt. Enamasti ei piisa täpsusest teie vajaduste jaoks. Sellistes olukordades saate kasutada -tt parameeter ajateabe saamiseks mikrosekundi täpsusega:
strace -tt ls /tmp
Koguge statistikat süsteemikõnede kohta
Koos -c parameetriga saate koguda statistikat süsteemikõnede kohta nii kaua, kui soovite:
strace -f -c -p 19770
Salvestage logid faili
Kui kasutate strace'i pikka aega ja soovite saadud logisid hiljem üksikasjalikumalt uurida, peate logid salvestama. Koos -o parameetriga saate määrata faili, kuhu strace logid salvestab:
strace -f -o /tmp/strace.log -e trace=file ls /tmp
ptrace blokeerimisprotsess
Prctl-i süsteemikutset kasutades võib iga Linuxi rakendus takistada end kontrollimast mitte-juurkasutajate poolt, kasutades ptrace'i. Kui rakendus kustutab PR_SET_DUMPABLE liputage enda jaoks prctl-i kaudu, ei saa teised kasutajad peale root selle rakenduse ptrace abil juhtida, isegi kui neil on õigus rakendusest märku anda.
Üks selle funktsiooni kõige tüüpilisemaid kasutusviise on näha OpenSSH autentimisagendi tarkvaras. Seega on rakenduse juhtimine teise rakenduse poolt koos ptrace on kasutaja autentimisel keelatud.
ptrace ja turvalisus
Traditsioonilises Linuxi protsessimudelis seatud jälgimisfunktsiooni tõttu on mis tahes tarkvaral, mida teie süsteemis koos kasutajaga käivitate, õigus sisestada sellesse pahatahtlikku koodi. Lihtsaimast xtermi tööriistast kuni täiustatud veebibrauserirakendused, võib selline pahavara võtta kontrolli kõigi teie muude töötavate rakenduste üle – tänu ptrace süsteemikutsele – ja kopeerida olulist teavet ilma, et te märkaksite.
Vastuseks sellele olukorrale, millest paljud kasutajad ei tea, on välja töötatud kaitsemehhanism, mille turvamoodul on nimega Yama Linuxi tuumas.
Saate juhtida ptrace-süsteemi kõnele vastust läbi /proc/sys/kernel/yama/ptrace_scope faili. Vaikimisi kirjutab see fail väärtuseks 0.
Järgmised väärtused on vastuvõetavad:
Väärtus | Tähendus |
0 | Tavapärane käitumine: kõik rakendused, millel on õigus ptrace saab kontrollida. |
1 | Piiratud jälg: ainult rakenduse või silumisrakenduste otsene ülem, mille rakendus lubab koos PR_SET_PTRACER valikul on kontroll. Seega kasutusalad gdb programmi_nimi ja strace programmi_nimi töötab edasi, kuid te ei saa pärast seda enam töötavat rakendust manustada. |
2 | Pjälgige süsteemiadministraatorile: ainult määratletud rakendused CAP_SYS_PTRACE atribuut või alamprotsessid, mis määratlevad PTRACE_TRACEME variant koos prctl saab kontrollida. |
3 | Täielikult keelatud: Ei ptrace on lubatud igal juhul. Kui see atribuut on üks kord määratletud, ei saa te seda käitusajal uuesti muuta. |
Paljud arendajad ei tea, et rakendused saavad prctl-i kaudu ise ptrace'i keelata, välja arvatud juurkasutaja. Kuigi turvalisusega seotud tarkvara, näiteks OpenSSH agent, teostab neid toiminguid, ei oleks õige eeldada sama käitumist kogu süsteemis töötava tarkvara puhul.
Hiljuti mõned Linuxi distributsioonid on hakanud määrama vaikeväärtust ptrace_scope ülalkirjeldatud faili 1. Seega, kui jälgimistoimingud on piiratud, tagatakse kogu süsteemis turvalisem töökeskkond.
Näidisjälje kasutamine
Registreerige allolev näidistaotlus nimega ministrace.c. Seejärel saate selle kompileerida järgmise käsuga:
gcc-oministerminister.c
Kood:
#kaasa <sys/ptrace.h>
#kaasa <sys/reg.h>
#kaasa <sys/wait.h>
#kaasa <sys/types.h>
#kaasa <unistd.h>
#kaasa <stdlib.h>
#kaasa <stdio.h>
#kaasa <errno.h>
#kaasa <string.h>
intoodake_syscall(pid_t laps)
{
int staatus;
samas (1) {
ptrace (PTRACE_SYSCALL, alam, 0, 0);
ootapid (laps, &olek, 0);
kui (WIFSTOPPED(olek) && WSTOPSIG(olek) & 0x80)
tagasi0;
kui (WIFEXITED(olek))
tagasi1;
}
}intdo_laps(int argc, char **argv)
{
char *args [argc+1];
memcpy (args, argv, argc * sizeof(char*));
args[argc] = NULL;
ptrace (PTRACE_TRACEME);
tappa(getpid(), SIGSTOP);
tagasi execvp (args[0], args);
}intdo_trace(pid_t laps)
{
int olek, syscall, retval;
ootapid (laps, &olek, 0);
ptrace (PTRACE_SETOPTIONS, alam, 0, PTRACE_O_TRACESYSGOOD);
samas(1) {
kui (oota_syscall (laps) != 0) murda;syscall = ptrace (PTRACE_PEEKUSER, alam, sizeof(pikk)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", syscall);kui (oota_syscall (laps) != 0) murda;
retval = ptrace (PTRACE_PEEKUSER, alam, sizeof(pikk)*RAX);
fprintf (stderr, "%d
", retval);
}
tagasi0;
}
intpeamine(int argc, char **argv)
{
if (argc < 2) {
fprintf (stderr, "Kasutus: %s prog args
", argv[0]);
väljuda(1);
}
pid_t laps = kahvel();
if (laps == 0) {
tagasi do_child (argc-1, argv+1);
} muidu {
tagasi do_trace (laps);
}
}
Pärast rakenduse koostamist saate käivitada mis tahes käsu minister ja uurige väljundit:
Strace'i saate kasutada mitmel otstarbel
strace võib aidata leida vigu programmides, mis tarbetult kasutavad süsteemiressursse. Samuti saab strace abil paljastada omaduse, mida programm kuvab operatsioonisüsteemi ressursse kasutades.
Kuna strace kuulab otse süsteemikõnesid, võib see paljastada käitusaja dünaamika sõltumata sellest, kas käivitatava programmi kood on avatud/suletud. Saab aimu, miks programmid strace’i kasutama hakates vea annavad.
Samamoodi aitab strace teil mõista, miks programm ootamatult lõpeb. Seetõttu on strace’i tundmine Linuxi kerneli arenduses ja süsteemihalduses väga oluline.
Looge Linuxiga nullist oma operatsioonisüsteem [Linux]
Loe edasi
Seotud teemad
- Linux
- Linuxi käsud
- Linuxi kernel
Autori kohta

Insener ja tarkvaraarendaja, kes on matemaatika ja tehnoloogia fänn. Talle on alati meeldinud arvutid, matemaatika ja füüsika. Ta on arendanud nii mängumootorite projekte kui ka masinõpet, tehisnärvivõrke ja lineaaralgebra teeke. Lisaks jätkab ta tööd masinõppe ja lineaarsete maatriksitega.
Liituge meie uudiskirjaga
Liituge meie uudiskirjaga tehniliste näpunäidete, arvustuste, tasuta e-raamatute ja eksklusiivsete pakkumiste saamiseks!
Tellimiseks klõpsake siin