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 EpochAn laufenden Prozess anhängen
# An PID anhängen
strace -p 1234
# Mit Kindprozessen
strace -fp 1234
# Detach mit Ctrl+CFilter
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 # SpeicherKategorien
| 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 lsAusgabe-Optionen
Strings
# Längere Strings
strace -s 200 ls
# Vollständige Strings
strace -s 0 lsStatistiken
# Call-Statistiken
strace -c ls
# Mit Timing
strace -c -S time lsVerbose
# Mehr Details
strace -v ls
# Decode File Descriptors
strace -y ls
# Decode PIDs
strace -Y lsPraktische 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 ./programPerformance-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 writeHängende Prozesse
# An hängenden Prozess anhängen
strace -p $(pgrep hung-process)
# Mit Timeout
timeout 10 strace -p 1234
# Sehen, worauf gewartet wirdBerechtigungsprobleme
# Alle Dateizugriffe
strace -e trace=file ./program
# Permission denied suchen
strace ./program 2>&1 | grep EACCES
strace ./program 2>&1 | grep EPERMKindprozesse
# 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 ./programDebugging-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.straceWarum 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 ENOENTUmgebungsvariablen
# Welche Envs werden gelesen?
strace -v -e execve ./program 2>&1 | head -50ltrace (Library Calls)
# Library Calls statt System Calls
ltrace ./program
# Mit bestimmten Libraries
ltrace -e malloc+free ./program
# Statistiken
ltrace -c ./programAusgabe 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) = 0Fehler-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.