Strace
| Fiche express | |
|---|---|
| Domaine | Diagnostic de processus (appels système) |
| Commande | strace
|
| Contexte | Repose sur ptrace (nécessite les privilèges adéquats pour tracer un processus d'un autre utilisateur) — voir ltrace pour tracer les appels de bibliothèque plutôt que les appels système
|
| Voir aussi | Ps (repérer le PID à tracer) |
strace intercepte et affiche les appels système effectués par un processus (ouverture de fichiers, sockets, signaux, gestion mémoire...). Très utile pour comprendre pourquoi un programme bloque, échoue silencieusement ou se comporte différemment d'un environnement à l'autre, sans avoir besoin de le recompiler ni d'y ajouter du logging.
Tracer un processus déjà lancé
strace -p PID # attache strace au PID en cours d'exécution
strace -f -p PID # -f : suit aussi les threads et sous-processus (fork/clone)
strace -f -s 5000 -p PID # -s : n'affiche pas que les 32 premiers caractères des chaînes (buffers, arguments longs)
Lancer une commande sous strace
Pratique pour un service qui échoue au démarrage ou une commande qui plante avant d'avoir pu récupérer son PID :
strace commande
strace -f /etc/init.d/httpd restart # -f pour suivre les processus enfants créés par le script/service
Rediriger la sortie vers un fichier
strace écrit sa trace sur stderr par défaut, ce qui la mélange à la sortie du programme tracé si on ne la redirige pas :
strace -o /tmp/trace.log -f commande # trace dans un fichier, stdout/stderr du programme restent au terminal
strace -f commande 2>&1 | tee /tmp/trace.log # tout capturer ensemble (trace + sortie du programme)
Filtrer les appels système tracés
Sur une trace volumineuse, se limiter à une catégorie d'appels rend la sortie exploitable :
strace -e trace=open,access ls
Catégories utiles avec -e trace= :
strace -e trace=file # tout ce qui touche au système de fichiers (open, stat, access...)
strace -e trace=process # fork, exec, exit...
strace -e trace=network # sockets, connect, bind...
strace -e trace=signal # envoi/réception de signaux
strace -e trace=ipc # sémaphores, mémoire partagée, files de messages
strace -e trace=desc # tout ce qui prend un descripteur de fichier en argument
Obtenir un résumé statistique
-c agrège la trace en un tableau (nombre d'appels, temps passé, erreurs) par appel
système, au lieu d'afficher chaque appel individuellement — utile pour identifier rapidement quel
syscall consomme le plus de temps :
strace -c commande
strace -c -f commande # idem, sous-processus inclus
Diagnostiquer un problème réseau
strace -f -e trace=poll,select,connect,recvfrom,sendto commande
Tracer tous les processus d'un service
ps -ef | grep httpd | grep -v grep | awk '{print "-p " $2}' | xargs strace -f
Voir aussi
- Ps — repérer le PID d'un processus à tracer