15/11/2024

L’interface d’appels système : strace et trace

A l’instar des langages évolués, le système d’exploitation effectue un certain nombre d’appels système tels que l’ouverture ou la fermeture de fichier, la lecture d’interface spécifique… Il s’agit à ce niveau, de récolter les informations concernant l’ensemble de ces appels et de leurs statistiques.

On peut trouver des outils comme le traditionnel strace (équivalent de la commande ltrace des bibliothèques concernant les appels système effectués lors de l’exécution d’un script ou d’un programme quel qu’il soit).

Exemple : récupérer les appels effectués lors de la commande "getent passwd root" :

# strace /usr/bin/getent passwd root

Cela permet d’afficher l’ensemble des appels réalisés au travers du système d’exploitation pour procéder à l’exécution de la commande elle-même. Certains outils de statistiques et de performance ne sont pas forcément implémentés nativement sur une distribution GNU/Linux. C’est le cas par exemple, du logiciel allemand, issu de la firme KDAB : perf, fournissant une sortie statique des statistiques, au format fichier perf.data des différents appels système exécutés :

$ perf stat ./mypgm

Dans la même gamme de produit, on trouve également le traceur trace (aussi appelé LTT-ng ou Linux Trace Toolkit), pour lequel il suffit juste d’appeler la commande trace pour effectuer la collecte d’informations, durant une durée précisée en secondes :

$ trace 15 <Pgm>

REMARQUE : les différentes collectes sont récupérées au sein du fichier <Pgm>.trace dans le pseudo-système de fichiers /proc, dans une arborescence appelée <Pgm>.proc. Il est possible de visualiser ces informations grâce à la commande traceview.

Enfin, à ce niveau on trouve également un certain nombre d’outils issus de la couche eBPF/BCC permettant de s’intéresser tout particulièrement aux différents appels effectués :

  • opensnoop
  • statsnoop
  • syncsnoop
  • killsnoop

Ces derniers permettent généralement de tracer les différents appels système auquel ils sont liés. Par exemple, pour opensnoop, on comptabilise les appels de type open() en décrivant le fichier ouvert, son chemin complet et en récupérant au passage le descripteur de ce même fichier.

Exemple : tracer le processus n°81 ou pour remonter les appels échoués :

# opensnoop -p 81
# opensnoop -x

REMARQUE : le même genre de fonction existe aussi pour les appels stats(), sync() ou kill(). Elles s’appellent respectivement statsnoop, syncsnoop ou killsnoop.

author avatar
Philippe PIERRE
A exercé de nombreuses années en tant qu'administrateur de base de données et comme administrateur Système Unix/Linux. Il a enseigné les réseaux au CNAM (Paris). Aujourd'hui, employé en tant qu'ingénieur infrastructure, au sein d'un laboratoire pharmaceutique et administrant un cluster de calculs HPC, il connaît parfaitement les environnements GNU/Linux dans le cadre d'une entreprise et des systèmes de haute disponibilité. Il aime partager son expérience.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail