Strace

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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