AA_123rf-13726042_NataliaLukiyanova-123RF.jpg

© Natalia Lukiyanova, 123RF

Mit Strace laufende Programme überwachen

Schlüsselloch

Um abgestürzte oder hängende Prozesse zu untersuchen, kommt normalerweise ein Debugger zum Einsatz. Es geht aber auch anders: Mit Strace sehen Sie Programmen direkt bei der Arbeit zu.

Sicher kennen Sie die Situation: Ein – zumeist recht komplexes – Programm verhält sich ganz und gar nicht so, wie Sie es kennen und erwarten. Plötzlich stürzt es mit einer Reihe völlig unverständlicher Fehlermeldungen ab oder startet gar nicht erst, obwohl es am Vortag noch ohne jedes Problem lief. Sofern Sie zwischenzeitlich kein Update eingespielt haben – und auch keines für die von dem Programm verwendeten Komponenten – gibt es eine gute Chance, dem Problem mit Strace [1] auf die Schliche zu kommen. Falls allerdings doch eine Aktualisierung erfolgte, sollten Sie zunächst prüfen, ob dabei alles korrekt verlief und ob die Konfigurationsdateien noch funktionieren.

Ein routinierter Programmierer dürfte beim Auftreten von Fehlern wohl als Erstes zum Quelltext des Programms greifen, wenn er ein ungewöhnliches Verhalten bemerkt. Bringen Sie dafür zu wenig Erfahrung mit oder fehlt Ihnen schlicht die nötige Leidensfähigkeit – und wer möchte schon gern ein komplexes Programm wie etwa Digikam debuggen? –, dann setzen Sie stattdessen Strace darauf an, zur Laufzeit den Fehler aufzuspüren.

Strace installieren

Nur wenige Distributionen richten Strace voreingestellt mit ein. Unter Debian, Ubuntu und dessen Derivaten spielen Sie das Tool aber über Synaptic oder direkt via sudo apt-get install strace ein. Bei Arch Linux und abgeleiteten Distributionen finden Sie das Paket im Repository Extras.

Grundlagen

Bei Strace ist der Name Programm: Das Tool "traced", also verfolgt, alle Systemaufrufe und Signale. Dazu verändert es die Funktionen so, dass deren Aufruf protokolliert wird. Das erfolgt auf einem von zwei möglichen Wegen: Läuft das zu untersuchende Programm bereits, ermitteln Sie zunächst mittels Top, Ps oder Pidof dessen Prozess-ID (PID), die Sie Strace dann über die Befehlszeilenoption -p mitteilen. Generell erfolgt ein Aufruf dann nach folgendem Schema:

$ strace -p PID ... Optionen

Als einfacher erweist es sich aber, schon vor dem Start des Programms mittels Strace die System-Calls abzufangen. Ein entsprechender Aufruf zeigt folgende Struktur:

$ strace Optionen ... Programm

Beendet sich das mittels Strace beobachtete Programm, so terminiert auch das Tool automatisch.

Viele der Optionen von Strace dienen dazu, die Ausgaben zu beschränken (siehe Tabelle "Wichtige Befehlszeilenoptionen von Strace"). Voreingestellt, also ohne diese Optionen, wirft das Tool alle Systemaufrufe aus, die das beobachtete Programm tätigt. Listing 1 zeigt einen typischen Strace-Aufruf. Als Resultat erhalten Sie dabei eine schier endlos scheinende Liste an dateibezogenen Systemaufrufen, die im Terminal erscheinen. Oft genügt das so Angezeigte schon für eine Diagnose, etwa wenn das Programm terminiert, weil es eine bestimmte Datei nicht findet oder diese nicht lesen kann. Das zeigen dann oft die letzten noch im Terminal vorhandenen Zeilen.

Wichtige Befehlszeilenoptionen von Strace

Option Bedeutung Beschreibung
-b System-Call   Bewirkt, dass sich Strace beim angegebenen System Call löst (derzeit nur execve unterstützt).
-C, -c count time Zählt Systemaufrufe, Fehler und Zeiten, die Strace am Ende der Bearbeitung als Tabelle ausgibt.
-D detached Löst sich vom startenden Terminal.
-e Ausdruck expression Zeigt nur die dem Ausdruck(1) entsprechenden Systemaufrufe.
-E Variable environment Entfernt die angegebene Variable beim Programmstart aus dem Environment.
-E Variable=Wert environment Weist der angegebenen Variablen beim Programmstart einen Wert zu.
-f, -F, -ff fork Berücksichtigt auch alle vom beobachteten Prozess neu erzeugten (Kind-)Prozesse.
-i instruction pointer Zeigt den Instruction Pointer des Systemaufrufs.
-o Datei output Leitet die Ausgaben in die angegebene Datei um, statt sie im Terminal zu zeigen.
-p PID process id Beobachtet einen schon laufenden Prozess mit der angegebenen PID.
-P Pfad path Beschränkt die Ausgaben auf den angegebenen Pfad.
-q, -qq quiet Reduziert die Ausgaben schrittweise.
-t, -tt, -ttt timestamp Gibt zusätzliche Zeitmarken aus.
-T time Zeigt die vom Systemaufruf benötigte Zeit.
-u User user Verwendet beim Programmstart die ID und Gruppe des angegebenen Benutzers.
-v verbose Zeigt anstelle von Abkürzungen voll ausgeschriebene Namen.
-x, -xx hexadecimal Zeigt Nicht-ASCII- beziehungsweise alle Ausgaben hexadezimal.
-y, -yy   Zeigt für Pfade und Sockets die zugehörigen Dateideskriptoren.
(1) siehe Abschnitt "Detektivarbeit"

Einen typischen Fall demonstriert dabei die zweite Zeile von Listing 1, in der Sie den Fehlercode -1 ENOENT (No such file or directory) erkennen. Hier verlief der Versuch erfolglos, auf die Datei /etc/ld.so.preload zuzugreifen. In diesem Fall hatte das keine negativen Folgen, da das Programm damit umzugehen wusste und auf /etc/ld.so.cache auswich (dritte Zeile). Bei weniger fehlertolerant programmierter Software jedoch führt ein solcher Fehler regelmäßig schon zum Absturz.

Listing 1

$ strace -e file bash
execve("/usr/local/bin/bash", ["bash"], [/* 103 vars */]) = 0
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[...]
stat("/home/tst/.bash_history", {st_mode=S_IFREG|0600, st_size=16493, ...}) = 0
open("/home/tst/.bash_history", O_RDONLY) = 3

Rufen Sie es nur mit der Option -pPID auf, kann Strace feststellen, ob ein vermeintlich nicht mehr arbeitendes Programm tatsächlich keine Systemaufrufe mehr tätigt. Arbeitet es stattdessen aber hauptsächlich im RAM, weil es beispielsweise eine Datenbank durchsucht oder sortiert, zeigt Strace das an.

Detektivarbeit

Um einen Nutzen aus den von Strace generierten Ausgaben zu ziehen, müssen Sie etwas (aber oft nicht sehr viel) über die verwendeten Systemaufrufe wissen. Am schnellsten erfahren Sie mehr zu einem Aufruf, indem Sie mittels man dessen Manpage anzeigen lassen, also beispielsweise man 2 stat.

Mit der Option -e Ausdruck aufgerufen, zeigt Strace nur die dem angegebenen Ausdruck entsprechenden Systemaufrufe. Ein solcher Ausdruck weist folgenden Aufbau auf:

Qualifier=[!]Wert1[,Wert2, ...]

Das Ausrufezeichen interpretiert Strace dabei als Negation. Da die Bash dieses Zeichen normalerweise als Sonderzeichen auswertet, müssen Sie es mit einem Backslash maskieren. Als Qualifier erkennt Strace hier auch spezielle Schlüsselwörter, wie etwa file für Dateizugriffe, process für System-Calls des Prozessmanagements, network für Netzwerkzugriffe, signal für Signale und einige weitere, darunter trace (die Vorgabe), abbrev, verbose, raw, read und write. Das hilft, einigermaßen verständliche Befehlszeilen zu konstruieren, die die wesentlichen Features berücksichtigen und damit zielgenau wirken.

TIPP

Zwei besonders wichtige Qualifier für die Option -e von Strace stellen file und open dar. Ersterer umfasst neben open auch noch den Zugriff auf Dateien (access: "Check Users Permissions") und stat ("Get File Status") sowie fakestat (siehe Manpage). Oft genügt es bereits, festzustellen, ob eine bestimmte Datei auch geöffnet wurde.

Die Ausgabe in eine externe Datei (-o Datei) hilft bei der Post-Mortem-Analyse. Da Strace eine normale Textdatei erzeugt, lässt diese sich gut mit dem Editor durchsuchen oder mittels Grep nach relevanten Zeilen durchforsten.

Eine gewisse Vorsicht sollten Sie bei den Fork-Optionen walten lassen: Sie erhöhen den Umfang der Strace-Ausgabe unter Umständen sehr stark, und oft ist nicht mehr klar, welcher Prozess die Ausgaben verursachte. Allerdings gibt es manchmal auch keine Alternative zu diesen Optionen. Durch Kombination der Optionen -ff und -o erzeugt Strace für jeden Kind-Prozess eine eigene Log-Datei des Namens Datei.PID. Dies hilft bei der Auswertung ungemein. Allerdings führt es im Hauptprozess zu Meldungen der Art <unfinished ...> und ... resumed, die sich nicht mehr ganz einfach zuordnen lassen [2].

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 3 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Präzise Kontrolle
    Auf einem typischen Linux-System laufen viele Anwendungen und Dienste gleichzeitig. Mit den richtigen Befehlen verschaffen Sie sich einen Überblick und greifend steuernd ein.
  • Alles im Blick
    Viele Diagnose-Tools verfügen über eine ganz spezielle Syntax. Das erschwert den Umgang und macht die Ausgabe unübersichtlich. Sysdig fasst die wichtigsten Vertreter unter einer einheitlichen Oberfläche zusammen.
  • Mit SHC Bash-Skripte kompilieren
    Der Shell Script Compiler wandelt Skripte in Binärprogramme um. Das schützt vor unbeabsichtigten Veränderungen, birgt aber auch einige Tücken.
  • GNOME und KDE
    In regelmäßigen Abständen erscheinen neue Releases der großen Desktop-Umgebungen KDE und GNOME und lassen den Benutzer mit vielen Fragen allein: Was hat sich geändert, lohnt ein Update und wie machen sich die Kontrahenten im direkten Vergleich?
  • Systemüberwachung auf der Konsole
    Top, der Klassiker zur Unix-Systemüberwachung, hat über die Jahre viele nützliche Ableger angeregt. Sie alle dienen der Überwachung und teilweise auch der Steuerung verschiedenster Vorgänge auf dem Rechner.
Kommentare

Infos zur Publikation

LU 12/2017: Perfekte Videos

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

EasyBCD/NeoGrub
Wolfgang Conrad, 17.12.2017 11:40, 0 Antworten
Hallo zusammen, benutze unter Windows 7 den EasyBCD bzw. NEOgrub, um LinuxMint aus einer ISO Dat...
Huawei
Pit Hampelmann, 13.12.2017 11:35, 2 Antworten
Welches Smartphone ist für euch momentan das beste? Sehe ja die Huawei gerade ganz weit vorne. Bi...
Fernstudium Informatik
Joe Cole, 12.12.2017 10:36, 2 Antworten
Hallo! habe früher als ich 13 Jahre angefangen mit HTML und später Java zu programmieren. Weit...
Installation Linux mint auf stick
Reiner Schulz, 10.12.2017 17:34, 3 Antworten
Hallo, ich hab ein ISO-image mit Linux Mint auf einem Stick untergebracht Jetzt kann ich auch...
Canon Maxify 2750 oder ähnlicher Drucker
Hannes Richert, 05.12.2017 20:14, 4 Antworten
Hallo, leider hat Canon mich weiterverwiesen, weil sie Linux nicht supporten.. deshalb hier die...