Linux-programmer spør
[1. 3]
kjernen
å gjøre noen ting for dem. De
strace.
kommandoen avslører disse systemanropene. Du kan bruke dem til å forstå hvordan programmer fungerer og hvorfor, noen ganger, de gjør det ikke.
Kjernen og systemet ringer
Så smart som de kanskje er, kan dataprogrammer ikke gjøre alt for seg selv. De trenger å gjøre forespørsler om å få visse funksjoner som utføres for dem. Disse forespørslene går til Linux-kjernen. Vanligvis er det et bibliotek eller et annet programvaregrensesnitt som programmet ringer, og biblioteket gjør deretter det riktige forespørsels-kalt et systemanrop til kjernen.
Å kunne se systemet samtaler at et program har gjort, og hva svarene var kan hjelpe deg å forstå de indre arbeidene til programmer som interesserer deg eller som du har skrevet. Dette er
hva
strace.
gjør
. Det kan bidra til å feilsøke problemer og se etter flaskehalser.
Dette er ikke det samme som
feilsøking av en søknad
med et verktøy som
GDB.
. Et feilsøkingsprogram lar deg undersøke den interne driften av et program som det kjører. Det lar deg gå gjennom logikken til programmet ditt og inspisere minne og variable verdier. Til sammenligning, hva
strace.
Fanges det systemanropsinformasjonen som programmet kjører. Når det sporede programmet avsluttes,
strace.
Viser systemanropsinformasjonen til terminalvinduet.
Systemanrop gir all slags lavt nivå funksjonalitet, for eksempel lese og skrive handlinger på filer, drepe prosesser og så videre. Det er en liste over hundrevis av systemanrop på Syscalls manns side .
I SLEKT: Feilsøking med GDB: Komme i gang
Installere Strace.
Hvis
strace.
Er ikke allerede installert på datamaskinen din, du kan installere den veldig enkelt.
På Ubuntu, bruk denne kommandoen:
sudo apt installere strace
På Fedora, skriv inn denne kommandoen:
Sudo DNF Installer Strace
På Manjaro er kommandoen:
Sudo Pacman -Sy Strace
Første trinn med strace
Vi bruker et lite program for å demonstrere
strace.
. Det gjør ikke mye: Den åpner en fil og skriver en tekstlinje til den, og den har ingen feilkontroll i den. Det er bare en rask hack, slik at vi har noe å bruke med
strace.
.
#include & lt; stdio.h & gt;
INT Main (Int Argc, Char Argv []) {
// filhåndtak
Fil * FileGeek;
// Åpne en fil kalt "Strace_Demo.txt", eller opprett det
FileGeek = FOPEN ("STRACE_DEMO.TXT", "W");
// Skriv litt tekst til filen
fprintf (FileGeek, "Skriv dette til filen");
// Lukk filen
fclose (fileek);
// utgang fra programmet
returnere (0);
} // End of Main
Vi lagret dette inn i en fil kalt "fil-io.c" og samlet den med
GCC.
inn i en kjørbar kalt
Stex.
, oppkalt for "
St.
løp
Ex.
rikelig. "
GCC -O STEX FILE-IO.C
Vi ringer til
strace.
Fra kommandolinjen og send navnet på vår nye kjørbare til den som prosessen vi vil ha sporet. Vi kunne like enkelt spore noen av Linux-kommandoene eller andre binære kjørbare. Vi bruker vårt lille program av to grunner.
Den første grunnen er at
strace.
er verbose. Det kan være mye utgang. Det er flott når du bruker
strace.
i sinne, men det kan være overveldende i begynnelsen. Det er begrenset
strace.
Utgang for vårt lille program. Den andre grunnen er at vårt program har begrenset funksjonalitet, og kildekoden er kort og grei. Dette gjør det lettere å identifisere hvilke deler av utgangen som refererer til de ulike delene av programmets interne arbeid.
Strace ./stex
Vi kan tydelig se
skrive
Systemanrop Sende teksten "Skriv dette til filen" til vår åpne fil og
exit_group.
Systemanrop. Dette avslutter alle tråder i programmet og sender en returverdi tilbake til skallet.
Filtrerer utgangen
Selv med vårt enkle demonstrasjonsprogram, er det ganske mye produksjon. Vi kan bruke
-E
(Expression) -alternativet. Vi sender inn navnet på systemanropet som vi vil se.
Strace -e skrive ./stex
Du kan rapportere om flere systemanrop ved å legge til dem som en kommaseparert liste. Ikke ta med noe hvitt i listen over systemanrop.
Strace -e Lukk, skriv ./stex
Sende utgangen til en fil
Fordelen med å filtrere utgangen er også problemet med å filtrere utgangen. Du ser hva du har bedt om å se, men du ser ikke noe annet. Og noe av den andre utgangen kan være mer nyttig for deg enn de tingene du har bedt om å se.
Noen ganger er det mer praktisk å fange alt og søke og bla gjennom hele settet med resultater. På den måten vil du ikke ved et uhell utelukke noe viktig. De
-o
(Output) -alternativet lar deg sende utgangen fra a
strace.
økt til en tekstfil.
Strace -o Trace-Output.txt ./stex
Du kan da
bruke
mindre
kommando
For å bla gjennom oppføringen og søk etter systemanrop - eller noe annet - ved navn.
Mindre Trace-Output.txt
Du kan nå bruke alle
mindre
S søkemuligheter for å undersøke produksjonen.
I SLEKT: Slik bruker du den mindre kommandoen på Linux
Legge til tidsstempler
Du kan legge til flere forskjellige tidsstempler til utgangen. De
-R
(Relative Timestamps) -alternativet legger til tidsstempler som viser tidsforskjellen mellom starten på hvert påfølgende systemanrop. Merk at disse tidsverdiene vil inneholde tiden som brukes i forrige systemanrop og noe annet som programmet gjorde før neste systemanrop.
Strace -r ./stex
Timestampene vises ved starten av hver linje med utgang.
For å se hvor mye tid brukt i hvert systemanrop, bruk
-T.
(Syscall-Times) alternativet. Dette viser varigheten av tiden som brukes i hvert systemanrop.
Strace -t ./stex
Tidsperioden er vist på slutten av hver systemanropslinje.
For å se tiden der hvert systemanrop ble kalt, bruk
-t.
(Absolutt Timestamps) alternativet. Dette viser tiden "Wall Clock", med en mikrosekundoppløsning.
Strace -tt ./stex
Tider vises ved starten av hver linje.
Tracing en løpende prosess
Hvis prosessen du vil spore, kjøres, kan du fortsatt legge ved
strace.
til det. For å gjøre det, må du vite prosess-IDen. Du kan
bruk
PS.
med
Grep
å finne dette. Vi har Firefox i gang. For å finne ut IDen til
Firefox.
prosess, vi kan bruke
PS.
og
rør det gjennom det
Grep
.
ps -e | grep firefox
Vi kan se at prosess-IDen er 8483. Vi bruker
-P.
(Process ID) -alternativet for å fortelle
strace.
hvilken prosess for å feste til. Merk at du må bruke
sudo.
:
Sudo Strace -P 8483
Du vil se et varsel om at
strace.
Har festet seg til prosessen, og deretter vises systemsporanropene i terminalvinduet som vanlig.
Opprette en rapport
De
-C.
(kun oppsummering) Alternativ forårsaker
strace.
å skrive ut en rapport. Det genererer et bord for informasjon om systemanropene som ble gjort av det sporede programmet.
Strace -C ./stex
Kolonnene er:
- % tid : Prosentandelen av utførelsestiden som ble brukt i hvert systemanrop.
- sekunder : Den totale tiden uttrykt i sekunder og mikrosekunder brukt i hvert systemanrop.
- bruker / samtale : Den gjennomsnittlige tiden i mikrosekunder brukt i hvert systemanrop.
- Samtaler : Antall ganger som hvert systemanrop ble henrettet.
- feil : Antall feil for hvert systemanrop.
- Syscall. : Navnet på systemanropet.
Disse verdiene vil vise nuller for trivielle programmer som utfører og avsluttes raskt. Real-World-verdier vises for programmer som gjør noe mer meningsfylt enn vår demonstrasjonsapplikasjon.
Dyp innsikt, enkelt
De
strace.
Output kan vise deg hvilke systemanrop som blir gjort, hvilke som blir gjort gjentatte ganger, og hvor mye kjøretid blir brukt i kjerne-side-koden. Det er flott informasjon. Ofte, når du prøver å forstå hva som skjer i koden din, er det lett å glemme at din binære samhandler nesten nonstop med kjernen for å utføre mange av sine funksjoner.
Ved bruk av
strace.
, ser du det komplette bildet.