- Abraxas - http://www.effinger.org/blog -

Mit strace prüfen, was ein Programm so treibt

Manchmal kommt man mit Fehlermeldungen von Programmen einfach nicht weiter. Bevor man jedoch im Trial- und Errorverfahren Konfigurationsparameter ausprobiert, um dem Fehler auf die Spur zu kommen oder gleich ein alternatives Programm wählt, kann man strace bemühen. Dieses kleine Programm erlaubt es Systemaufrufe eines Programmes zu protokollieren.

Die wichtigsten Parameter von strace

Ein beispielhafter Aufruf sieht dann so aus

strace -o logfile.log -f ./mycommand -mycommandparameter

Im Folgenden sind einige nützliche Beispiele für spezielle Programmaufrufe aufgeführt.

Auf welche Dateien greift ein Programm zu?

strace -e trace=open -o logfile.log ./mycommand -mycommandparameter

Das habe ich mir von NetAdminTools [1] abgeschaut.

Welche Programme startet/pausiert/beendet das Programm?

strace -e trace=process -o logfile.log ./mycommand -mycommandparameter

Wie protokolliere ich die Systemaufrufe eine Programms, das schon gestartet ist?

Hierfür gibt es den Parameter -p von strace, mit dem man die entsprechende Prozess-ID des Programms an strace übergibt. Um diese ID herauszufinden bemüht man zunächst ps, welches mit dem folgenden Befehl die IDs aller laufenden Prozesse mit dem Namen mycommand auflistet.

ps aux | grep mycommand | grep -v grep mycommand

Wer es kürzer haben möchte, sollte sich meine bashrc [2] anschauen, in der eine Funktion pg definiert ist, die mit dem Aufruf

pg mycommand

dasselbe Resultat erzielt. Angenommen die Ausgabe in der Spalte PID lautet 123, dann würde man strace folgendermaßen aufrufen.

strace -o logfile.log -p 123

Falls es mit Sicherhheit nur ein Programm namens mycommand läuft, geht das auch schneller mit einem

strace -o logfile.log -p `pidof mycommand`
strace -e trace=open

Wie versteht man die Ausgabe von strace?

Am Beispiel der folgenden Ausgabe wollen wir mal grob nachvollziehen, was ein Programm gerade macht

execve("/bin/cat", ["cat", "/var/log/messages"], [/* 37 vars */]) = 0

Was macht der Befehl execve? Dazu rufen wir mit

man execve

die entsprechende Hilfedatei auf und erfahren dort, dass das Programm cat mit dem Parameter /var/log/messages gestartet wird.

Welche Tips und Kniffe fallen euch noch im Zusammenhang mit strace ein?