strace — Systemaufrufe und Signale eines Prozesses verfolgen

Praxis-Guide zu strace: Systemaufrufe verfolgen, fehlschlagende Programme diagnostizieren und Performance-Engpässe auf OS-Ebene aufspüren.

strace zeigt dir, was ein Programm wirklich tut: Es protokolliert jeden Systemaufruf an den Linux-Kernel samt Argumenten und Rückgabewert – vom Öffnen einer Datei über Netzwerkverbindungen bis zum empfangenen Signal. Damit findest du heraus, warum ein Prozess hängt, welche Konfigurationsdatei er vergeblich sucht oder wo die Zeit verloren geht, ohne den Quellcode zu kennen. Dieser Guide führt dich vom einfachen Mitschneiden über gezielte Filter bis zur Syscall-Statistik fürs Profiling.

Grundlegendes Tracing

strace <command> — Verfolgt alle Systemaufrufe eines Kommandos.

strace ls -la

strace -p <pid> — Hängt sich an einen laufenden Prozess und verfolgt ihn (braucht ptrace-Recht, ggf. sudo).

strace -p 1234

strace -f <command> — Folgt auch Kindprozessen (Forks).

strace -f nginx

strace -o <file> <command> — Schreibt die Trace-Ausgabe in eine Datei.

strace -o trace.log ./myapp

strace -ff -o <prefix> <command> — Schreibt den Trace jedes Prozesses in eine eigene Datei.

strace -ff -o traces/app ./myapp

Nach Systemaufruf filtern

strace -e trace=<syscall> <command> — Verfolgt nur bestimmte Systemaufrufe.

strace -e trace=open,read,write ls

strace -e trace=file <command> — Verfolgt dateibezogene Systemaufrufe.

strace -e trace=file cat /etc/hosts

strace -e trace=network <command> — Verfolgt netzwerkbezogene Systemaufrufe.

strace -e trace=network curl -s https://example.com

strace -e trace=process <command> — Verfolgt Prozessverwaltungs-Aufrufe (fork, exec, wait).

strace -e trace=process bash -c 'ls | grep txt'

strace -e trace=memory <command> — Verfolgt Speicherverwaltungs-Aufrufe (mmap, brk usw.).

strace -e trace=memory ./myapp

strace -e trace=signal <command> — Verfolgt signalbezogene Systemaufrufe.

strace -e trace=signal ./myapp

Timing & Performance

strace -T <command> — Zeigt die in jedem Systemaufruf verbrachte Zeit an.

strace -T ./myapp

strace -t <command> — Stellt jeder Zeile die Uhrzeit voran.

strace -t ./myapp

strace -tt <command> — Stellt die Uhrzeit inklusive Mikrosekunden voran.

strace -tt ./myapp

strace -r <command> — Zeigt relative Zeitstempel (Zeit seit dem vorherigen Aufruf).

strace -r ./myapp

strace -c <command> — Zählt Systemaufrufe und fasst sie als Statistik zusammen.

strace -c ls -la /usr

strace -C <command> — Zeigt sowohl den normalen Trace als auch die Zusammenfassung.

strace -C ./myapp

strace -c -S time <command> — Sortiert die Zusammenfassung nach verbrauchter Zeit (Standard: Aufrufe).

strace -c -S time ./myapp

Ausgabeoptionen

strace -s <size> <command> — Legt die maximale String-Länge in der Ausgabe fest (Standard 32).

strace -s 1024 -e trace=read ./myapp

strace -v <command> — Ausführlicher Modus: kürzt Strukturen nicht ab.

strace -v stat /etc/hosts

strace -y <command> — Zeigt Dateipfade zu Dateideskriptor-Argumenten an.

strace -y -e trace=read,write ./myapp

strace -yy <command> — Zeigt Socket-Adressen und Gerätedetails zu Deskriptoren an.

strace -yy -e trace=network curl -s https://example.com

Typische Anwendungsfälle

strace -e trace=openat <command> 2>&1 | grep <file> — Findet heraus, welche Dateien ein Programm zu öffnen versucht.

strace -e trace=openat python app.py 2>&1 | grep config

strace -e trace=connect <command> — Zeigt, welche Netzwerkverbindungen ein Programm aufbaut.

strace -e trace=connect curl -s https://example.com

strace -e trace=openat -p <pid> 2>&1 | grep -v ENOENT — Beobachtet die Dateizugriffe eines laufenden Prozesses (ohne Fehlversuche).

strace -e trace=openat -p $(pidof nginx) 2>&1 | grep -v ENOENT

strace -c -p <pid> -e trace=all — Profilt die Systemaufruf-Nutzung eines laufenden Prozesses.

strace -c -p $(pidof php-fpm) -e trace=all

strace -e trace=write -s 1024 -p <pid> — Beobachtet, was ein Prozess schreibt (Debugging von Ausgabeproblemen).

strace -e trace=write -s 1024 -p 1234

Fazit

strace ist das erste Werkzeug, zu dem du greifst, wenn ein Programm sich rätselhaft verhält und Logs nichts hergeben: strace -f -e trace=file deckt fehlende Dateien auf, -e trace=network zeigt blockierte Verbindungen, und -c liefert ein schnelles Syscall-Profil. Beachte aber zwei Dinge. Erstens verlangsamt das Tracing das Ziel deutlich – auf Produktionssystemen mit Bedacht und am besten zeitlich begrenzt einsetzen. Zweitens, und wichtiger: strace zeigt Syscall-Argumente im Klartext und kann dabei Passwörter, Tokens oder Schlüssel offenlegen. Hänge dich daher nur an eigene oder ausdrücklich autorisierte Prozesse; strace -p braucht ohnehin das ptrace-Recht (yama ptrace_scope, meist sudo). Unter macOS gibt es kein strace – dort nutzt du dtruss beziehungsweise dtrace.

  • strace.io – offizielle Projektseite mit Dokumentation und Downloads
  • Wikipedia: strace – Hintergrund und Funktionsweise des System-Call-Tracers

Verwandte Kommandos

  • lsof – zeigt offene Dateien und Sockets eines Prozesses
  • ps – listet laufende Prozesse samt PIDs für strace -p
  • dmesg – liest den Kernel-Ringpuffer für systemnahe Fehlermeldungen