20. december

strace

Engang imellem oplever man at man er i gang med at rette konfigurationsfiler til og det tilsyneladende ikke har nogen som helst virkning på det program man nu prøver at sætte op. Eller endnu bedre hvis kun halvdelen af ens ændringer bliver brugt.

Hvad gør man så? Jo, det ville være rart at kunne undersøge hvilke steder programmet leder efter konfigurationsfiler og eventuelt i hvilken rækkefølge.

Dette kan gøres med strace.

Med strace kan man følge hvilke systemkald et program laver mens det bliver udført. Blandt andet kan man finde ud af hvilke filer et program forsøger at tilgå.

Man bruger strace ved at skrive strace foran den kommando man ønsker at undersøge. Det følgende vil undersøge hvad der sker når man skriver ls -la /usr/src

$ strace ls -la /usr/src

Man får temmelig mange informationer, så det kan være rart at gemme disse informationer i en fil, så man i ro og mag kan gennemgå dem. Dette har yderligere den fordel at uddata fra den kommando man undersøger og uddata fra strace ikke blandes sammen. Dette gøres med flaget -o. Følgende vil gøre det samme som før, men gemme uddata fra strace i filen /tmp/ls.strace

$ strace -o /tmp/ls.strace ls -la /usr/src

Det er stadigvæk meget overvældende. Det vil være meget bedre hvis vi kan sorterer præcis de informationer ud vi er interesseret i. Dette kan gøres med flaget -e.

Vi kan vælge kun at få skrevet noget ud når programmet forsøger at åbne en fil. Dette gøres således:

$ strace -e trace=open ls -la /usr/src

Efter trace kan man skrive et hvilket som helst systemkald og få sorteret netop dette systemkald ud. Hvis man er interesseret i filoperationer generelt kan man skrive trace=file

$ strace -e trace=file ls -ls /usr/src

En anden god mulighed er at kunne få information om systemkald, der vedrører netværket. Dette gøres med trace=network.

strace er absolut en af de sortere kommandoer, men det kan spare en mange bekymringer at man lige kan finde ud af hvilke konfigurationsfiler et program læser og hvilken rækkefølge den læser dem i.