Linux-programma’s vragen de kernel om enkele dingen voor hen te doen. De strace
commando onthult deze systeemaanroepen. U kunt ze gebruiken om te begrijpen hoe programma’s werken en waarom ze soms niet werken.
De kernel- en systeemaanroepen
Hoe slim ze ook zijn, computerprogramma’s kunnen niet alles zelf doen. Zij moeten verzoeken indienen om bepaalde functies voor hen uit te laten voeren. Deze verzoeken gaan naar de Linux-kernel. Meestal is er een bibliotheek of andere software-interface die het programma aanroept, en de bibliotheek doet dan het juiste verzoek – een systeemaanroep genoemd – naar de kernel.
Als u de systeemaanroepen kunt zien die een programma heeft gemaakt en wat de reacties waren, kunt u de innerlijke werking van programma’s die u interesseren of die u hebt geschreven, beter begrijpen. Dit is wat strace
doet. Het kan helpen bij het oplossen van problemen en het zoeken naar knelpunten.
Dit is niet hetzelfde als een applicatie debuggen met een tool als gdb
. Met een foutopsporingsprogramma kunt u de interne werking van een programma onderzoeken terwijl het draait. Hiermee kunt u door de logica van uw programma stappen en geheugen- en variabelewaarden inspecteren. Ter vergelijking, wat? strace
doet is het vastleggen van de systeemaanroepinformatie terwijl het programma wordt uitgevoerd. Wanneer het getraceerde programma eindigt, strace
geeft de systeemoproepinformatie weer in het terminalvenster.
Systeemaanroepen bieden allerlei functionaliteit op laag niveau, zoals lees- en schrijfacties op bestanden, moordprocessen, enzovoort. Er is een lijst met honderden systeemaanroepen op de man-pagina van syscalls.
VERWANT: Foutopsporing met GDB: aan de slag
Strace installeren st
Als strace
nog niet op uw computer is geïnstalleerd, kunt u deze heel eenvoudig installeren.
Gebruik op Ubuntu deze opdracht:
sudo apt install strace
Typ op Fedora dit commando:
sudo dnf install strace
Op Manjaro is het commando:
sudo pacman -Sy strace
Eerste stappen met strace
We zullen een klein programma gebruiken om te demonstreren strace
. Het doet niet veel: het opent een bestand en schrijft er een regel tekst naar, en het bevat geen foutcontrole. Het is maar een snelle hack zodat we iets hebben om mee te gebruiken strace
.
#include <stdio.h> int main(int argc, char argv[]) { // file handle FILE *fileGeek; // open a file called "strace_demo.txt", or create it fileGeek = fopen("strace_demo.txt", "w"); // write some text to the file fprintf(fileGeek, "Write this to the file" ); // close the file fclose(fileGeek); // exit from program return (0); } // end of main
We hebben dit opgeslagen in een bestand met de naam “file-io.c” en gecompileerd met gcc
in een uitvoerbaar bestand genaamd stex
, genoemd naar “stras exruim.”
gcc -o stex file-io.c
We bellen strace
vanaf de opdrachtregel en geef de naam van ons nieuwe uitvoerbare bestand door als het proces dat we willen hebben getraceerd. We kunnen net zo gemakkelijk elk van de Linux-commando’s of elk ander binair uitvoerbaar bestand traceren. We gebruiken ons kleine programma om twee redenen.
De eerste reden is dat strace
is uitgebreid. Er kan veel output zijn. Dat is geweldig als je gebruikt strace
in woede, maar het kan in het begin overweldigend zijn. Er is beperkt strace
output voor ons kleine programma. De tweede reden is dat ons programma beperkte functionaliteit heeft en dat de broncode kort en duidelijk is. Dit maakt het gemakkelijker om te identificeren welke delen van de uitvoer verwijzen naar de verschillende delen van de interne werking van het programma.
strace ./stex
We kunnen duidelijk de write
systeemaanroep verzenden van de tekst “Schrijf dit naar het bestand” naar ons geopende bestand en de exit_group
systeem oproep. Dit beëindigt alle threads in de toepassing en stuurt een retourwaarde terug naar de shell.
De uitvoer filteren
Zelfs met ons eenvoudige demonstratieprogramma is er behoorlijk wat output. We kunnen de -e
(uitdrukking) optie. We geven de naam door van de systeemaanroep die we willen zien.
strace -e write ./stex
U kunt rapporteren over meerdere systeemoproepen door ze toe te voegen als een door komma’s gescheiden lijst. Neem geen spaties op in de lijst met systeemaanroepen.
strace -e close,write ./stex
De uitvoer naar een bestand verzenden
Het voordeel van het filteren van de uitvoer is ook het probleem met het filteren van de uitvoer. Je ziet wat je gevraagd hebt te zien, maar je ziet niets anders. En sommige van die andere output kan nuttiger voor je zijn dan de dingen die je hebt gevraagd om te zien.
Soms is het handiger om alles vast te leggen en door de hele reeks resultaten te zoeken en te bladeren. Zo sluit je niet per ongeluk iets belangrijks uit. De -o
(output) optie laat je de output van a strace
sessie naar een tekstbestand.
strace -o trace-output.txt ./stex
U kunt dan de less
commando om door de lijst te bladeren en op naam te zoeken naar systeemoproepen of iets anders.
less trace-output.txt
U kunt nu alle less
’s zoekmogelijkheden om de uitvoer te onderzoeken.
VERWANT: Hoe de minder opdracht op Linux te gebruiken?
Tijdstempels toevoegen
U kunt verschillende tijdstempels aan de uitvoer toevoegen. De -r
(relatieve tijdstempels) optie voegt tijdstempels toe die het tijdsverschil weergeven tussen het begin van elke opeenvolgende systeemaanroep. Houd er rekening mee dat deze tijdwaarden de tijd omvatten die is besteed aan de vorige systeemaanroep en al het andere dat het programma aan het doen was vóór de volgende systeemaanroep.
strace -r ./stex
De tijdstempels worden weergegeven aan het begin van elke uitvoerregel.
Om de hoeveelheid tijd te zien die aan elke systeemoproep is besteed, gebruikt u de -T
(syscall-tijden) optie. Dit toont de tijdsduur die binnen elke systeemaanroep wordt doorgebracht.
strace -T ./stex
De tijdsduur wordt weergegeven aan het einde van elke systeemoproepregel.
Om het tijdstip te zien waarop elke systeemoproep werd gebeld, gebruikt u de -tt
(absolute tijdstempels) optie. Dit toont de tijd van de “wandklok”, met een resolutie van microseconden.
strace -tt ./stex
De tijden worden aan het begin van elke regel weergegeven.
Een lopend proces traceren
Als het proces dat u wilt traceren al loopt, kunt u nog steeds bijvoegen strace
ernaar toe. Om dit te doen, moet u de proces-ID weten. Je kunt gebruiken ps
met grep
dit te vinden. We hebben Firefox draaiende. Om de ID van de . te achterhalen firefox
proces, kunnen we gebruiken: ps
en pijp het door grep
.
ps -e | grep firefox
We kunnen zien dat de proces-ID 8483 is. We gebruiken de -p
(proces-ID) optie om te vertellen strace
aan welk proces je moet koppelen. Merk op dat je moet gebruiken sudo
:
sudo strace -p 8483
U ziet een melding dat strace
heeft zich aan het proces gehecht en vervolgens worden de systeemtraceeroproepen zoals gewoonlijk in het terminalvenster weergegeven.
Een rapport maken
De -c
(alleen samenvatting) optie oorzaken strace
om een rapport af te drukken. Het genereert een tabel met informatie over de systeemaanroepen die door het getraceerde programma zijn gedaan.
strace -c ./stex
De kolommen zijn:
- % tijd: Het percentage van de uitvoeringstijd dat is besteed aan elke systeemaanroep.
- seconden: de totale tijd uitgedrukt in seconden en microseconden die aan elke systeemaanroep zijn besteed.
- usecs/call: de gemiddelde tijd in microseconden die aan elke systeemaanroep is besteed.
- belt: Het aantal keren dat elke systeemaanroep is uitgevoerd.
- fouten: Het aantal fouten voor elke systeemaanroep.
- syscall: De naam van de systeemoproep.
Deze waarden tonen nullen voor triviale programma’s die snel worden uitgevoerd en beëindigd. Real-world waarden worden getoond voor programma’s die iets zinvoller doen dan onze demonstratietoepassing.
Diepe inzichten, gemakkelijk
De strace
output kan je laten zien welke systeemaanroepen worden gedaan, welke herhaaldelijk worden gedaan en hoeveel uitvoeringstijd wordt besteed aan de code aan de kernelzijde. Dat is geweldige informatie. Vaak, als je probeert te begrijpen wat er in je code gebeurt, vergeet je gemakkelijk dat je binaire bestand bijna non-stop interactie heeft met de kernel om veel van zijn functies uit te voeren.
Door het gebruiken van strace
, ziet u het volledige plaatje.