strace

strace hilft dabei, die Funktionsaufrufe einzelner Prozesse oder des gesamten Systems zu protokollieren (System Calls). Die dabei enstehenden Ausgaben werden „Traces“ genannt.

Im einfachsten Fall führt strace den angegebenen Prozess aus, bis er beendet wird. Es fängt die Systemaufrufe des Prozesses mit ptrace ab, bevor sie im Kernel ausgeführt werden, und protokolliert diese inklusive der Signale, die der Prozess empfängt. Der Name jedes Systemaufrufs, dessen Argumente und Rückgabewert werden auf STDERR oder in die mit der Option --output angegebene Datei geschrieben. So lässt sich nachvollziehen, welche Kernel-Funktionen aufgerufen werden, welche Dateien geöffnet, welche Netzwerkverbindungen aufgebaut oder welche Speicherbereiche allokiert werden - was also zu einem Fehler oder Abbruch führt. Wiederholte Einträge in den Traces weisen auf mögliche Race Conditions und Deadlocks hin.

strace besitzt keine globale Konfigurationsdatei; alle Einstellungen erfolgen ueber Kommandozeilenparameter oder Umgebungsvariablen.

Unter einer RHEL 9 Minimal-Installation steht strace in den Standard-Repositorys zur Verfügung. Die Installation erfolgt mit:

dnf -y install strace

Ein einfacher Aufruf:

strace myapp

Laufenden Prozess untersuchen:

strace -p $PID

System-Call-Aufrufe zählen:

strace -c myapp

Ausführlicheres Tracing:

# debug an already-running/existing process
strace -ffttTo /tmp/strace.out -p $PID

# start the program "myapp" and debug it immediately
strace -ffttTo /tmp/strace.out myapp

Bedeutet:

  • -p: Verbindet sich mit dem Prozess mit der Prozess-ID und startet das Tracing.

  • -ff: Untersucht auch die Kindprozesse, die von den aktuell überwachten Prozessen erstellt werden. Wenn die Option -o mit angegeben, wird das Tracing-Ergebnis in filename.pid geschrieben.

  • -tt: Stellt dem Log-Output die Uhrzeit voran (durch -tt einschliesslich Mikrosekunden).

  • -o: Trace-Output in Datei schreiben.

  • -T: Dauer der Systemaufrufe protokollieren.

Nachher lassen sich die Dateien untersuchen:

cat /tmp/strace.out*

Mehrere parallele, dynamisch erzeugte php-fpm tracen (siehe auch https://sleeplessbeastie.eu/2019/10/14/how-to-strace-php-fpm-processes/):

strace -s 1024 -o /tmp/strace.out -ff $(pgrep php-fpm | paste -s | sed -e 's/\([0-9]\+\)/-p \1/g' -e 's/\t/ /g')

Tipp

ltrace protokolliert Bibliotheksaufrufe (Library Calls) statt System-Aufrufe.

Built on 2025-07-14