Debugging · observability
strace — le traceur d'appels système Linux
strace affiche chaque appel système effectué par un processus, avec ses arguments, sa valeur de retour et (optionnellement) son chronométrage. C'est le moyen le plus rapide de répondre à « que fait réellement ce programme » — et presque toujours le premier outil quand un binaire dysfonctionne et qu'on n'a pas la source.
Comment ça marche
strace est une fine surcouche du mécanisme noyau ptrace(2). Il s'attache au processus cible, demande au noyau de l'arrêter avant et après chaque appel (PTRACE_SYSCALL), lit les registres pour décoder l'appel, le met en forme lisiblement, puis laisse la cible reprendre. Les noyaux modernes exposent PTRACE_GET_SYSCALL_INFO pour que strace n'ait pas besoin de connaissances de registres spécifiques à chaque architecture.
Parce qu'il s'appuie sur ptrace, strace hérite de son modèle de sécurité : Yama ptrace_scope et CAP_SYS_PTRACE s'appliquent. Voir ptrace(2) pour le mécanisme complet.
Les drapeaux vraiment utiles
- -f
- Suivre les fork. Sans cela, strace ne trace que le leader ; avec, chaque enfant via fork()/clone() est tracé aussi. Presque toujours souhaité.
- -p PID
- S'attacher à un processus déjà en cours par PID au lieu d'en lancer un nouveau.
- -e trace=set
- Filtrer par nom d'appel ou ensemble. Exemples : -e trace=openat,read,write ou -e trace=%file ou -e trace=%network.
- -e read=set / write=set
- Afficher le contenu des lectures/écritures sur les fd listés (par ex. -e write=1,2 affiche les écritures sur stdout/stderr).
- -s N
- Longueur maximale d'affichage des chaînes. Défaut 32 ; passer à -s 4096 pour voir les charges complètes.
- -c
- Sauter la trace ligne-à-ligne et afficher un tableau récapitulatif à la fin (appel, nombre, temps, erreurs) — le moyen le plus rapide de savoir où un programme passe son temps.
- -y / -yy
- Résoudre les descripteurs en chemins (-y) ou en points d'extrémité de socket (-yy). Inestimable pour lire une trace bruyante.
- -o file
- Écrire la trace dans un fichier au lieu de stderr. À combiner avec -ff pour séparer par PID.
- -k
- Imprimer une pile d'appels userspace pour chaque syscall (nécessite libdw). Lourd mais imbattable pour localiser le site d'appel.
- -t / -tt / -ttt
- Ajouter des horodatages : -t affiche HH:MM:SS, -tt ajoute les microsecondes, -ttt donne des secondes époque (analysable machine).
Recettes
Trouver le fichier que le programme n'ouvre pas
strace -f -e trace=openat,access -e status=failed ./app 2>&1 | tailVoir quels appels dominent le temps d'exécution
strace -c -f ./appS'attacher à nginx et observer les appels réseau
strace -f -p $(pidof nginx) -e trace=network -s 512 -tAfficher ce que le programme écrit sur stderr
strace -e write=2 -s 8192 ./app | grep -A2 'write(2,'Syscalls fréquemment tracés
Cliquer pour la page de référence — format des arguments, errnos courants, notes d'historique noyau.
- strace -e open
- strace -e openat
- strace -e read
- strace -e write
- strace -e close
- strace -e execve
- strace -e clone
- strace -e fork
- strace -e exit_group
- strace -e stat
- strace -e fstat
- strace -e lstat
- strace -e access
- strace -e connect
- strace -e accept
- strace -e bind
- strace -e sendto
- strace -e recvfrom
- strace -e mmap
- strace -e munmap
- strace -e brk
- strace -e ioctl
- strace -e fcntl
- strace -e ptrace
- strace -e futex
- strace -e epoll_wait
- strace -e select
- strace -e poll
Quand strace n'est pas le bon outil
strace impose un changement de contexte par appel système, ce qui peut donner un ralentissement de 10 à 100× sur des charges riches en syscalls — à éviter en production. Pour échantillonner, utiliser perf trace (plus léger, même données) ou bpftrace tracepoint:syscalls:sys_enter_*. Pour de l'observabilité longue durée, les outils eBPF (Falco, Tracee, sysdig) sont la réponse moderne. Pour les appels de bibliothèque plutôt que les syscalls, ltrace est l'outil frère.