Comment utiliser strace pour surveiller les appels système Linux

Publié: 2022-01-29
Une fenêtre de terminal stylisée sur un ordinateur portable.
fatmawati achmad zaenuri/Shutterstock.com

Les programmes Linux demandent au noyau de faire certaines choses pour eux. La commande strace révèle ces appels système. Vous pouvez les utiliser pour comprendre comment les programmes fonctionnent et pourquoi, parfois, ils ne fonctionnent pas.

Le noyau et les appels système

Aussi intelligents soient-ils, les programmes informatiques ne peuvent pas tout faire par eux-mêmes. Ils doivent faire des demandes pour que certaines fonctions soient exécutées pour eux. Ces requêtes vont au noyau Linux. Typiquement, il y a une bibliothèque ou une autre interface logicielle que le programme appelle, et la bibliothèque fait alors la demande appropriée — appelée un appel système — au noyau.

Pouvoir voir les appels système qu'un programme a effectués et quelles ont été les réponses peut vous aider à comprendre le fonctionnement interne des programmes qui vous intéressent ou que vous avez écrits. C'est ce que fait strace . Cela peut aider à résoudre les problèmes et à rechercher les goulots d'étranglement.

Ce n'est pas la même chose que de déboguer une application avec un outil comme gdb . Un programme de débogage vous permet d'étudier le fonctionnement interne d'un programme pendant son exécution. Il vous permet de parcourir la logique de votre programme et d'inspecter la mémoire et les valeurs des variables. Par comparaison, ce que strace fait, c'est capturer les informations d'appel système pendant que le programme est en cours d'exécution. Lorsque le programme tracé se termine, strace répertorie les informations d'appel système dans la fenêtre du terminal.

Les appels système fournissent toutes sortes de fonctionnalités de bas niveau, telles que des actions de lecture et d'écriture sur des fichiers, la suppression de processus, etc. Il y a une liste de centaines d'appels système sur la page de manuel syscalls.

CONNEXION : Débogage avec GDB : Mise en route

Installation de strace

Si strace n'est pas déjà installé sur votre ordinateur, vous pouvez l'installer très facilement.

Sur Ubuntu, utilisez cette commande :

 sudo apt installer strace 

Sur Fedora, tapez cette commande :

 strace d'installation sudo dnf 

Sur Manjaro, la commande est :

 sudo pacman -Sy strace 

Premiers pas avec strace

Nous allons utiliser un petit programme pour démontrer strace . Il ne fait pas grand-chose : il ouvre un fichier et y écrit une ligne de texte, et il ne contient aucune erreur de vérification. C'est juste un hack rapide pour que nous ayons quelque chose à utiliser avec strace .

 #include <stdio.h>

int main(int argc, char argv[]) { 

  // descripteur de fichier 
  FICHIER *fileGeek;

  // ouvre un fichier appelé "strace_demo.txt", ou le crée 
  fileGeek = fopen("strace_demo.txt", "w");

  // écrit du texte dans le fichier 
  fprintf(fileGeek, "Écrivez ceci dans le fichier" );

  // ferme le fichier 
  fclose(fileGeek);

  // sortie du programme 
  retour (0); 

} // fin de main

Nous l'avons enregistré dans un fichier appelé "file-io.c" et l'avons compilé avec gcc dans un exécutable appelé stex , nommé pour " st race ex ample".

 gcc -o fichier stex-io.c

Nous appellerons strace depuis la ligne de commande et lui transmettrons le nom de notre nouvel exécutable en tant que processus que nous voulons tracer. Nous pourrions tout aussi facilement tracer l'une des commandes Linux ou tout autre exécutable binaire. Nous utilisons notre petit programme pour deux raisons.

La première raison est que strace est verbeux. Il peut y avoir beaucoup de sortie. C'est très bien lorsque vous utilisez le strace dans la colère, mais cela peut être écrasant au début. Il y a une sortie strace limitée pour notre petit programme. La deuxième raison est que notre programme a des fonctionnalités limitées et que le code source est court et simple. Cela facilite l'identification des sections de la sortie qui font référence aux différentes parties du fonctionnement interne du programme.

 strace ./stex 

Nous pouvons clairement voir l'appel système write envoyant le texte "Ecrire ceci dans le fichier" à notre fichier ouvert et l'appel système exit_group . Cela termine tous les threads de l'application et renvoie une valeur de retour au shell.

Filtrage de la sortie

Même avec notre programme de démonstration simple, il y a beaucoup de sortie. Nous pouvons utiliser l'option -e (expression). Nous transmettrons le nom de l'appel système que nous voulons voir.

 strace -e écrire ./stex 

Publicité

Vous pouvez signaler plusieurs appels système en les ajoutant sous forme de liste séparée par des virgules. N'incluez aucun espace dans la liste des appels système.

 strace -e fermer, écrire ./stex 

Envoi de la sortie dans un fichier

L'avantage du filtrage de la sortie est également le problème du filtrage de la sortie. Vous voyez ce que vous avez demandé à voir, mais vous ne voyez rien d'autre. Et certaines de ces autres sorties pourraient vous être plus utiles que les choses que vous avez demandé à voir.

Parfois, il est plus pratique de tout capturer, de rechercher et de faire défiler l'ensemble des résultats. De cette façon, vous n'exclurez pas accidentellement quelque chose d'important. L'option -o (sortie) vous permet d'envoyer la sortie d'une session strace vers un fichier texte.

 strace -o trace-output.txt ./stex 

Vous pouvez ensuite utiliser la commande less pour faire défiler la liste et rechercher des appels système - ou toute autre chose - par nom.

 moins trace-output.txt 

Vous pouvez maintenant utiliser toutes les fonctionnalités de recherche de less pour examiner la sortie.

CONNEXION: Comment utiliser la commande less sous Linux

Ajout d'horodatages

Vous pouvez ajouter plusieurs horodatages différents à la sortie. L'option -r (horodatages relatifs) ajoute des horodatages qui indiquent la différence de temps entre le début de chaque appel système successif. Notez que ces valeurs de temps incluront le temps passé dans l'appel système précédent et tout ce que le programme faisait avant le prochain appel système.

 strace -r ./stex 

Publicité

Les horodatages sont affichés au début de chaque ligne de sortie.

Pour voir le temps passé dans chaque appel système, utilisez l' -T (syscall-times). Cela montre la durée du temps passé à l'intérieur de chaque appel système.

 strace -T ./stex 

Les durées sont indiquées à la fin de chaque ligne d'appel système.

Pour voir l'heure à laquelle chaque appel système a été appelé, utilisez l'option -tt (horodatages absolus). Celui-ci affiche l'heure « horloge murale », avec une résolution en microsecondes.

 strace -tt ./stex 

Les temps sont affichés au début de chaque ligne.

Traçage d'un processus en cours d'exécution

Si le processus que vous souhaitez tracer est déjà en cours d'exécution, vous pouvez toujours lui associer strace . Pour ce faire, vous devez connaître l'ID du processus. Vous pouvez utiliser ps avec grep pour le trouver. Nous avons Firefox en cours d'exécution. Pour connaître l'ID du processus firefox , nous pouvons utiliser ps et le diriger vers grep .

 ps-e | grep firefox 

Publicité

Nous pouvons voir que l'ID de processus est 8483. Nous utiliserons l'option -p (ID de processus) pour indiquer à strace à quel processus s'attacher. Notez que vous devrez utiliser sudo :

 sudo strace-p 8483 

Vous verrez une notification indiquant que strace s'est attaché au processus, puis les appels de suivi du système seront affichés dans la fenêtre du terminal comme d'habitude.

Création d'un rapport

L'option -c (résumé uniquement) oblige strace à imprimer un rapport. Il génère une table contenant des informations sur les appels système qui ont été effectués par le programme suivi.

 strace -c ./stex 

Les colonnes sont :

  • % temps : Le pourcentage du temps d'exécution passé dans chaque appel système.
  • seconds : Le temps total exprimé en secondes et microsecondes passées dans chaque appel système.
  • usecs/call : Le temps moyen en microsecondes passé dans chaque appel système.
  • calls : Le nombre de fois que chaque appel système a été exécuté.
  • erreurs : Le nombre d'échecs pour chaque appel système.
  • syscall : Le nom de l'appel système.

Ces valeurs afficheront des zéros pour les programmes triviaux qui s'exécutent et se terminent rapidement. Les valeurs réelles sont affichées pour les programmes qui font quelque chose de plus significatif que notre application de démonstration.

Des informations approfondies, facilement

La sortie strace peut vous montrer quels appels système sont effectués, lesquels sont effectués à plusieurs reprises et combien de temps d'exécution est passé dans le code côté noyau. C'est une excellente information. Souvent, lorsque vous essayez de comprendre ce qui se passe dans votre code, il est facile d'oublier que votre binaire interagit presque sans arrêt avec le noyau pour exécuter bon nombre de ses fonctions.

En utilisant strace , vous voyez l'image complète.

CONNEXION: Meilleurs ordinateurs portables Linux pour les développeurs et les passionnés