Strace hilft Fehler finden

Stephen-Mcsweeny, 123RF

Tief schürfen

Wenn ein Programm partout nicht starten will, aber keine vernünftige Fehlermeldung ausgibt, hilft Strace bei der Suche nach den Ursachen.
Immer größere Datenmassen sicher zu speichern ist eine Herausforderung für jede IT-Infrastruktur. Schon mit Gigabit-Ethernet lassen sich aber ... (mehr)

Ist zur Fehlersuche der Quellcode gerade nicht zur Hand ist, hilft oft das Kommandozeilen-Tool »strace« weiter. Es führt Programme aus und protokolliert die auftretenden Systemaufrufe (System Calls). Selbst wenn alles reibungslos funktioniert, erlaubt Strace einen aufschlussreichen Einblick darüber, was der eine oder andere Hintergrundprozess gerade macht. Dieser Artikel gibt eine Einführung, was Strace alles kann und wie Sie es sinnvoll einsetzen.

Grundsätzlich verwenden Sie Strace einfach, indem Sie es mit der zu untersuchenden Anwendung starten:

strace Programm

Dann schreibt Strace allerdings seine Meldungen auf die Standard-Error-Ausgabe, was schnell etwas unübersichtlich wird. Deshalb weisen Sie es besser mit der Option »-o« dazu an, in eine Logdatei zu schreiben:

strace -o Logdatei Programm

Einige Editoren wie Vim haben einen Syntax-Highlighting-Modus für den Strace-Output und unterlegen die verschiedenen Bereiche der Datei mit unterschiedlichen Farben. Damit ist zumindest am Anfang die komplizierte Ausgabe von Strace etwas leichter zu verstehen.

Perl debuggen

Im ersten Beispiel geht es um ein kleines Perl-Skript, das in Listing 1 zu sehen ist. Für Perl-Unkundige: In der ersten Zeile legt der Schalter »-w« fest, dass der Perl-Interpreter Warnungen ausgeben soll. Die Anweisung »use strict« in der zweiten Zeile weist ihn an, den Quellcode strikter zu überprüfen. Zum Beispiel meldet er dann nicht deklarierte Variablen. Zum Test von Strace sind diese beiden Dinge nicht nötig, aber sie haben sich in der Perl-Praxis bewährt. In Zeile 3 des Skripts gibt schließlich die Print-Anweisung den String »Hello, Perl!\n« aus.

Listing 1

helloworld.pl

 

Haben Sie das Skript in einer Datei gespeichert, geben Sie ihm noch mit »chmod +x« die nötigen Ausführungsrechte. Führen Sie es dann einmal direkt aus, um zu sehen, ob es funktioniert, zum Beispiel »./helloworld.pl« . Entsprechend sieht der Aufruf mit Strace aus:

strace -o strace_perl.out ./helloworld.pl

Wenn Sie die Ausgabe im Editor, beispielsweise in Vim, öffnen, sieht das Ganze etwa aus wie in Abbildung 1 . Strace schreibt jeden Systemaufruf in eine extra Zeile, ähnlich wie den entsprechenden Quellcode in C: Zuerst steht dort der Funktionsname, dahinter folgen in runden Klammern die Argumente, wie auch in Listing 2 zu sehen ist.

Listing 2

Beginn des Perl-Trace

 

Abbildung 1: Vim markiert die Strace-Ausgabe farbig.

In der Strace-Ausgabe für das Perl-Skript ist als Erstes ein Aufruf von »execve()« zu sehen, mit dem Skriptnamen als Argument. In der folgenden Zeile gibt der Aufruf von »uname()« das Betriebssystem und den Hostnamen zurück. Tatsächlich gibt »uname()« einen Pointer auf eine Datenstruktur zurück, aber Strace dekodiert den Inhalt selbstständig für den Anwender. Per Default gibt Strace die Argumente nur teilweise aus, das lässt sich aber mit dem Schalter »-s« ändern.

Syscall-Syntax

Es folgen einige Aufrufe von »access()« , die testen, ob bestimmte Dateien existieren und das Skript auf sie zugreifen darf. In Zeile 4 von Listing 2 überprüft es die Konfigurationsdatei »/etc/ld.so.preload« , wobei der Systemaufruf den Wert -1 und – wenn vorhanden – auch einen Error Code ( »ENOENT« , also etwa "Error, no Entity") zurückgibt. Was das heißt, verrät Strace dahinter in Klammern: »No such file or directory« , die Datei existiert also gar nicht.

Nicht jeder Fehler stellt übrigens ein Problem dar, denn oft testet ein Programm einfach mehrere mögliche Speicherorte einer Konfigurationsdatei oder Library durch, bis es eine existierende findet.

Wie unschwer zu erraten ist, versucht der Syscall »open()« in Zeile 5 die Datei zu öffnen. Klappt das, gibt die Funktion eine positive Zahl zurück, das so genannte File Handle, mit dem sich das Programm im Weiteren auf die geöffnete Datei beziehen kann. Nach den Aufrufen von »fstat()« und »mmap()« , die später noch näher zu erläutern sein werden, schließt »close()« die Datei wieder.

Wenn Sie sich die weitere Ausgabe ansehen, finden Sie noch andere Open-Aufrufe, denen Leseoperationen mit Read folgen. Bei den meisten handelt es sich um dynamische Bibliotheken, die gelesen werden, bevor die eigentliche Skript-Ausführung startet.

Ähnliche Artikel

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023