Bericht: Vortrag "Debuggen mit Strace" am 16.03.04
Peter Voigt
Peter.Voigt1 at gmx.net
Tue Mar 16 12:38:12 CET 2004
Hallo allerseits,
ich möchte von dem Treffen der Lug Owl von Montagabend berichten:
Wer kennt das nicht: Ein Linux-Programm läuft nicht so, wie es eigentlich
sollte. Und die Ursache ist unbekannt.
Helfen Manpages und Änderungen der Aufrufparameter nicht weiter, sind Tools
gefragt, die tiefere Einblicke ermöglichen.
An dieser Stelle kommt strace ins Spiel. Weil der Einsatz von strace keine
besonderen Vorkehrungen benötigt, kann jedes Programm untersucht werden.
Darin unterscheidet sich strace von Debuggern. Ihr Einsatz ist sinnvoll, falls
das zu untersuchende Programm dafür vorbereitet ist.
Programme, die von kommerziellen Firmen stammen, enthalten selten
Debbuging-Informationen. Solche Firmen lassen sich eben nicht so gerne in die
Karten schauen.
(Unter Linux kann man das aber nicht wirklich verhindern. Das stellte sich an
diesem Abend heraus).
Strace gewährt im Regelfall keinen Einblick in die Semantik eines Programmes.
Dafür setzt man Disassembler ein. Das Diassemblieren ist aber aufwendig und
setzt Kenntnisse der Maschinenprogrammierung voraus.
Deshalb sind häufig lstrace oder strace das Mittel der Wahl.
Ltrace geht einen Schritt weiter als strace. Ltrace listet alle internen
Funktionsaufrufe, strace nur die Betriebssystemaufrufe. Ltrace arbeitet daher
genauer, erzeugt aber auch viel mehr Output bis hin in den Megabyte-Bereich.
Das Mehr an Informationen verstellt mitunter den Blick auf das eigentlich
Wichtige. Deshalb startet man am besten mit strace.
Strace spiegelt das Geschehen an der Schnittstelle zwischen Programm und
Betriebsystem wieder. In vielen Fällen erlaubt dieses Geschehen einen
Rückschluß auf die Funktionsweise des fraglichen Programmes.
Versucht das Programm beispielsweise, eine nicht nicht vorhandene Datei zu
öffnen, könnte es daran liegen, dass das Programm im falschen Verzeichnis
sucht. Und das könnte daran liegen, dass das Programm im falschen Verzeichnis
gestartet oder der Suchpfad in der Variablen PATH falsch gesetzt wurde.
Solche Schlüsse zu ziehen, sind das tägliche Brot beim Einsatz von strace.
Dafür bietet strace eine Fülle von Ausgangsinformationen. Man kann genau
erkennen, wann und wie welche Dateien, Bibliotheken, Betriebssystemfunktionen
und dergleichen benutzt werden.
Ist man sich darüber im Klaren, wie das fragliche Programm prinzipiell
funktionieren müßte, kann man die Stelle, an der es hakt, lokalisieren. So
werden Rückschlüsse auf Fehlerursachen möglich.
Wie man dabei systematisch vorgeht, war Thema des Vortrages von Jan-Benedict
Glaw. In seiner überaus kompetenten Art beleuchtete er das Thema von allen
Seiten.
Ausgehend von der Funktionsweise von strace definierte er den Einsatzraum und
die Grenzen der Erkenntnismöglichkeiten, um sodann anhand mehrerer Beispiele
die Vorgehensweise bei der Analyse praktisch vorzustellen.
Das typische Ablaufmuster eines Linux-Programmes, beginnend mit dem Aufruf
über die Shell, das Allozieren des Hauptspeichers, das Laden des
Programmcodes, das Nachladen der benötigten Libraries, das Einbinden von
Eingabe- und Ausgabeprozeduren, das Nutzen von Files und Hardwarekomponenten
stellte JBG anhand der strace-Ausgaben so plastisch dar, das es leicht
nachzuvollziehen war.
Detailiert ging JBG darauf ein, wie die Ausgabe von strace zu interpretieren
ist, welche Rückschlüsse auf das zu untersuchenden Programmes möglich und wo
weitere Informationen im Linuxsystem zu finden sind.
Am Schluß zeigte sich, dass mit der Beobachtung einer Handvoll
Betriebssystemaufrufe über strace das Geschehen an der Schnittstelle zwischen
Betriebssystem und Programm sehr genau erfaßt werden kann (vgl. angehängte
Liste).
Mit der entsprechenden Option von strace oder durch den Einsatz von grep kann
die Datenfülle erheblich reduziert werden, so dass nichts mehr von der
Analyse ablenkt.
Die Zuhörer zu dieser Erkenntnis zu führen, ohne sie zu überfordern und ohne
sich durch die vielen Fragen von seinem roten Faden ablenken zu lassen,
zeichnet den Vortragsstil von JBG aus. Die Fülle seiner praktischen Tipps
werden manchen Zuhörer stundenlanges Suchen und Grübeln ersparen.
Und so ganz nebenbei und völlig unauffällig gewannen die Zuhören einen tiefen
Einblick in das interne Geschehen von Linux. So hat JBG an diesen Abend zwei
Fliegen mit einer Klappe geschlagen.
Kein Wunder, dass die Diskussion erst mitten in der Nacht endete.
Dank der Organisation von Thomas Balls-Thies stand ein Computerraum im ZiF
zur Verfügung. Bei dem Zif handelt es sich um ein der Universität Bielefeld
angegliedertes Institut. Die Atmosphäre des Zif's eignet sich für einen
solchen Vortrag perfekt.
Ich erlaube mir, im Namen aller Teilnehmer zu sprechen, wenn ich beiden für
ihren gelungenen Einsatz gratuliere.
Grüße
Peter Voigt
--------------------------------------------------------------------
Liste der wichtigsten Betriebssystemfunktionen, die beispielsweise über
strace -e trace=........ (alternativ mit Hilfe von grep .......)
gefiltert werden können:
open/close
Datei öffnen/schließen
read/write/send/recv/sendto/recvfrom
Lesen/Schreiben von/an einen Datei-Descriptor
mmap
Datei-Bereiche im Speicher sichtbar machen
fork
Programm duplizieren
exec
Ein anderes Programm starten; das ehemalige Programm geht dabei "seinen
letzten Gang"
exit
Programm beenden, Return-Wert hinterlassen
stat/fstat/lstat
Datei-Eigenschaften (Größe, Device Node?, ...) abfragen
pipe
Kommunikations-Kanal (Strohhalm mit zwei Enden) erstellen
dup2
Gezielt einen Datei-Descriptordurch einen anderen ersetzen
wait
Kindesleichen wegräumen (sonst gibt's Zombies)
socket
Netzwerk-"Henkel" erzeugen
connect
Ziel für Netzwerk-Verbindung festlegen
bind/listen/accept
(Serverseitig) Verbindungen annehmen
poll/select
Prüfen, ob von einem Datei-Descriptor Daten gelesen werden können.
More information about the Linux
mailing list