strace : tracer les appels système
strace intercepte et trace les appels système effectués par un processus. Indispensable pour déboguer un processus qui bloque, échoue silencieusement, ou consomme des ressources inattendues.
Syntaxe de base
# Tracer une commande
strace commande [args]
# Attacher à un processus existant
strace -p <PID>
# Suivre les processus fils (fork/threads)
strace -f commande
# Résumé des appels (comptage + temps)
strace -c commande
Options essentielles
| Option | Effet |
|---|---|
-p <PID> | Attacher à un processus en cours |
-f | Suivre les forks et threads |
-c | Afficher un résumé statistique à la fin |
-e <expr> | Filtrer par type d'appel |
-o <file> | Écrire la sortie dans un fichier |
-t | Ajouter l'heure à chaque ligne |
-T | Afficher la durée de chaque appel |
-s <n> | Taille max des strings affichées (défaut : 32) |
-x | Afficher les strings en hexadécimal |
-y | Afficher les chemins de fichiers des fd |
-yy | Afficher aussi les infos socket |
Filtrage par type d'appel (-e)
# Uniquement les appels réseau
strace -e trace=network curl https://example.com
# Uniquement les accès fichiers
strace -e trace=file ls /etc
# Appels mémoire
strace -e trace=memory commande
# Appels process (fork, exec, wait)
strace -e trace=process commande
# Plusieurs catégories
strace -e trace=file,network commande
# Un appel spécifique
strace -e openat,read,write commande
# Exclure un appel
strace -e trace='!futex' commande
Catégories disponibles : file, network, memory, process, signal, ipc, desc
Résumé statistique
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- --------
45.23 0.023451 12 1951 read
30.12 0.015621 8 1952 write
12.45 0.006453 6 1075 120 openat
...
Utile pour identifier quel appel système consomme le plus de temps.
Attacher à plusieurs processus
# Attacher à tous les workers PHP-FPM
sudo strace -f -c $(pgrep php-fpm | sed 's/^/-p /' | tr '\n' ' ')
# Résumé des appels stat sur PHP-FPM
sudo strace -f -e trace=stat $(pgrep php-fpm | sed 's/^/-p /' | tr '\n' ' ')
# Attacher à tous les workers nginx
sudo strace -f -p $(pgrep -d',' nginx)
Déboguer les problèmes courants
Processus bloqué / hung
# Voir sur quel appel système le process est bloqué
strace -p <PID>
# Si le process ne répond plus, il sera souvent bloqué sur :
# read(), recv(), select(), poll(), futex(), nanosleep()
Fichier introuvable
Problème de permissions
Port déjà utilisé / connexion refusée
Identifier les fichiers de config lus au démarrage
# Voir tous les fichiers ouverts par une commande
strace -e openat -y commande 2>&1 | grep -v ENOENT
Détecter les appels lents
# Afficher la durée de chaque appel, trier par les plus lents
strace -T -f commande 2>&1 | sort -t '<' -k2 -rn | head -20
Enregistrer la trace pour analyse
# Sauvegarder dans un fichier avec timestamps
strace -tt -f -o /tmp/trace.log commande
# Attacher à un daemon et logger en arrière-plan
strace -tt -f -p <PID> -o /tmp/trace.log &
# Analyser après coup
grep ENOENT /tmp/trace.log
grep "open.*config" /tmp/trace.log
Cas pratique : déboguer un service qui refuse de démarrer
# 1. Lancer le service sous strace avec toutes les options utiles
strace -f -tt -e trace=file,network,process \
-o /tmp/service_debug.log \
/usr/sbin/mon-service --foreground
# 2. Chercher les erreurs
grep -E "ENOENT|EACCES|ECONNREFUSED" /tmp/service_debug.log
# 3. Voir les fichiers que le service cherche à ouvrir
grep "openat" /tmp/service_debug.log | grep -v " = [0-9]"
Alternatives
| Outil | Usage |
|---|---|
ltrace | Trace les appels aux bibliothèques partagées (libc, etc.) |
perf trace | Alternative plus performante à strace (moins d'overhead) |
bpftrace | Traçage avancé via eBPF — scripts personnalisables |
lsof -p <PID> | Fichiers et sockets ouverts (sans trace des appels) |