Kad programmas, kas darbojas operētājsistēmā Linux, vēlas izmantot operētājsistēmas pārvaldītos resursus (failu lasīšana, procesu izveide utt.), tās veic sistēmas izsaukumus uz OS. Sistēmas izsaukumi darbojas kodola līmenī un veic nepieciešamās darbības, atstājot vadību atpakaļ izsaucējai programmai. Strace rīks nodrošina iespēju izsekot šiem sistēmas izsaukumiem operētājsistēmā Linux.

Tipisks strace komandas lietojums

Lai pārraudzītu sistēmas izsaukumus lietojumprogrammai, vienkārši izsauciet komandu ar strace šādā formātā:

strace ls /tmp

Tomēr bieži vien ir procesi, kas sākas daudz agrāk un turpina darboties fonā. Jebkuru problēmu dēļ, iespējams, vēlēsities apkopot papildu informāciju, kas saistīta ar šādiem procesiem. Jūs varat pievienot strace jebkurai darbojošai lietojumprogrammai, norādot procesa procesa ID -lpp parametrs:

strāce - 2759. lpp

Izvade:

Sekojiet līdzi lietotnes pavedieniem un dakšām

Izmantojot strace, varat pārbaudīt visus pavedienus un citus pakārtotos procesus, kas ir lietojumprogrammas dakša, izmantojot -f karogs.

instagram viewer
strace -f -p 2759

Izvade:

Pārbaudiet noteiktus sistēmas zvanus ar strace

Noklusējuma strace izvade dažkārt var būt diezgan pārpildīta. Ja vēlaties izsekot tikai noteiktus sistēmas zvanus, varat to izdarīt, izmantojot -e parametrs:

trace -f -e trace=atvērt, rakstīt, aizvērt, savienot,izvēlieties -lpp 19770

Lai izsekotu tikai sistēmas izsaukumus, kas saistīti ar failu operācijām, izmantojiet -e trace=fails:

strace -e trace=file -p 19770

Lai filtrētu tikai ar tīklu saistītus sistēmas zvanus, norādiet -e trace=tīkls komandā:

strace -e trace=network -p 19770

Saņemiet informāciju par laiku sekundēs

Izvadot sistēmas zvanus, varat izmantot -t parametrs, lai iegūtu informāciju par laiku ar precizitāti sekundēs. Lielāko daļu laika ar precizitāti jūsu vajadzībām nepietiks. Šādās situācijās varat izmantot -tt parametrs, lai iegūtu informāciju par laiku ar mikrosekundes precizitāti:

strace -tt ls /tmp

Apkopojiet statistiku par sistēmas zvaniem

Ar -c parametru, varat apkopot statistiku par sistēmas zvaniem tik ilgi, cik vēlaties:

strace -f -c -p 19770

Saglabājiet žurnālus failā

Ja palaižat strace ilgu laiku un vēlāk vēlaties detalizētāk izpētīt iegūtos žurnālus, jums būs jāsaglabā žurnāli. Ar -o parametru varat norādīt failu, kurā strace jāsaglabā žurnāli:

strace -f -o /tmp/strace.log -e trace=file ls /tmp

ptrace bloķēšanas process

Izmantojot prctl sistēmas izsaukumu, jebkura lietojumprogramma operētājsistēmā Linux var neļaut to kontrolēt lietotājiem, kas nav saknes lietotāji, izmantojot ptrace. Ja lietojumprogramma notīra PR_SET_DUMPABLE atzīmējiet sevi, izmantojot prctl, lietotāji, kas nav root, nevarēs kontrolēt šo lietojumprogrammu ar ptrace, pat ja viņiem ir tiesības signalizēt par lietojumprogrammu.

Viens no šīs funkcijas tipiskākajiem lietojumiem ir redzams OpenSSH autentifikācijas aģenta programmatūrā. Tādējādi lietojumprogrammas kontrole ar citu pieteikumu ar ptrace tiek novērsta lietotāja autentifikācijas laikā.

ptrace un drošība

Tradicionālajā Linux procesa modelī iestatītās izsekošanas iespējas dēļ jebkurai programmatūrai, kuru palaižat savā sistēmā kopā ar lietotāju, ir tiesības tajā ievietot ļaunprātīgu kodu. No vienkāršākā xterm rīka līdz uzlabotas tīmekļa pārlūkprogrammas, šāda ļaunprogrammatūra var pārņemt kontroli pār visām pārējām jūsu darbojošajām lietojumprogrammām, pateicoties ptrace sistēmas izsaukumam, un kopēt svarīgu informāciju jums nemanot.

Reaģējot uz šo situāciju, ko daudzi lietotāji neapzinās, ir izstrādāts aizsardzības mehānisms ar drošības moduli, ko sauc Yama Linux kodolā.

Jūs varat kontrolēt atbildi uz ptrace sistēmas zvanu, izmantojot /proc/sys/kernel/yama/ptrace_scope failu. Pēc noklusējuma šis fails ieraksta vērtību 0.

Ir pieņemamas šādas vērtības:

Vērtība Nozīme
0 Tradicionāla uzvedība: visas lietojumprogrammas, kurām ir tiesības ptrace var pārbaudīt.
1 Ierobežota izsekošana: tikai lietojumprogrammas vai atkļūdošanas lietojumprogrammu tiešais vecākais, ko atļauj lietojumprogramma ar PR_SET_PTRACER opcijai ir kontrole. Tādējādi lietojumi gdb programmas_nosaukums un strace programmas_nosaukums turpinās darboties, taču pēc tam nevarēsit pievienot darbojošos lietojumprogrammu.
2 Ptrace pie sistēmas administratora: tikai programmas ar definētu CAP_SYS_PTRACE īpašums vai pakārtotie procesi, kas definē PTRACE_TRACEME variants ar prctl var kontrolēt.
3 Pilnībā atspējota: Nē ptrace ir atļauts jebkuros apstākļos. Ja šis rekvizīts ir definēts vienreiz, izpildlaikā to vairs nevar mainīt.

Daudzi izstrādātāji nezina, ka lietojumprogrammas var atspējot ptrace, izmantojot prctl, izņemot root lietotāju. Lai gan ar drošību saistīta programmatūra, piemēram, OpenSSH aģents, veic šīs darbības, nebūtu pareizi sagaidīt tādu pašu darbību no visas programmatūras, kas darbojas sistēmā.

Nesen daži Linux izplatījumi ir sākuši iestatīt noklusējuma vērtību ptrace_scope failu, kas aprakstīts iepriekš, uz 1. Tādējādi ar ierobežotām izsekošanas darbībām visā sistēmā tiek nodrošināta drošāka darba vide.

Piemēra streces izmantošana

Reģistrējiet pieteikuma paraugu zemāk ar vārdu ministrace.c. Pēc tam varat to apkopot ar šādu komandu:

gcc-oministraceministrace.c

Kods:

#iekļauts <sys/ptrace.h>
#iekļauts <sys/reg.h>
#iekļauts <sys/wait.h>
#iekļauts <sys/types.h>
#iekļauts <unistd.h>
#iekļauts <stdlib.h>
#iekļauts <stdio.h>
#iekļauts <errno.h>
#iekļauts <string.h>
starptwait_for_syscall(pid_t bērns)
{
starpt statuss;
kamēr (1) {
ptrace (PTRACE_SYSCALL, bērns, 0, 0);
gaidi (bērns, &statuss, 0);
ja (WIFSTOPPED(statuss) && WSTOPSIG(statuss) & 0x80)
atgriezties0;
ja (WIFEXITED(statuss))
atgriezties1;
}
}

starptdo_bērns(starpt argc, char **argv)
{
char *args [argc+1];
memcpy (args, argv, argc * sizeof(char*));
args[argc] = NULL;
ptrace (PTRACE_TRACEME);
nogalināt(getpid(), SIGSTOP);
atgriezties execvp (args[0], args);
}

starptdo_trace(pid_t bērns)
{
starpt statuss, syscall, retval;
gaidi (bērns, &statuss, 0);
ptrace (PTRACE_SETOPTIONS, bērns, 0, PTRACE_O_TRACESYSGOOD);
kamēr(1) {
ja (wait_for_syscall (bērns) != 0) pārtraukums;

syscall = ptrace (PTRACE_PEEKUSER, bērns, sizeof(garš)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", syscall);

ja (wait_for_syscall (bērns) != 0) pārtraukums;

retval = ptrace (PTRACE_PEEKUSER, bērns, sizeof(garš)*RAX);
fprintf (stderr, "%d
", retval);
}
atgriezties0;
}
starptgalvenais(starpt argc, char **argv)
{
ja (argc < 2) {
fprintf (stderr, "Lietošana: %s prog args
", argv[0]);
Izeja(1);
}
pid_t bērns = dakša();
if (bērns == 0) {
atgriezties do_child (argc-1, argv+1);
} cits {
atgriezties do_trace (bērns);
}
}

Pēc lietojumprogrammas kompilēšanas jūs varat palaist jebkuru komandu ar ministrace un pārbaudiet izvadi:

Jūs varat izmantot strace daudziem nolūkiem

strace var palīdzēt atrast kļūdas programmās, kas nevajadzīgi izmanto sistēmas resursus. Tāpat ar strace var atklāt arī īpašību, ko programma parāda, izmantojot operētājsistēmas resursus.

Tā kā strace tieši klausās sistēmas izsaukumus, tas var atklāt izpildlaika dinamiku neatkarīgi no tā, vai palaistās programmas kods ir atvērts/aizvērts. Ir iespējams gūt priekšstatu par to, kāpēc programmas, uzsākot lietot strace, rada kļūdu.

Tāpat strace palīdz saprast, kāpēc programma negaidīti tiek pārtraukta. Tāpēc strace pārzināšana ir ļoti svarīga Linux kodola izstrādē un sistēmas administrēšanā.

Izveidojiet savu operētājsistēmu, izmantojot Linux no jauna [Linux]

Lasiet Tālāk

DalītiesČivinātDalītiesE-pasts

Saistītās tēmas

  • Linux
  • Linux komandas
  • Linux kodols

Par autoru

Fatih Küçükkarakurt (Publicēti 6 raksti)

Inženieris un programmatūras izstrādātājs, kurš ir matemātikas un tehnoloģiju cienītājs. Viņam vienmēr ir patikuši datori, matemātika un fizika. Viņš ir izstrādājis spēļu dzinēju projektus, kā arī mašīnmācīšanos, mākslīgos neironu tīklus un lineārās algebras bibliotēkas. Turklāt turpina strādāt pie mašīnmācības un lineārām matricām.

Vairāk no Fatih Küçükkarakurt

Abonējiet mūsu biļetenu

Pievienojieties mūsu informatīvajam izdevumam, lai saņemtu tehniskos padomus, pārskatus, bezmaksas e-grāmatas un ekskluzīvus piedāvājumus!

Noklikšķiniet šeit, lai abonētu