Kategorien

Druckansicht des Beitrags Druckansicht des Beitrags

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

  • -o filename schreibt die Ausgabe in die Datei filename
  • -f mit diesem Parameter protokolliert das Programm auch forks (d.h. neue Prozesse, die durch das zu protokollierende Programm gestartet werden)
  • -tt mit diesem Parameter wird vor jedem Aufruf zunächst die Zeit protokolliert (auf Basis von Mikrosekunden)
  • -e schränkt die Events ein, die strace protokolliert (siehe Beispiele weiter unten)
  • -p PID strace protokolliert die Systemaufrufe des Prozesses mit der Prozess-ID PID

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 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 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`
<strong><strong>strace -e trace=open</strong></strong>

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?

5 comments to Mit strace prüfen, was ein Programm so treibt

  • Jo

    Es gibt btw auch das nette Programm namens „pgrep“, das die PID eines gesuchten Prozesses zurückgibt.

    user@ubuntu:>pgrep init
    1

    Nur mal als Beispiel

  • Hi, danke für den Artikel. Wenn ein Programm schon gestartet ist und man will
    wissen auf was es alles zugreift (Dateien, sockets, pipes, libs) gibts ‚lsof‘.
    In Verbindung mit grep siehts dann so aus: ‚lsof | grep mycommand‘
    Vielleicht etwas zu mächtig, aber man kann gut etwas über ein Programm herausfinden.

    viel Spass

  • me

    execve(„/bin/cat“, [„cat“, „/var/log/messages“], [/* 37 vars */]) = 0
    bash: Syntaxfehler beim unerwarteten Wort `“/bin/cat“,‘

  • Michi

    Wenn man strace grepen will muss man vorher noch den Sterr in Stout umleiten, dass ist das was für mich das wichtigste ist:
    strace program 2>&1 | grep hallo

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>