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

| Kategorie | System Calls | |-----------|-------------| | file | open, stat, chmod, etc. | | process | fork, exec, wait, etc. | | network | socket, connect, send, etc. | | signal | signal, sigaction, kill, etc. | | ipc | shmget, semop, etc. | | memory | mmap, 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

| Code | Bedeutung | |------|-----------| | ENOENT | Datei nicht gefunden | | EACCES | Keine Berechtigung | | EPERM | Operation nicht erlaubt | | ECONNREFUSED | Verbindung abgelehnt | | ETIMEDOUT | Timeout |

Zusammenfassung

| Option | Funktion | |--------|----------| | -p PID | An Prozess anhängen | | -f | Kindprozesse verfolgen | | -e trace=X | Filter | | -o file | In Datei schreiben | | -c | Statistiken | | -T | Zeit pro Call | | -t | Timestamps | | -s N | String-Länge |

| Filter | Beschreibung | |--------|--------------| | trace=file | Datei-Operationen | | trace=network | Netzwerk | | trace=process | Prozesse | | trace=open | Nur open() |

| Anwendung | Befehl | |-----------|--------| | Fehlende Datei | strace -e open,openat | | Netzwerk | strace -e trace=network | | Performance | strace -c | | Hängend | strace -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.