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
# 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.