strace überwacht System Calls und Signale eines Prozesses. Es ist unverzichtbar für die Diagnose von Anwendungsproblemen, besonders wenn keine Logs verfügbar sind.

Grundlagen

Prozess starten

# Befehl mit strace starten
strace ls

# Ausgabe in Datei
strace -o output.txt ls

# Timestamps
strace -t ls       # Sekunden
strace -tt ls      # Mikrosekunden
strace -ttt ls     # Unix Epoch

An laufenden Prozess anhängen

# An PID anhängen
strace -p 1234

# Mit Kindprozessen
strace -fp 1234

# Detach mit Ctrl+C

Filter

Nach System Calls

# Nur bestimmte Calls
strace -e open ls
strace -e read,write ls
strace -e trace=open,close ls

# Kategorien
strace -e trace=file ls        # Datei-Operationen
strace -e trace=process ls     # Prozess-Operationen
strace -e trace=network ls     # Netzwerk
strace -e trace=signal ls      # Signale
strace -e trace=ipc ls         # IPC
strace -e trace=memory ls      # Speicher

Kategorien

KategorieSystem Calls
fileopen, stat, chmod, etc.
processfork, exec, wait, etc.
networksocket, connect, send, etc.
signalsignal, sigaction, kill, etc.
ipcshmget, semop, etc.
memorymmap, brk, etc.

Ausschließen

# Calls ausschließen
strace -e trace=!read,write ls

Ausgabe-Optionen

Strings

# Längere Strings
strace -s 200 ls

# Vollständige Strings
strace -s 0 ls

Statistiken

# Call-Statistiken
strace -c ls

# Mit Timing
strace -c -S time ls

Verbose

# Mehr Details
strace -v ls

# Decode File Descriptors
strace -y ls

# Decode PIDs
strace -Y ls

Praktische Beispiele

Datei nicht gefunden

# Welche Dateien sucht ein Programm?
strace -e open,openat,access ./program 2>&1 | grep -i error

# Beispiel-Ausgabe:
# openat(AT_FDCWD, "/etc/config.conf", O_RDONLY) = -1 ENOENT (No such file)

Netzwerkprobleme

# Netzwerk-Calls
strace -e trace=network ./program

# Verbindungsversuche
strace -e connect ./program

Performance-Probleme

# Zeit pro Call
strace -T ./program

# Statistiken
strace -c ./program

# Ausgabe:
# % time     seconds  usecs/call     calls    errors syscall
# ------ ----------- ----------- --------- --------- ----------------
#  45.00    0.000450          45        10           read
#  30.00    0.000300          30        10           write

Hängende Prozesse

# An hängenden Prozess anhängen
strace -p $(pgrep hung-process)

# Mit Timeout
timeout 10 strace -p 1234

# Sehen, worauf gewartet wird

Berechtigungsprobleme

# Alle Dateizugriffe
strace -e trace=file ./program

# Permission denied suchen
strace ./program 2>&1 | grep EACCES
strace ./program 2>&1 | grep EPERM

Kindprozesse

# Alle Kindprozesse verfolgen
strace -f ./program

# Mit separaten Logs
strace -ff -o output ./program
# Erzeugt output.PID für jeden Prozess

# Threads verfolgen
strace -f -e clone ./program

Debugging-Szenarien

Warum startet Service nicht?

# Service mit strace starten
strace -f -o /tmp/service.strace /usr/sbin/service --no-daemon

# Oder systemd-Service debuggen
systemctl edit myservice.service
# [Service]
# ExecStart=/usr/bin/strace -f -o /tmp/service.strace /usr/bin/myservice

# Log analysieren
grep -E 'ENOENT|EACCES|EPERM' /tmp/service.strace

Warum ist Programm langsam?

# Zeit-Analyse
strace -c -S time ./program

# Langsame Calls finden
strace -T ./program 2>&1 | awk '$NF > 0.1 {print}'

Welche Konfigdateien werden gelesen?

strace -e openat ./program 2>&1 | grep -E '\.(conf|cfg|ini|json|yaml)' | grep -v ENOENT

Umgebungsvariablen

# Welche Envs werden gelesen?
strace -v -e execve ./program 2>&1 | head -50

ltrace (Library Calls)

# Library Calls statt System Calls
ltrace ./program

# Mit bestimmten Libraries
ltrace -e malloc+free ./program

# Statistiken
ltrace -c ./program

Ausgabe interpretieren

Typische Einträge

# Datei öffnen
openat(AT_FDCWD, "/etc/passwd", O_RDONLY) = 3

# Datei lesen
read(3, "root:x:0:0:root:/root:/bin/bash\n"..., 4096) = 2847

# Fehler
openat(AT_FDCWD, "/missing", O_RDONLY) = -1 ENOENT (No such file)

# Netzwerk
connect(3, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("93.184.216.34")}, 16) = 0

Fehler-Codes

CodeBedeutung
ENOENTDatei nicht gefunden
EACCESKeine Berechtigung
EPERMOperation nicht erlaubt
ECONNREFUSEDVerbindung abgelehnt
ETIMEDOUTTimeout

Zusammenfassung

OptionFunktion
-p PIDAn Prozess anhängen
-fKindprozesse verfolgen
-e trace=XFilter
-o fileIn Datei schreiben
-cStatistiken
-TZeit pro Call
-tTimestamps
-s NString-Länge
FilterBeschreibung
trace=fileDatei-Operationen
trace=networkNetzwerk
trace=processProzesse
trace=openNur open()
AnwendungBefehl
Fehlende Dateistrace -e open,openat
Netzwerkstrace -e trace=network
Performancestrace -c
Hängendstrace -p PID

Fazit

strace ist das wichtigste Debugging-Tool unter Linux. Es zeigt genau, was ein Prozess auf Systemebene macht. Für Berechtigungs- und Dateiprobleme ist es unverzichtbar. Performance-Analysen mit -c helfen bei Optimierung. Die Lernkurve lohnt sich für jeden Administrator.