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 Befehl aus, bis er beendet wird. Es fängt die Systemaufrufe ab und protokolliert Aufrufe, die von einem Prozess aufgerufen werden, inklusive die Signale, die ein Prozess empfängt. Der Name jedes Systemaufrufs, dessen Argumente und Rückgabewert werden auf STDERR oder in die mit der Option -o angegebene Datei geschrieben.

So lässt sich für Programmierer und SysAdmins nachvollziehen, was zu einem Fehler oder Abbruch führt. Wiederholte Einträge in den Traces weisen auf mögliche Race Conditions und Deadlocks hin.

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 2024-04-18