Hoe ltrace te gebruiken om bibliotheekoproepen te traceren

0
30

Interessant in het oplossen van de bibliotheekfouten en bugs die je tegenkomt bij het installeren van een coole nieuwe programma op Linux? Bekijk dit artikel dat laat zien hoe je ltrace gebruikt, zodat je beschikt over de tool die nodig is om bibliotheekaanroepen te debuggen.

Wat is een Bibliotheek

Wat is een Bibliotheek

i>?

De meeste mensen zijn bekend met .dll/.DLL-bestanden (Dynamic Link Libraries) in Windows. Het Linux-equivalent is een .so-bestand, een gedeeld object, vaak gewoon bibliotheek genoemd.

Een bibliotheek kan worden gebruikt door een toepassing waardoor dat programma functionaliteit van buiten de programmacode kan gebruiken. Een webserver wil bijvoorbeeld een schijf-I/O-bibliotheek gebruiken die is geschreven door de leverancier van het besturingssysteem of een andere derde partij. Het is een manier om gemeenschappelijke goederen en belangen in de meeste, zo niet alle, besturingssystemen te delen.

Bibliotheken kunnen dynamisch worden geladen tijdens runtime (bijvoorbeeld wanneer het aanroepende programma start), of ze kunnen kan worden gecompileerd tot een doeltoepassing/binair. Ze worden dus altijd geladen (al dan niet gebruikt), als onderdeel van, en wanneer de toepassing wordt gestart waarin ze zijn gecompileerd/ingebouwd.

Als je meer wilt weten over bibliotheken, hun afhankelijkheden en de ldd-tool, lees je misschien hoe je kunt werken met afhankelijkheden van gedeelde objecten in Linux. De ldd-tool is een andere handige tool om in elke meer geavanceerde Linux-gebruikerstoolbox te hebben.

wat is ltrace?

Er zijn verschillende traceerhulpprogramma's in Linux, zoals strace voor het traceren van systeemaanroepen en -signalen en de traceroute voor het traceren van netwerkroutering. Het hulpprogramma/tool ​​ltrace traceert alle bibliotheekaanroepen.

Advertentie

Als je onze werken met afhankelijkheden van gedeelde objecten (bibliotheek) hebt gelezen in het Linux-artikel (hierboven gelinkt), heb je al gezien hoe je kunt achterhalen aan welke bibliotheken een bepaald binair bestand is gekoppeld door de ldd-tool te gebruiken. Het doel en de functionaliteit van ltrace is iets anders; veel in lijn met strace, traceert het ltrace-commando alle bibliotheekaanroepen die een bepaald programma doet terwijl het wordt uitgevoerd.

Net als bij strace, kunnen we een programma starten onder(zie het als een hiërarchie) ltrace. We specificeren eenvoudig het programma dat ltrace moet starten als de eerste optie voor ltrace, en ltrace zal dat programma voor ons starten en onmiddellijk beginnen (op een hoger niveau) om alle oproepen naar (besturingssysteem of geïnstalleerde) bibliotheken te volgen.< /p>

Het doet dit door de dynamische bibliotheekoproepen te onderscheppen en op te nemen die door het programma worden uitgevoerd. Het zal ook alle signalen volgen die naar het programma worden verzonden dat wordt uitgevoerd, zeer vergelijkbaar met strace (en, indien gewenst, kan deze functionaliteit worden uitgeschakeld door de -b of gelijkwaardige optie –no-signals op te geven voor ltrace).

Merk op dat de term dynamiek is hierbij van groot belang; ltrace traceert aanroepen naar externe bibliotheken (in de vorm van .so- of .a-bestanden), d.w.z. bibliotheken die niet direct in een programma zijn gecompileerd; dynamische bibliotheken. Dus als je een binair bestand hebt met statische (gecompileerde) bibliotheken, kan ltrace dergelijke interne oproepen niet zien/traceren.

Installeren < i>ltrace

Om ltrace te installeren op uw op Debian/Apt gebaseerde Linux-distributie (zoals Ubuntu en Mint), voert u de volgende opdracht uit in uw terminal:

sudo apt install ltrace

Advertentie< br>

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

sudo yum install ltrace

Ltrace gebruiken

Laten we een kleine testomgeving opzetten:

sudo apt install tar xz-utils mkdir ~/workspace && cd ~/workspace touch a b c

Hier hebben we tar en xz geïnstalleerd door xz-utils te installeren (je kunt in plaats daarvan sudo yum install tar xz gebruiken als je Centos/RHEL/Fedora gebruikt). Vervolgens hebben we een map ~/workspace gemaakt en erin gesprongen. Vervolgens hebben we drie lege bestanden gemaakt met het touch-commando, namelijk bestanden a, b en c.

Laten we beginnen met het comprimeren van onze drie bestanden in een (tar gecombineerd en xzgecomprimeerd) archive.tar.xz archief, terwijl u hetzelfde uitvoert onder ltrace, en de ltrace-uitvoer observeert:

ltrace tar -hcf –xz archive.tar.xz *

We zien maar een kleine hoeveelheid uitvoer. We kunnen zien dat ons programma succesvol is beëindigd (het archiefbestand is aangemaakt), dwz status 0: een exit-code van 0 betekent altijd succes in Linux (hoewel het programma de exit-codes correct moet hebben geïmplementeerd).

Dit is tot nu toe niet erg handig. Een paar seconden redeneren over hoe teer hier zal werken, zal snel onze volgende aanpak onthullen. De enthousiaste lezer heeft misschien ook begrepen dat het tar-commando intern het xz-commando zou aanroepen. De optie –xz die aan onze tar-opdrachtregel wordt doorgegeven, zorgt ervoor dat het xz-programma wordt gebruikt voor compressie.

Het secundaire proces (of het derde in de algemene hiërarchie), namelijk xz (hiërarchie: ltrace > tar > xz) wordt indien nodig door tar gestart. Als zodanig moeten we de onderliggende processen van het programma traceren dat onder ltrace draait, d.w.z. tar. We kunnen dit doen door de volgende (-f) optie op te geven voor ltrace:

ltrace -f tar -hcf –xz archive.tar.xz * Advertentie

Merk op dat het belangrijk is om de -f optie direct achter ltrace te specificeren en niet later in de commandoregel na bijvoorbeeld tar. De reden is dat we deze optie willen specificeren voor ltrace en niet voor het tar-commando. Alle opties na het tar-commando zijn tar-specifieke opties, terwijl -f een optie is die specifiek is voor ltrace.

De uitvoer is iets interessanter. We zien nog geen bibliotheekaanroepen (in welke vorm dan ook), maar we zien in ieder geval dat er twee subprocessen zijn gevorkt (note exec()) en dat beide subprocessen eindigen met status 0. Handig en allemaal goed.

Dus, waar zijn onze bibliotheekbezoeken? Als we tar en xz (de twee programma's die door de opdracht worden gebruikt om het archiefbestand te maken) controleren met ldd, realiseren we ons al snel dat de meeste bibliotheken die beide programma's gebruiken systeembibliotheken zijn:

whereis tar whereis xz ldd /bin/tar ldd /usr/bin/xz

We moeten dus nog een stap verder gaan en tracering van systeembibliotheekaanroepen mogelijk maken door de -S-optie op te geven voor ltrace. Deze optie is standaard uitgeschakeld/uitgeschakeld omdat de uitvoer een beetje uitgebreid zou worden, en er wordt waarschijnlijk aangenomen dat systeembibliotheken over het algemeen veel stabieler zijn en als zodanig om te beginnen niet getraceerd hoeven te worden. Laten we eens kijken.

ltrace -fS tar -hcf –xz archive.tar.xz *

Of, voor testdoeleinden:

ltrace -fS tar -hcf –xz archive.tar.xz * 2>&1 | head -n10 ltrace -fS tar -hcf –xz archive.tar.xz * 2>&1 | staart -n10

Omdat de output aanzienlijk was, moesten we de eerste en laatste tien regels vastleggen met een kop- en staartcommando. Om deze commando's te kunnen gebruiken, moesten we stderr omleiden naar stdout met behulp van de 2>&1 omleiding, aangezien ltrace standaard rapporteert over stderr. Als je meer wilt weten over omleiding, zie dan Bash Automation and Scripting Basics (Deel 3).

Advertentie

Nu we de optie -S hebben toegevoegd, kunnen we zien dat alle bibliotheken worden geopend. We zien bijvoorbeeld dat /etc/ld.so.preload wordt geopend. De uitvoer is sequentieel (van boven naar beneden), dus als er andere gebeurtenissen tussenin zijn (subverwerking wordt gevorkt, enz.), worden deze inline getoond op het moment dat ze plaatsvinden. We kunnen ook de optie -t toevoegen voor op tijd gebaseerde uitvoer:

Afronding

In dit artikel hebben we het veelzijdige ltrace-programma geïntroduceerd en besproken, een geweldige tool waarmee je alle dynamische bibliotheekaanroepen kunt traceren. een bepaald programma maakt. We hebben ltrace geïnstalleerd, een testomgeving opgezet en enkele ltrace-commando's uitgevoerd met de meest gebruikte opties.