Open Source im professionellen Einsatz
Linux-Magazin 01/2013
© SV Luma, 123RF

© SV Luma, 123RF

Programm- und Systemabläufe aufzeichnen

Verfolgungsjagd

Laufende Programme verraten nur selten, was sie tatsächlich im Hintergrund anstellen. Glücklicherweise verfolgen pfiffige Werkzeuge das Treiben und protokollieren die aufgerufenen Systemfunktionen. Die vorgestellten Debugger sind für Programmierer und Administratoren gleichermaßen interessant.

1205

Gleich eine ganze Werkzeugklasse hat es sich zur Aufgabe gemacht, die Abläufe und Funktionsaufrufe fertiger Programme und mitunter sogar des kompletten Systems aufzuzeichnen. Die dabei entstehenden Protokolle heißen Traces. Programmierer können mit ihnen rasch nachvollziehen, welche Funktionsaufrufe und Aktionen geradewegs zu einem Fehler oder Abbruch führen. Wiederholte Einträge in den Protokollen weisen zudem auf Race Conditions und Deadlocks hin. Die Debugger helfen ebenfalls beim Reverse Engineering und geben angehenden Kernelentwicklern einen Einblick in typische Abläufe zwischen Userspace und Betriebssystemkern.

Auch Administratoren nutzen die Tools, um herauszufinden, was im System im Einzelnen vorgeht. Die Traces helfen ihnen dabei, verdächtiges Verhalten unter die Lupe zu nehmen. Um beispielsweise herauszufinden, welches Programm regelmäßig mehrere GByte große temporäre Dateien produziert, beobachten sie mit den Debuggern alle Aufrufe der Systemfunktion »open()« und zeichnen sie auf. Ein Blick in die Ausgabe der Debugger gibt anschließend Hinweise auf den Übeltäter.

In dieser Bitparade treten Strace [1], LTTng [2], Systemtap [3] und Dtrace [4] an. Den Auftakt macht der Klassiker, danach folgen die etwas mächtigeren Tools und Dtrace ist das neueste Werkzeug im Test. Alle Kandidaten klinken sich in den Linux-Kernel ein, beobachten dadurch weite Teile des Systems und behalten so etwa auch die Sockets im Auge.

Teilweise schneiden die Debugger den Netzwerkverkehr mit und protokollieren die Prozessorlast beziehungsweise die Rechenzeit einzelner Aktionen. So dienen sie als Profiler für Entwickler und liefern Admins einen Hinweis auf Performance-Engpässe und Flaschenhälse. Den Quellcode der zu inspizierenden Anwendung oder des Kernels benötigen sie nicht – die Analyse funktioniert auf jedem beliebigen Linux-System.

Strace

Zusammen mit den Entwicklerwerkzeugen landet bei fast allen großen Distributionen automatisch das kleine Werkzeug Strace [1] auf der Festplatte. Es protokolliert schlichtweg alle Systemaufrufe (System Calls) einer Anwendung. Dazu übergibt der Anwender auf der Kommandozeile das zu analysierende Programm, in folgendem Beispiel »test« :

strace -o aufrufe.txt ./test

Strace startet es und protokolliert im Standardfehlerkanal (Stderr) alle vom Programm aufgerufenen Systemfunktionen – einschließlich ihrer Parameter und Rückgabewerte – sowie alle vom zugehörigen Prozess empfangenen Signale. Um die Strace-Aufzeichnungen besser analysieren zu können, lenkt der Parameter »-o« sie in eine Textdatei um. Der Debugger setzt über die Aufrufoption »-p« an einem laufenden Prozess wie etwa einem Daemon an.

Abbildung 1 zeigt ein Strace-Ergebnis. In den letzten Zeilen ist gut zu erkennen, dass das kleine C-Programm aus Listing 1 eine Textdatei öffnet, »Hallo Welt!« hineinschreibt und die Datei wieder schließt. Strace protokolliert auch die zahlreichen Speichermanipulationen und die Aufrufe des dynamischen Linkers. In der Informationsflut kann es mitunter recht mühsam sein, die für einen Fehler verantwortlichen Funktionen herauszufischen. Der strikte und einfache Aufbau der Strace-Ausgabe ermöglicht es Anwendern allerdings, sie mit anderen Tools weiterzuverarbeiten und beispielsweise mit Grep nach bestimmten Funktionsaufrufen zu fahnden.

Listing 1

Beispielprogramm in C

01 #include <stdio.h>
02 #include <stdlib.h>
03
04 int main()
05 {
06    FILE *datei;
07
08    /* Datei öffnen */
09    datei = fopen("hallo.txt", "a");
10
11    /* Text in Datei schreiben */
12    fprintf(datei, "Hallo Welt!");
13
14    /* Datei schließen */
15    fclose(datei);
16 }

Abbildung 1: Strace protokolliert alle Systemaufrufe, darunter auch die Speichermanipulationen und das Laden dynamischer Bibliotheken.

Strace selbst bietet nur ein paar einfache Filter. So landen beispielsweise mit dem folgenden Kommando ausschließlich die Aufrufe der Systemfunktionen »open()« und »close()« im Protokoll:

strace -e trace=open,close ./test

Ergänzend wirft der Parameter »-c« eine kleine Statistik aus (siehe Abbildung 2). Der Debugger liefert nicht nur Informationen zu den in den Funktionen genutzten Zeigern, sondern versucht auch sie zu dereferenzieren und die tatsächlichen Werte in das Protokoll zu schreiben. Teilt sich die zu analysierende Anwendung in mehrere Prozesse auf, schreibt er die zugehörige PID vor jeden Protokolleintrag. Auf Wunsch setzt Strace vor jeden Funktionsaufruf einen Zeitstempel und gibt so erste Hinweise auf kriechende Codepassagen.

Abbildung 2: Strace listet in dieser Statistik auf, welche Funktionen das Programm test wie oft aufgerufen hat und wie viele Fehler es dabei gab.

Da Strace lediglich die Systemaufrufe liefert, also die von einem Programm im Kernel aufgerufenen Funktionen erfasst, greifen Anwender am besten zu Ltrace (siehe Kasten "Ltrace"), um die dynamisch hinzugelinkten Bibliotheken zu beobachten – statische bleiben außen vor. So spüren sie Fehler auf, die durch fehlende oder falsche Shared Libraries entstehen.

Ltrace

Ltrace [5] arbeitet im Prinzip ähnlich wie Strace, sogar die Aufrufsyntax und die mitgelieferten Parameter sind oft gleich. Beim Aufruf übergeben die Anwender ebenfalls das Programm, das sie untersuchen möchten: »ltrace ./test« .

Das Ergebnis sieht ähnlich aus wie bei Strace, nur dass Ltrace ausschließlich Funktionsaufrufe aus dynamischen Bibliotheken listet (Abbildung 3). Auf Wunsch notiert das Werkzeug auch nur die Ausgabe bestimmter Bibliotheken. Dank des Parameters »-S« protokolliert der Debugger genau wie Strace die Systemfunktionen und kennzeichnet diese im Trace jeweils durch vorangestelltes »SYS_« .

Abbildung 3: Wie Ltrace beweist, nutzt das kleine Programm test ausschließlich Funktionen aus der Standardbibliothek.

Der Debugger konzentriert sich hauptsächlich auf die dynamisch hinzugelinkten Bibliotheken. Das Tool tritt daher in diesem Test nur außer Konkurrenz an und empfiehlt sich vor allem als Ergänzung zu Strace.

LTTng

Seit 2005 gibt es das "Linux Trace Toolkit next generation", kurz LTTng [2]. Es liegt mittlerweile vielen größeren Distributionen bei; aktuell ist Version 2.0. Der Debugger klinkt sich mit einem Kernelmodul in den Linux-Kern ein, ein Daemon erfasst die vom Modul gesammelten Informationen. Anwender steuern den Daemon mit dem Clientprogramm »lttng« auf der Shell.

Um alle Aufrufe der Systemfunktion »sys_open()« mitzuschneiden, öffnen Anwender zunächst mit »create« eine neue Sitzung und teilen LTTng mit, die Funktion zu observieren. Ein dritter Befehl startet die eigentliche Aufzeichnung. Alle Kommandos benötigen Rootrechte:

lttng create sitzung
lttng enable-event --kernel sys_open --probe sys_open+0x0
lttng start

Sind alle Daten notiert, weisen Anwender den Debugger über zwei weitere Befehle dazu an, die Aufzeichnung zu stoppen und die Sitzung zu beenden:

lttng stop
lttng destroy

LTTng trägt Daten zu bestimmten Kernelereignissen zusammen oder meldet das Erreichen von im Kernel enthaltenen Tracepoints. Die dabei entstehende Datenmenge dürfen Nutzer direkt in LTTng nicht selbst (beispielsweise über Skripte) einstellen – sie erhalten also stets alle oder keine Informationen. Immerhin ist es über so genannte Kontexte möglich, Dinge detaillierter zu erfassen und beispielsweise die PID des auslösenden Prozesses oder die Anzahl der CPU-Takte für ein Ereignis zu notieren.

Der Debugger beobachtet optional auch Programme im Userspace – vorausgesetzt der Anwender hat diese darauf vorbereitet. Wie das funktioniert, haben die LTTng-Entwickler zwar notiert, die Information aber an zahlreichen Stellen in der Dokumentation und in den Beispielen im Quellcode verteilt, sodass es etwas mühsam ist, entsprechende Hinweise aufzustöbern.

Seinen eigenen Programmcode spickt der Benutzer mit Tracepoints, also Punkten, deren Erreichen LTTng später aufzeichnen soll. Alle dazu notwendigen Funktionen stellt die Bibliothek »lttng-ust« bereit, die der Anwender dem Programm folgerichtig hinzulinken muss. Das weitere Vorgehen verläuft analog zur Abfrage des Kernels. So registriert der folgende Befehl beispielsweise alle Tracepoints im Userspace:

lttng enable-event -a -u

Rootrechte sind für die Analyse im Userspace nicht erforderlich, wenn es sich um selbst aufgerufene Programme handelt. Anwendungen unter einer anderen Benutzerkennung verlangen wiederum den Admin-Status.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

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

Linux-Magazin kaufen

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

Deutschland

Ähnliche Artikel

  • Linuxcon Europe: Tracing mit Uprobes

    Auf der Linuxcon Europe hat Elena Zannoni von Oracle die jüngsten Entwicklungen beim Linux-Tracing vorgestellt.

  • Systemtap 3.1 mit Python-Proben

    Das System Tracing and Profiling Framework, kurz Systemtap, kann den Linux-Kernel im laufenden Betrieb untersuchen. In der neuen Version lassen sich in der Skriptsprache von Systemtap-Proben für Python-Funktionen zuordnen.

  • Systemtap 3.0 zeigt sich experimentierfreudig

    Die von Red Hat betreute freie Tracing-Lösung Systemtap ist in Version 3.0 mit einigen experimentellen Monitoring-Features und einem ebenso experimentellen interaktiven Modus erschienen.

  • Junge Pinguinbande

    Das junge Eclipse-Projekt Linux Tools bietet ein Paket aus Plugins, die bekannte Programmierwerkzeuge in die Entwicklungsumgebung einbinden. Einige der Helferlein erleichtern das Entwicklerleben unter Linux bereits jetzt beträchtlich, andere wirken aber noch recht unreif.

     

  • Eclipse Linux Tool integriert LTTng und Gcov

    Version 0.5.0 der Eclipse Linux Tools beheben rund 70 Bugs und bringt zahlreiche neue Funktionen mit.

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.