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 -lastrace -p <pid> — Hängt sich an einen laufenden Prozess und verfolgt ihn (braucht ptrace-Recht, ggf. sudo).
strace -p 1234strace -f <command> — Folgt auch Kindprozessen (Forks).
strace -f nginxstrace -o <file> <command> — Schreibt die Trace-Ausgabe in eine Datei.
strace -o trace.log ./myappstrace -ff -o <prefix> <command> — Schreibt den Trace jedes Prozesses in eine eigene Datei.
strace -ff -o traces/app ./myappNach Systemaufruf filtern
strace -e trace=<syscall> <command> — Verfolgt nur bestimmte Systemaufrufe.
strace -e trace=open,read,write lsstrace -e trace=file <command> — Verfolgt dateibezogene Systemaufrufe.
strace -e trace=file cat /etc/hostsstrace -e trace=network <command> — Verfolgt netzwerkbezogene Systemaufrufe.
strace -e trace=network curl -s https://example.comstrace -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 ./myappstrace -e trace=signal <command> — Verfolgt signalbezogene Systemaufrufe.
strace -e trace=signal ./myappTiming & Performance
strace -T <command> — Zeigt die in jedem Systemaufruf verbrachte Zeit an.
strace -T ./myappstrace -t <command> — Stellt jeder Zeile die Uhrzeit voran.
strace -t ./myappstrace -tt <command> — Stellt die Uhrzeit inklusive Mikrosekunden voran.
strace -tt ./myappstrace -r <command> — Zeigt relative Zeitstempel (Zeit seit dem vorherigen Aufruf).
strace -r ./myappstrace -c <command> — Zählt Systemaufrufe und fasst sie als Statistik zusammen.
strace -c ls -la /usrstrace -C <command> — Zeigt sowohl den normalen Trace als auch die Zusammenfassung.
strace -C ./myappstrace -c -S time <command> — Sortiert die Zusammenfassung nach verbrauchter Zeit (Standard: Aufrufe).
strace -c -S time ./myappAusgabeoptionen
strace -s <size> <command> — Legt die maximale String-Länge in der Ausgabe fest (Standard 32).
strace -s 1024 -e trace=read ./myappstrace -v <command> — Ausführlicher Modus: kürzt Strukturen nicht ab.
strace -v stat /etc/hostsstrace -y <command> — Zeigt Dateipfade zu Dateideskriptor-Argumenten an.
strace -y -e trace=read,write ./myappstrace -yy <command> — Zeigt Socket-Adressen und Gerätedetails zu Deskriptoren an.
strace -yy -e trace=network curl -s https://example.comTypische 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 configstrace -e trace=connect <command> — Zeigt, welche Netzwerkverbindungen ein Programm aufbaut.
strace -e trace=connect curl -s https://example.comstrace -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 ENOENTstrace -c -p <pid> -e trace=all — Profilt die Systemaufruf-Nutzung eines laufenden Prozesses.
strace -c -p $(pidof php-fpm) -e trace=allstrace -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.
Weiterführende Links
- strace.io – offizielle Projektseite mit Dokumentation und Downloads
- Wikipedia: strace – Hintergrund und Funktionsweise des System-Call-Tracers