Hur man använder strace för att övervaka Linux-systemanrop

0
152
fatmawati achmad zaenuri/Shutterstock.com

Linux-program ber kärnan att göra några saker för dem. Strace-kommandot avslöjar dessa systemanrop. Du kan använda dem för att förstå hur program fungerar och varför de ibland inte gör det.

The Kernel and System Calls

Så smarta som de kan vara, kan datorprogram inte göra allt för sig själva. De måste begära att vissa funktioner ska utföras för dem. Dessa förfrågningar går till Linux-kärnan. Vanligtvis finns det ett bibliotek eller annat mjukvarugränssnitt som programmet anropar, och biblioteket gör sedan en lämplig begäran som kallas ett systemanrop till kärnan.

Att kunna se systemanropen som ett program har gjort och vad svaren var kan hjälpa dig att förstå de inre funktionerna i program som intresserar dig eller som du har skrivit. Detta är vad strace gör. Det kan hjälpa till att felsöka problem och leta efter flaskhalsar.

Det här är inte samma sak som att felsöka ett program med ett verktyg som gdb. Med ett felsökningsprogram kan du undersöka hur ett program fungerar internt när det körs. Det låter dig gå igenom programmets logik och inspektera minne och variabla värden. Som jämförelse, vad strace gör är att fånga systemets samtalsinformation när programmet körs. När det spårade programmet avslutas listar strace information om systemanropet till terminalfönstret.

Systemanrop ger alla möjliga funktioner på låg nivå, till exempel läs- och skrivåtgärder på filer, dödprocesser och så vidare . Det finns en lista över hundratals systemanrop på manussidan för syscalls.

RELATERAD: Felsökning med GDB: Komma igång

Installera strace

Om strace inte redan är installerad på din dator kan du installera den mycket enkelt.

På Ubuntu använder du det här kommandot:

sudo apt install strace

På Fedora skriver du det här kommandot:

sudo dnf install strace

På Manjaro är kommandot:

sudo pacman – Sy strace

Första steg med sträcka

Vi använder ett litet program för att visa strace. Det gör inte mycket: Det öppnar en fil och skriver en textrad till den, och den har inget felkontroll i den. Det är bara ett snabbt hack så att vi har något att använda med strace.

# inkludera & lt; stdio.h & gt; int main (int argc, char argv []) {//file handle FILE * fileGeek; //öppna en fil som heter “strace_demo.txt”, eller skapa den fileGeek = fopen (“strace_demo.txt”, “w”); //skriv lite text till filen fprintf (fileGeek, “Skriv detta till filen”); //stäng filen fclose (fileGeek); //avsluta programretur (0); } //slutet av huvud

Vi sparade detta i en fil som heter & # 8220; file-io.c & # 8221; och kompilerade den med gcc till en körbar som heter stex, namngiven efter & # 8220; st race ex riklig. & # 8221;

gcc -o stex-fil- io.c

Vi kommer att ringa strace från kommandoraden och vidarebefordra namnet på vår nya körbar till den som den process som vi vill ha spårat. Vi kan lika enkelt spåra någon av Linux-kommandona eller någon annan binär körbar. Vi använder vårt lilla program av två skäl.

Den första anledningen är att strace är detaljerad. Det kan vara mycket produktion. Det är bra när du använder strace i ilska, men det kan vara överväldigande först. Det finns ett begränsat resultat för vårt lilla program. Den andra anledningen är att vårt program har begränsad funktionalitet, och källkoden är kort och enkel. Detta gör det lättare att identifiera vilka delar av utdata som refererar till de olika delarna av programmets interna arbete.

strace ./stex

Vi ser tydligt att skrivsystemets samtal skickar texten & # 8220; Skriv detta till filen & # 8221; till vår öppnade fil och systemanropet exit_group. Detta avslutar alla trådar i applikationen och skickar ett returvärde tillbaka till skalet.

Filtrering av utdata

Även med vårt enkla demonstrationsprogram finns det en hel del utdata. Vi kan använda alternativet -e (uttryck). Vi skickar i namnet på systemanropet som vi vill se.

strace -e skriv ./stex

Annons

Du kan rapportera om flera systemanrop genom att lägga till dem som en kommaseparerad lista. Ta inte med något mellanslag i listan över systemanrop.

strace -e stäng, skriv ./stex

Skicka utdata till en fil

Fördelen med att filtrera utdata är också problemet med att filtrera utdata. Du ser vad du har bett om att se, men du ser inget annat. Och en del av den andra produktionen kan vara mer användbar för dig än de saker du har bett om att se.

Ibland är det bekvämare att fånga allt och söka och bläddra igenom hela uppsättning resultat. På det sättet kommer du inte av misstag att utesluta något viktigt. Med alternativet -o (output) kan du skicka utdata från en strace-session till en textfil.

strace -o trace-output.txt ./stex

Du kan sedan använda kommandot mindre för att bläddra igenom listan och söka efter systemsamtal & # 8212; eller något annat & # 8212; vid namn.

mindre spårning-output.txt

Du kan nu använda alla mindre sökfunktioner för att undersöka utdata.

< img src = "http://www.howtogeek.com/pagespeed_static/1.JiBnMqyl6S.gif" />

RELATERAD: Hur man använder mindre kommando på Linux

Lägga till tidsstämplar

Du kan lägga till flera olika tidsstämplar i utgången. Alternativet -r (relativa tidsstämplar) lägger till tidsstämplar som visar tidsskillnaden mellan början av varje efterföljande systemanrop. Observera att dessa tidsvärden kommer att inkludera tiden i föregående systemanrop och allt annat som programmet gjorde innan nästa systemanrop.

strace -r ./stex

Annons

Tidsstämplarna visas i början av varje utgångsrad.

< p> Använd alternativet -T (syscall-times) för att se hur mycket tid som spenderas i varje systemanrop. Detta visar längden på tiden i varje systemanrop.

strace -T ./stex

Tidsperioderna visas i slutet av varje systemanropslinje.

För att se den tidpunkt då varje systemanrop anropades, använd -tt (absolut tidsstämplar) alternativ. Detta visar & # 8220; väggklockan & # 8221; tid, med en mikrosekundupplösning.

strace -tt ./stex

< p> Tiderna visas i början av varje rad.

< h2 id = "tracing-a-running-process">Spåra en pågående process

Om processen som du vill spåra redan körs kan du fortfarande fästa strace till den. För att göra det måste du känna till process-ID. Du kan använda ps med grep för att hitta detta. Vi har Firefox igång. För att ta reda på ID för Firefox-processen kan vi använda ps och leda det genom grep.

ps -e | grep Firefox

Annons

Vi kan se att process-ID: t är 8483. Vi kommer att använda alternativet -p (process ID) för att berätta vilken process som ska kopplas till. Observera att du måste använda sudo:

sudo strace -p 8483

Du kommer att se en avisering om att strace har kopplat sig till processen och sedan kommer systemspårningssamtal att visas i terminalfönstret som vanligt.

Skapa en rapport

Alternativet -c (endast sammanfattning) gör att du kan skriva ut en rapport. Den genererar en tabell för information om de systemanrop som gjordes av det spårade programmet.

strace -c ./stex

Kolumnerna är:

  • % tid : Andelen körningstid som spenderades i varje systemanrop .
  • sekunder : Den totala tiden uttryckt i sekunder och mikrosekunder som spenderas i varje systemanrop.
  • usecs/call : Den genomsnittliga tiden i mikrosekunder som spenderas i varje systemanrop.
  • samtal : Antalet gånger som varje systemanrop genomfördes.
  • fel : Antalet fel för varje systemanrop.
  • syscall : Namnet på systemanropet.

Dessa värden visar nollor för triviala program som körs och avslutas snabbt. Verkliga värden visas för program som gör något mer meningsfullt än vår demonstrationsapplikation.

Djupa insikter, enkelt

Sträckan output kan visa vilka systemanrop som görs, vilka som görs upprepade gånger och hur mycket exekveringstid som spenderas i kärnkodssidan. Det är bra information. När du försöker förstå vad som händer i din kod är det ofta lätt att glömma att din binära interagerar nästan nonstop med kärnan för att utföra många av dess funktioner.

Genom att använda strace ser du hela bilden.

LÄS NÄSTA

  • & rsaquo; Så här fixar du & # 8220; Den här datorn kan inte köra Windows 11 & # 8221;
  • & rsaquo; Windows 11: Vad är nytt i Microsofts nya operativsystem
  • & rsaquo; Vilka är de minsta systemkraven för att köra Windows 11?
  • & rsaquo; Så här kontrollerar du om din Windows 10-dator kan köra Windows 11
  • & rsaquo; Hur man använder handgester med Google Nest Hub