Strace gebruiken om systeemoproepen en -signalen te traceren

0
168

Het traceren van een computerprogramma is niet alleen voorbehouden aan degenen die de broncode hebben , kan het lezen en weet hoe je een debugger moet gebruiken. Elke Linux-gebruiker kan een uitvoerbaar bestand traceren met strace. Ontdek hoe!

Wat is strace?

strace is een Linux-hulpprogramma waarmee je de systeemaanroepen van een bepaalde applicatie kunt traceren. Het zal ook signalen oppikken en een gedetailleerde output produceren van alle informatie die het waarneemt.

Een persoon die nieuw is in het traceren en traceren, zou zich in het algemeen kunnen afvragen waarom dit nuttig is. Een professionele IT-ingenieur zou kunnen vragen hoeveel informatie Strace echt kan oppikken, vooral als ze weten hoeveel er kan worden bekeken met een debugger als GDB.

GERELATEERDHoe Linux-signalen werken: SIGINT, SIGTERM en SIGKILL

Als je geïnteresseerd bent in het debuggen van computercode en programma's, bekijk dan ons artikel Debugging with GDB: Getting Started.

In beide gevallen is er goed nieuws! Het traceren van alle systeemoproepen en -signalen geeft een uitgebreid beeld van de werking van een programma, en het is een uitstekend hulpmiddel voor probleemoplossing en zelfs foutopsporing. Bovendien draait het tijdens runtime (als een wrapper-proces), maar kan het gemakkelijk worden getraceerd naar een logbestand en zorgt het voor een gemakkelijk te verwerken overzicht van de acties van een programma.

Als we dit vergelijken met GDB, dat ook een wrapper-proces is, liggen de zaken wezenlijk anders. In GDB zou men bijvoorbeeld een programma stap voor stap kunnen traceren (bijvoorbeeld één regel code per keer of een logisch codeblok—of door breekpunten in de code te gebruiken). Dergelijke stappen worden echter tijdens runtime gemaakt, terwijl strace het programma gewoon als geheel uitvoert totdat er een fout optreedt of totdat deze is voltooid.

De ingenieur of gebruiker kan dan het volledige (tekstgebaseerde) logboek analyseren, naar interessante strings zoeken, enz. Bovendien zou GDB het mogelijk maken om signalen en systeemaanroepen te zien, hoewel het instellen en analyseren van hetzelfde veel meer is complexer dan met strace.

Met strace kun je het programma eenvoudig uitvoeren onder strace (dwz strace some_program), en hoewel dit ongeveer hetzelfde is als GDB, verschilt de bewerking aanzienlijk, zoals hierboven beschreven.

Wat betreft de hoeveelheid informatie die uit een spoor kan worden afgeleid, is het goed om een ​​stap terug te doen en te onthouden waar de meeste computerproblemen vandaan komen: schijf vol, geheugen uitgeput, een bestand is niet gevonden , onjuiste invoer, enz.

Vooral op het gebied van schijftoegang blinkt strace echt uit. Omdat het alle systeemoproepen registreert, is elke schijftoegang goed zichtbaar in het logboek. Nogmaals, je kunt zoeken naar relevante tekststrings en bestandsnamen, maar houd er rekening mee dat strings soms korter kunnen zijn, zodat alleen de gedeeltelijke uitvoer zichtbaar is.

Samenvattend, als we strace moesten beoordelen als een foutopsporings- en/of probleemoplossingstool en het een plaats moesten toewijzen in een nieuwere of meer bekwame Linux-gebruikerstoolbox, dan is het antwoord in beide gevallen ongeveer in het midden, hoewel een beetje meer leunt op het oplossen van problemen dan op debuggen. Laten we nu strace installeren.

GERELATEERD: Hoe Logic Gates werkt: OR, AND, XOR, NOR, NAND, XNOR en NOT

Installatie van strace

Om strace te installerenvoer op uw op Debian/Apt gebaseerde Linux-distributie (zoals Ubuntu en Mint) de volgende opdracht uit in uw terminal:

sudo apt install strace

Om strace

te installeren i> voer op je RedHat/Yum-gebaseerde Linux-distributie (zoals RHEL, Centos en Fedora) het volgende commando uit in je terminal:

sudo yum install strace

Het gebruik van strace

Na het installeren van strace is het vrij eenvoudig om te beginnen. We kunnen bijvoorbeeld het Linux sleep commando/hulpprogramma traceren:

strace sleep 1

Onmiddellijk bewijst de uitvoer de bovenstaande bewering. Er is een overvloed aan informatie over alle acties die worden ondernomen door het (zeer) eenvoudige sleep 1-commando, dat tenslotte slechts acties zijn die een enkele seconde slapen.

Laten we eens kijken op een paar dingen die we onmiddellijk kunnen waarnemen:

access(“/etc/ld.so.preload”, R_OK) = -1 ENOENT (Zo'n bestand of map bestaat niet)

We kunnen zien dat het programma vrij kort na het opstarten probeerde toegang te krijgen (op schijf) tot het bestand /etc/ld.so.preload. We kunnen ook zien dat dit is mislukt (status -1), omdat het bestand niet is gevonden (ENOENT) met de beschrijvende foutmelding Geen bestand of map.

Alleen deze enkele uitvoerregel kan leiden tot verder onderzoek. We kunnen bijvoorbeeld onze favoriete zoekmachine scannen op wat het bestand /etc/ld.so.preload is/doet en wat er gebeurt als een programma het niet kan vinden, en ook hoe we het kunnen installeren.< /p>

Zoals je kunt zien, als je een meer gecompliceerde software/programma onder strace zou uitvoeren, zou je kunnen ontdekken dat het probeert toegang te krijgen tot een bestand, bijvoorbeeld een gedeelde .so-bibliotheek, en dat kan ;t vind het niet. Het is gemakkelijk te analyseren en waarschijnlijk gemakkelijk te repareren dankzij strace.

Vervolgens zien we dat de binaire cache conf.d succesvol wordt geopend als alleen lezen (O_RDONLY), met de close-on-exec-vlag (gebruikt in multithreaded-programma's om race-omstandigheden te vermijden) O_CLOEXEC-vlag ingesteld:

openat(AT_FDCWD, “/etc/ld.so.cache”, O_RDONLY|O_CLOEXEC) = 3

Zelfs als men niet weet wat elk item betekent, zal een eenvoudige online zoekopdracht snel informatie opleveren over elke specifieke term of woord, om de gepresenteerde informatie en wat er gebeurt te begrijpen.

Ook van bijzonder belang is deze regel aan het einde:

+++ afgesloten met 0 +++ < p>Dit geeft aan dat het programma succesvol is afgesloten met exitcode 0. Een exitcode van 0 geeft over het algemeen een succesvolle uitvoering en beëindiging in Linux-programma's aan.

Zoals je kunt zien in de bovenstaande voorbeelden, is het eenvoudig om zien wat een programma doet door strace te gebruiken. Elke regel en zelfs elk woord in elke regel kan worden geanalyseerd, en vaak is een zoekmachine nodig om enig licht te werpen. Zelfs een blik op de uitvoer van een falend programma kan echter voldoende zijn om de exacte oorzaak te vinden en op te lossen, vooral wanneer bijvoorbeeld een vereist bestand ontbreekt, enz.

GERELATEERD : Hoe Linux-runlevels van invloed zijn op actieve services

Onderliggende processen traceren

Bij gebruik van strace lijkt het soms dat strace het niet correct traceren van alle systeemaanroepen van het programma, enz. Dit kan eenvoudig zijn omdat het programma dat wordt getraceerd een aantal onderliggende processen heeft geïnitieerd/gestart, bijvoorbeeld door onderliggende processen te forken.

Het is eenvoudig om deze onderliggende processen in de strace-opname op te nemen: voeg gewoon de -f optie toe aan de opdrachtregel (dwz, strace -f uw_programma), en alle systeemaanroepen, enz., van alle onderliggende processen zullen ook worden gevolgd.

Afronding

In dit artikel hebben we de strace-tool besproken, die kan worden gebruikt om sporen van elk programma te maken of applicatie die draait op een Linux-computer.

Na het installeren van de tool kunnen we het programma eenvoudig en direct starten onder strace en genieten van het hoge niveau van probleemoplossing en foutopsporingsinformatie die de s trace wrapper zal ons presenteren.