Linux-program frågar
kärna
att göra några saker för dem. De
strace
Command avslöjar dessa systemsamtal. Du kan använda dem för att förstå hur program fungerar och varför de inte gör det.
Kärnan och systemsamtalen
Så smart som de kanske är, kan datorprogram inte göra allt för sig själva. De måste göra förfrågningar om att få vissa funktioner som utförs för dem. Dessa förfrågningar går till Linux-kärnan. Vanligtvis finns det ett bibliotek eller annat programvarugränssnitt som programmet ringer och biblioteket gör det lämpliga förfrågan-kallade ett systemsamtal till kärnan.
Att kunna se systemet kallar att ett program har gjort och vad svaren var kan hjälpa dig att förstå de inre arbeten av program som intresserar dig eller som du har skrivit. Detta är
Vad
strace
göra
. Det kan hjälpa till att felsöka problem och leta efter flaskhalsar.
Detta är inte detsamma som
Felsökning av en ansökan
med ett verktyg som
gdb
. Ett felsökningsprogram låter dig undersöka den interna driften av ett program som det körs. Det låter dig gå igenom logiken i ditt program och inspektera minne och variabla värden. I jämförelse, vad
strace
Fångar systemsamtalsinformationen när programmet är igång. När det spårade programmet avslutas,
strace
Listar systemsamtalsinformationen till terminalfönstret.
Systemsamtal ger alla slags funktionalitet med låg nivå, t.ex. läs- och skrivåtgärder på filer, dödande processer, och så vidare. Det finns en lista över hundratals systemsamtal på syscalls man sida .
RELATERAD: Felsökning med GDB: Komma igång
Installera Strace
Om
strace
är inte redan installerat på din dator, du kan installera det väldigt enkelt.
På Ubuntu, använd det här kommandot:
sudo apt installationstrace
På Fedora skriver du det här kommandot:
sudo dnf installationstrace
På Manjaro är kommandot:
sudo pacman -sy strand
Första steget med Strace
Vi använder ett litet program för att visa
strace
. Det gör inte mycket: det öppnar en fil och skriver en rad text till den, och det har ingen fel kontroll i den. Det är bara en snabb hack så att vi har något att använda med
strace
.
#include & lt; stdio.h & gt;
int huvud (int argc, char argv []) {
// filhandtag
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 (FilegEeek, "Skriv detta till filen");
// stäng filen
fclose (Filegeek);
// Avsluta från programmet
returnera (0);
} // slutet av huvudet
Vi räddade detta i en fil som heter "FILE-IO.C" och sammanställde den med
gcc
in i en körbar kallad
stex
, namngiven för "
st
lopp
ex
riklig."
GCC -O STEX FILE-IO.C
Vi ringer
strace
Från kommandoraden och skicka namnet på vår nya körbara till det som den process som vi vill ha spårat. Vi kan lika enkelt spåra några 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 det
strace
är verbose. Det kan finnas mycket produktion. Det är bra när du använder
strace
i ilska, men det kan vara överväldigande först. Det är begränsat
strace
Utgång för vårt lilla program. Den andra anledningen är att vårt program har begränsad funktionalitet, och källkoden är kort och okomplicerad. Detta gör det lättare att identifiera vilka delar av produktionen av de olika delarna av programmets interna arbete.
Strace ./stex
Vi kan tydligt se
skriva
Systemsamtal Skicka texten "Skriv detta till filen" till vår öppnade fil och
Exit_group
systemsamtal. Detta avslutar alla trådar i applikationen och skickar ett returvärde tillbaka till skalet.
Filtrering av utgången
Även med vårt enkla demonstrationsprogram är det ganska mycket resultat. Vi kan använda
-e
(uttryck) alternativ. Vi skickar i namnet på det systemsamtal som vi vill se.
Strace -e skriv ./stex
Du kan rapportera om flera systemsamtal genom att lägga till dem som en kommaseparerad lista. Inkludera inte någon blankutrymme i listan över systemsamtal.
Strace -e nära, skriv ./stex
Skicka utmatningen till en fil
Fördelen med att filtrera utgången är också problemet med att filtrera utgången. Du ser vad du har bett att se, men du ser inget annat. Och en del av den andra utgången kan vara mer användbar för dig än de saker du har bett att se.
Ibland är det bekvämare att fånga allt och söka och bläddra igenom hela uppsättningen resultat. På det sättet kommer du inte av misstag utesluta något viktigt. De
-o
(Output) Alternativet låter dig skicka utmatningen från a
strace
session till en textfil.
Strace -O Trace-Output.txt ./stex
Du kan då
Använd
mindre
kommando
För att bläddra igenom listan och söka efter systemsamtal - eller något annat-med namn.
Mindre Trace-Output.txt
Du kan nu använda alla
mindre
S sökfunktioner för att undersöka utgången.
RELATERAD: Hur man använder mindre kommando på Linux
Lägga till tidsstämplar
Du kan lägga till flera olika tidsstämplar till utgången. De
-r
(Relativ Timestamps) Alternativ lägger till tidsstämplar som visar tidsskillnaden mellan början av varje successivt systemsamtal. Observera att dessa tidsvärden kommer att innehålla den tid som spenderas i det föregående systemsamtalet och något annat som programmet gjorde före nästa systemsamtal.
Strace -r ./stex
Tidsstämplarna visas i början av varje rad av utgång.
För att se hur mycket tid som spenderas i varje systemsamtal, använd
-T
(syscall-times) alternativ. Detta visar varaktigheten av tiden som spenderas inuti varje systemsamtal.
Strace -t ./stex
Tidsvarna visas i slutet av varje systemsamtalslinje.
För att se den tidpunkt då varje systemsamtal kallades, använd
-TT
(Absolute Timestamps) alternativ. Detta visar tiden "Wall Clock", med en mikrosekond upplösning.
Strace -tt ./stex
Tiderna visas i början av varje rad.
Spåra en löpande process
Om processen du vill spåra redan kan du fortfarande bifoga
strace
till det. För att göra det måste du veta process-id. Du kan
använda sig av
f
med
greppa
att hitta det här. Vi har Firefox-körning. För att ta reda på ID för
fyrfox
process, vi kan använda
f
och
rör det igenom
greppa
.
ps -e | Grep Firefox
Vi kan se att process-id är 8483. Vi använder
-p
(Process ID) alternativ att berätta
strace
vilken process som ska bifogas. Observera att du behöver använda
sudo
:
Sudo Strace -p 8483
Du får se en anmälan som
strace
har bifogat sig för processen, och sedan visas systemets spårsamtal i terminalfönstret som vanligt.
Skapa en rapport
De
-c
(Endast Sammanfattning) Alternativ Orsaker
strace
att skriva ut en rapport. Det genererar ett bord för information om systemsamtal som gjordes av det spårade programmet.
Strace -c ./stex
Kolumnerna är:
- % tid : Procentandelen av den exekveringstid som spenderades i varje systemsamtal.
- sekunder : Den totala tiden som uttryckts i sekunder och mikrosekunder som spenderas i varje systemsamtal.
- usecs / call : Den genomsnittliga tiden i mikrosekunder som spenderas i varje systemsamtal.
- samtal : Antalet gånger som varje systemsamtal utfördes.
- fel : Antalet misslyckanden för varje systemsamtal.
- syscall : Namnet på systemsamtalet.
Dessa värden visar nollor för triviala program som utför och avslutas snabbt. Real-world-värden visas för program som gör något mer meningsfullt än vår demonstrationsapplikation.
Djupt insikter, enkelt
De
strace
Utgången kan visa vilka systemsamtal som görs, vilka görs upprepade gånger och hur mycket exekveringstid spenderas inuti kärnkod. Det är bra information. Ofta, när du försöker förstå vad som händer i din kod, är det 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
, du ser den fullständiga bilden.