So verwenden Sie ltrace zum Verfolgen von Bibliotheksaufrufen

0
242

Interessant an der Behebung dieser Bibliotheksfehler und Bugs, die Sie bei der Installation einer coolen neuen Version beobachten Programm unter Linux? Sehen Sie sich diesen Artikel an, der zeigt, wie Sie ltrace verwenden und Sie mit dem Tool ausgestattet, das zum Debuggen von Bibliotheksaufrufen erforderlich ist.

Was ist eine Bibliothek?

Die meisten Leute sind mit .dll/.DLL-Dateien (Dynamic Link Libraries) in Windows vertraut. Das Linux-Äquivalent ist eine .so-Datei, ein Shared Object, das oft nur als Bibliothek bezeichnet wird.

Eine Bibliothek kann von einer Anwendung verwendet werden, die es diesem Programm ermöglicht, Funktionen von außerhalb seines Programmcodes zu nutzen. Ein Webserver möchte beispielsweise eine Platten-E/A-Bibliothek verwenden, die vom Betriebssystemhersteller oder einem anderen Drittanbieter geschrieben wurde. Es ist eine Möglichkeit, gemeinsame Güter und Interessen in den meisten, wenn nicht allen Betriebssystemen zu teilen.

Bibliotheken können entweder dynamisch zur Laufzeit geladen werden (z. B. wenn das aufrufende Programm gestartet wird) oder sie kann in eine Zielanwendung/binär kompiliert werden. Sie werden daher immer geladen (ob verwendet oder nicht), als Teil von und immer dann, wenn die Anwendung gestartet wird, die sie kompiliert/eingebaut hat.

Wenn Sie mehr über Bibliotheken, ihre Abhängigkeiten und das ldd-Tool erfahren möchten, lesen Sie vielleicht, wie Sie unter Linux mit Abhängigkeiten von gemeinsamen Objekten arbeiten. Das ldd-Tool ist ein weiteres praktisches Tool, das in jeder fortgeschritteneren Linux-Benutzer-Toolbox enthalten ist.

was ist ltrace?

Unter Linux gibt es verschiedene Trace-Dienstprogramme wie strace zum Verfolgen von Systemaufrufen und -signalen und Traceroute zum Verfolgen des Netzwerk-Routings. Das Dienstprogramm/Tool ltrace verfolgt alle Bibliotheksaufrufe.

Werbung

Wenn Sie unsere Arbeit mit Shared Object (Library)-Abhängigkeiten im Linux-Artikel (oben verlinkt) gelesen haben, haben Sie bereits gesehen, wie Sie mithilfe des ldd-Tools herausfinden können, mit welchen Bibliotheken eine bestimmte Binärdatei verknüpft ist. Der Zweck und die Funktionalität von ltrace sind etwas anders; Ähnlich wie strace verfolgt der Befehl ltrace alle Bibliotheksaufrufe, die ein bestimmtes Programm während der Ausführung macht.

Ähnlich wie bei strace können wir ein Programm unter . starten(denken Sie an eine Hierarchie) ltrace. Wir geben einfach das Programm an, das ltrace als erste Option für ltrace starten soll, und ltrace wird dieses Programm für uns starten und sofort (auf einer höheren Ebene) damit beginnen, alle Aufrufe von Bibliotheken (Betriebssystem oder von Drittanbietern installierte) zu verfolgen.< /p>

Dies geschieht durch Abfangen und Aufzeichnen der dynamischen Bibliotheksaufrufe, die vom ausgeführten Programm ausgeführt werden. Es verfolgt auch alle Signale, die an das ausgeführte Programm gesendet werden, sehr ähnlich wie strace (und wenn dies gewünscht ist, kann diese Funktionalität deaktiviert werden, indem die Option -b oder die entsprechende Option –no-signals für ltrace angegeben wird).

Beachten Sie, dass der Begriff Dynamik ist hier von großer Bedeutung; ltrace verfolgt Aufrufe an externe Bibliotheken (in Form von .so- oder .a-Dateien), d. h. Bibliotheken, die nicht direkt in ein Programm kompiliert wurden; dynamische Bibliotheken. Wenn Sie also eine Binärdatei mit statisch (kompilierten) Bibliotheken haben, kann ltrace solche internen Aufrufe nicht sehen/verfolgen.

Installation < i>ltrace

Um ltrace auf Ihrer Debian/Apt-basierten Linux-Distribution (wie Ubuntu und Mint) zu installieren, führen Sie den folgenden Befehl in Ihrem Terminal aus:

sudo apt install ltrace

br>

Um ltrace auf Ihrer RedHat/Yum-basierten Linux-Distribution (wie RHEL, Centos und Fedora) zu installieren, führen Sie den folgenden Befehl in Ihrem Terminal aus:

sudo yum install ltrace

Ltrace verwenden

Lasst uns eine kleine Testumgebung einrichten:

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

Hier haben wir tar und xz durch die Installation von xz-utils installiert (Sie können stattdessen sudo yum install tar xz verwenden, wenn Sie Centos/RHEL/Fedora verwenden). Als nächstes erstellten wir ein Verzeichnis ~/workspace und sprangen hinein. Wir haben dann mit dem Touch-Befehl drei leere Dateien erstellt, nämlich die Dateien a, b und c.

Beginnen wir mit der Komprimierung unserer drei Dateien in ein (tar kombiniertes und xzkomprimiert) archive.tar.xz-Archiv, während Sie dasselbe unter ltrace ausführen und die ltrace-Ausgabe beobachten:

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

Wir sehen nur eine kleine Ausgabemenge. Wir können sehen, dass unser Programm erfolgreich beendet wurde (die Archivdatei wurde erstellt), dh Status 0: Ein Exit-Code von 0 bedeutet immer Erfolg unter Linux (obwohl das Programm die Exit-Codes korrekt implementiert haben muss).

Dies ist bisher nicht sehr nützlich. Wenn Sie ein paar Sekunden darüber nachdenken, wie tar hier funktionieren wird, werden Sie schnell unseren nächsten Ansatz erkennen. Der begeisterte Leser hat vielleicht auch verstanden, dass der Befehl tar intern den Befehl xz aufrufen würde. Die Option –xz, die an unsere tar-Befehlszeile übergeben wird, stellt sicher, dass das xz-Programm zur Komprimierung verwendet wird.

Der sekundäre Prozess (oder der dritte in der Gesamthierarchie) nämlich xz (Hierarchie: ltrace > tar > xz) wird bei Bedarf von tar gestartet. Als solche müssen wir die Kindprozesse des Programms verfolgen, das unter ltrace, d. h. tar, läuft. Wir können dies tun, indem wir die folgende Option (-f) für ltrace angeben:

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

Beachten Sie, dass es wichtig ist, die Option -f direkt hinter ltrace anzugeben und nicht später in der Befehlszeile beispielsweise nach tar. Der Grund dafür ist, dass wir diese Option für ltrace und nicht für den tar-Befehl angeben möchten. Alle Optionen nach dem tar-Befehl sind tar-spezifische Optionen, während -f eine für ltrace spezifische Option ist.

Die Ausgabe ist etwas interessanter. Wir beobachten noch keine Bibliotheksaufrufe (in welcher Form auch immer), aber wir sehen zumindest, dass zwei Teilprozesse gegabelt sind (beachte exec()) und dass beide Teilprozesse mit dem Status 0 enden. Praktisch und alles gut.

Also, wo sind unsere Bibliotheksaufrufe? Wenn wir tar und xz (die beiden Programme, die vom Befehl zum Erstellen der Archivdatei verwendet werden) mit ldd überprüfen, stellen wir schnell fest, dass die meisten Bibliotheken, die beide Programme verwenden, Systembibliotheken sind:

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

Wir müssen also noch einen Schritt weiter gehen und das Tracing von Systembibliotheksaufrufen aktivieren, indem wir die Option -S auf ltrace setzen. Diese Option ist standardmäßig deaktiviert/ausgeschaltet, da die Ausgabe etwas ausführlicher werden würde, und es wird wahrscheinlich davon ausgegangen, dass Systembibliotheken im Allgemeinen viel stabiler sind und daher nicht von Anfang an verfolgt werden müssen. Werfen wir einen Blick darauf.

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

Oder zu Testzwecken:

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

Da die Ausgabe beträchtlich war, mussten wir die ersten und letzten zehn Zeilen mit einem Kopf- und Schwanzbefehl erfassen. Um diese Befehle verwenden zu können, mussten wir stderr nach stdout umleiten, indem wir die 2>&1-Umleitung verwenden, da ltrace standardmäßig über stderr berichtet. Wenn Sie mehr über die Umleitung erfahren möchten, lesen Sie die Grundlagen der Bash-Automatisierung und Skripterstellung (Teil 3).

Werbung

Da wir nun die Option -S hinzugefügt haben, können wir sehen, wie auf alle Bibliotheken zugegriffen wird. Zum Beispiel sehen wir, wie auf /etc/ld.so.preload zugegriffen wird. Die Ausgabe erfolgt sequentiell (von oben nach unten), d. h. wenn andere Ereignisse dazwischen liegen (Unterverarbeitung wird gegabelt usw.), werden diese in dem Moment angezeigt, in dem sie stattfinden. Wir könnten auch die Option -t für die zeitbasierte Ausgabe hinzufügen:

Zusammenfassung

In diesem Artikel haben wir das vielseitige ltrace-Programm vorgestellt und diskutiert, das ein großartiges Werkzeug ist, mit dem man alle dynamischen Bibliotheksaufrufe verfolgen kann ein bestimmtes Programm macht. Wir haben ltrace installiert, eine Testumgebung eingerichtet und einige ltrace-Befehle mit den am häufigsten verwendeten Optionen ausgeführt.