Kai Linux veikiančios programos nori naudoti operacinės sistemos valdomus išteklius (skaityti failus, kurti procesus ir pan.), jos atlieka sistemos iškvietimus į OS. Sistemos iškvietimai veikia branduolio lygiu ir atlieka reikiamas operacijas, palikdami kontrolę iškvietimo programai. strace įrankis suteikia galimybę atsekti šiuos sistemos iškvietimus Linux sistemoje.
Įprastas strace komandos naudojimas
Norėdami stebėti sistemos iškvietimus į programą, tiesiog iškvieskite komandą su trasa tokiu formatu:
strace ls /tmp
Tačiau dažnai būna procesų, kurie prasideda daug anksčiau ir toliau veikia fone. Dėl bet kokių problemų galbūt norėsite rinkti papildomos informacijos, susijusios su tokiais procesais. Galite prisegti trasa bet kuriai veikiančiai programai, nurodydami proceso ID -p parametras:
strace -p 2759
Išvestis:
Stebėkite programos gijas ir šakes
Naudodami strace galite patikrinti visas gijas ir kitus antrinius procesus, kurie yra programos šakutė, naudodami -f vėliava.
strace -f -p 2759
Išvestis:
Patikrinkite tam tikrus sistemos skambučius naudodami strace
Numatytoji strace išvestis kartais gali būti gana perpildyta. Jei norite sekti tik tam tikrus sistemos skambučius, tai galite padaryti naudodami -e parametras:
trace -f -e trace=atidaryti, rašyti, uždaryti, prisijungti,pasirinkite -p 19770
Norėdami atsekti tik sistemos iškvietimus, susijusius su failų operacijomis, naudokite -e trace=failas:
strace -e trace=file -p 19770
Norėdami filtruoti tik su tinklu susijusius sistemos skambučius, nurodykite -e trace=tinklas komandoje:
strace -e trace=network -p 19770
Gaukite laiko informaciją per kelias sekundes
Išvesdami sistemos skambučius galite naudoti -t parametrą, kad gautumėte laiko informaciją tiksliai sekundėmis. Dažniausiai tikslumo jūsų poreikiams nepakaks. Tokiose situacijose galite naudoti -tt parametras, skirtas gauti laiko informaciją mikrosekundžių tikslumu:
strace -tt ls /tmp
Rinkti statistiką apie sistemos skambučius
Su -c parametrą, galite rinkti statistiką apie sistemos skambučius tiek, kiek norite:
strace -f -c -p 19770 m
Išsaugoti žurnalus į failą
Jei naudojate strace ilgą laiką ir vėliau norite išsamiau išnagrinėti gautus žurnalus, turėsite juos išsaugoti. Su -o parametre galite nurodyti failą, kuriame strace turėtų išsaugoti žurnalus:
strace -f -o /tmp/strace.log -e trace=failas ls /tmp
ptrace blokavimo procesas
Naudojant prctl sistemos iškvietimą, bet kuri Linux sistemoje esanti programa gali neleisti savęs valdyti ne šakniniams vartotojams naudojant ptrace. Jei programa išvalo PR_SET_DUMPABLE pažymėkite save per prctl, vartotojai, išskyrus root, negalės valdyti šios programos naudodami ptrace, net jei jie turi teisę signalizuoti apie programą.
Vienas iš labiausiai paplitusių šios funkcijos naudojimo būdų yra OpenSSH autentifikavimo agento programinė įranga. Taigi, programos valdymas kita programa su ptrace užkertamas kelias vartotojo autentifikavimo metu.
ptrace ir saugumas
Dėl tradiciniame Linux proceso modelyje nustatytos ptrace priemonės bet kuri programinė įranga, kurią savo sistemoje naudojate kartu su vartotoju, turi teisę į ją įterpti kenkėjišką kodą. Nuo paprasčiausio xterm įrankio iki pažangios interneto naršyklės programos, tokia kenkėjiška programa gali perimti visų kitų jūsų veikiančių programų valdymą – ptrace sistemos skambučio dėka – ir nukopijuoti svarbią informaciją jums nepastebėjus.
Reaguojant į šią situaciją, kurios daugelis vartotojų nežino, buvo sukurtas apsaugos mechanizmas su vadinamuoju saugos moduliu Yama Linux branduolyje.
Galite valdyti atsakymą į ptrace sistemos skambutį naudodami /proc/sys/kernel/yama/ptrace_scope failą. Pagal numatytuosius nustatymus šis failas įrašo reikšmę 0.
Priimtinos šios vertės:
Vertė | Reikšmė |
0 | Įprastas elgesys: visos programos, kurios turi teisę ptrace galima patikrinti. |
1 | Ribotas pėdsakas: tik tiesioginė pirminė programos arba derinimo programų, kurias leidžia programa su PR_SET_PTRACER galimybė valdyti. Taigi, naudojimo būdai gdb programos_pavadinimas ir strace programos_pavadinimas veiks toliau, bet vėliau negalėsite pridėti veikiančios programos. |
2 | Psekite sistemos administratoriui: tik nustatytos programos CAP_SYS_PTRACE nuosavybės ar antrinių procesų, kurie apibrėžia PTRACE_TRACEME variantas su prctl galima valdyti. |
3 | Visiškai išjungtas: Ne ptrace leidžiama bet kokiomis aplinkybėmis. Jei ši ypatybė apibrėžta vieną kartą, vykdymo metu jos vėl pakeisti negalėsite. |
Daugelis kūrėjų nežino, kad programos gali pačios išjungti ptrace per prctl, išskyrus pagrindinį vartotoją. Nors su saugumu susijusi programinė įranga, pvz., OpenSSH agentas, atlieka šias operacijas, nebūtų teisinga tikėtis, kad visos sistemoje veikiančios programinės įrangos elgsis taip pat.
Neseniai kai kurie Linux platinimai pradėjo nustatyti numatytąją reikšmę ptrace_scope failą, aprašytą aukščiau, į 1. Taigi, apribojus pėdsakų operacijas, visoje sistemoje užtikrinama saugesnė darbo aplinka.
Naudojant pavyzdinę seką
Užregistruokite toliau pateiktą paraiškos pavyzdį su vardu ministrace.c. Tada galite jį kompiliuoti naudodami šią komandą:
gcc-oministraceministrace.c
Kodas:
#įtraukti <sys/ptrace.h>
#įtraukti <sys/reg.h>
#įtraukti <sys/wait.h>
#įtraukti <sys/types.h>
#įtraukti <unistd.h>
#įtraukti <stdlib.h>
#įtraukti <stdio.h>
#įtraukti <errno.h>
#įtraukti <eilutė.h>
tarptlaukti_skambučio(pid_t vaikas)
{
tarpt statusas;
kol (1) {
ptrace (PTRACE_SYSCALL, antrinis, 0, 0);
palauk (vaikas, &būsena, 0);
jei (WIFSTOPPED(būsena) && WSTOPSIG(būsena) & 0x80)
grąžinti0;
jei (WIFEXITED (būsena))
grąžinti1;
}
}tarptdo_vaikas(tarpt argc, char **argv)
{
char *args [argc+1];
memcpy (args, argv, argc * sizeof(char*));
args[argc] = NULL;
ptrace (PTRACE_TRACEME);
nužudyti(getpid(), SIGSTOP);
grąžinti execvp (args[0], args);
}tarptdo_trace(pid_t vaikas)
{
tarpt status, syscall, retval;
palauk (vaikas, &būsena, 0);
ptrace (PTRACE_SETOPTIONS, antrinis, 0, PTRACE_O_TRACESYSGOOD);
kol(1) {
jeigu (laukti_skambučio (vaikas) != 0) pertrauka;syscall = ptrace (PTRACE_PEEKUSER, vaikas, sizeof(ilgas)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", syscall);jeigu (laukti_skambučio (vaikas) != 0) pertrauka;
retval = ptrace (PTRACE_PEEKUSER, vaikas, sizeof(ilgas)*RAX);
fprintf (stderr, "%d
", retval);
}
grąžinti0;
}
tarptpagrindinis(tarpt argc, char **argv)
{
jei (argc < 2) {
fprintf (stderr, "Naudojimas: %s prog args
", argv[0]);
išeiti(1);
}
pid_t vaikas = šakutė();
if (vaikas == 0) {
grąžinti do_child (argc-1, argv+1);
} Kitas {
grąžinti do_trace (vaikas);
}
}
Sukūrę programą, galite paleisti bet kurią komandą ministrace ir patikrinkite išvestį:
„Strace“ galite naudoti įvairiems tikslams
strace gali padėti rasti klaidų programose, kurios be reikalo naudoja sistemos išteklius. Taip pat strace gali būti atskleista ir charakteristika, kurią programa rodo naudodama operacinės sistemos išteklius.
Kadangi „strace“ tiesiogiai klauso sistemos iškvietimų, ji gali atskleisti vykdymo laiko dinamiką, nepaisant to, ar vykdomos programos kodas yra atidarytas/uždarytas. Galima susidaryti idėją, kodėl programos išmeta klaidą pradėjus naudoti strace.
Panašiai strace padeda suprasti, kodėl programa netikėtai nutrūksta. Todėl „Linux“ branduolio kūrimo ir sistemos administravimo srityje labai svarbu žinoti „strace“.
Sukurkite savo operacinę sistemą naudodami „Linux“ nuo nulio [Linux]
Skaitykite toliau
Susijusios temos
- Linux
- Linux komandos
- Linux branduolys
Apie autorių
Inžinierius ir programinės įrangos kūrėjas, kuris yra matematikos ir technologijų gerbėjas. Jam visada patiko kompiuteriai, matematika ir fizika. Jis sukūrė žaidimų variklių projektus, taip pat mašininį mokymąsi, dirbtinius neuroninius tinklus ir tiesinės algebros bibliotekas. Be to, toliau dirba su mašininiu mokymusi ir tiesinėmis matricomis.
Prenumeruokite mūsų naujienlaiškį
Prisijunkite prie mūsų naujienlaiškio, kad gautumėte techninių patarimų, apžvalgų, nemokamų el. knygų ir išskirtinių pasiūlymų!
Spauskite čia norėdami užsiprenumeruoti