Agence web » Actualités du digital » Comment utiliser strace pour surveiller les appels système Linux

Comment utiliser strace pour surveiller les appels système Linux

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. le strace commande 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 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. En règle générale, il existe une bibliothèque ou une autre interface logicielle que le programme appelle, et la bibliothèque effectue ensuite la requête appropriée (appelée appel système) au noyau.

Être capable de 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 quoi strace Est-ce que. 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, qu’est-ce que strace fait est de 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, des processus d’arrêt, etc. Il y a une liste de centaines d’appels système sur la page de manuel syscalls.

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 install strace

Sur Fedora, tapez cette commande :

sudo dnf install strace

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 n’y a aucune erreur lors de la 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[]) { 

  // file handle 
  FILE *fileGeek;

  // open a file called "strace_demo.txt", or create it 
  fileGeek = fopen("strace_demo.txt", "w");

  // write some text to the file 
  fprintf(fileGeek, "Write this to the file" );

  // close the file 
  fclose(fileGeek);

  // exit from program 
  return (0); 

} // end of 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 « stcourse example. »

gcc -o stex file-io.c

Nous appellerons strace à partir de la ligne de commande et transmettez-lui le nom de notre nouvel exécutable en tant que processus que nous voulons tracer. Nous pourrions tout aussi bien tracer n’importe quelle commande 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 super quand tu utilises strace en colère, mais cela peut être accablant au début. Il y a limité strace sortie 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 permet d’identifier plus facilement quelles sections de la sortie font référence aux différentes parties du fonctionnement interne du programme.

strace ./stex

On voit clairement le write appel système envoyant le texte « Ecrire ceci dans le fichier » à notre fichier ouvert et le exit_group appel système. Cela met fin à tous les threads de l’application et renvoie une valeur de retour au shell.

Filtrage de la sortie

Même avec notre simple programme de démonstration, il y a pas mal de résultats. Nous pouvons utiliser le -e option (expression). Nous passerons le nom de l’appel système que nous voulons voir.

strace -e write ./stex

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 close,write ./stex

Envoi de la sortie vers 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 certains de ces autres résultats pourraient vous être plus utiles que ce 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 accidentellement rien d’important. le -o (sortie) vous permet d’envoyer la sortie d’un strace session dans un fichier texte.

strace -o trace-output.txt ./stex

Vous pouvez alors utiliser le less pour faire défiler la liste et rechercher les appels système – ou toute autre chose – par nom.

less trace-output.txt

Vous pouvez maintenant utiliser tous lessles capacités de recherche de pour étudier la sortie.

Ajout d’horodatages

Vous pouvez ajouter plusieurs horodatages différents à la sortie. le -r (horodatages relatifs) ajoute des horodatages qui montrent 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

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

Pour voir le temps passé dans chaque appel système, utilisez le -T (heures d’appel système). 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 le -tt (horodatages absolus). Cela montre l’heure de « l’horloge murale », avec une résolution de la microseconde.

strace -tt ./stex

Les heures sont affichées au début de chaque ligne.

Traçage d’un processus en cours

Si le processus que vous souhaitez suivre est déjà en cours d’exécution, vous pouvez toujours joindre strace à cela. Pour ce faire, vous devez connaître l’ID du processus. Vous pouvez utiliser ps avec grep pour trouver ça. Nous avons Firefox en cours d’exécution. Pour connaître l’identifiant du firefox processus, nous pouvons utiliser ps et le faire passer grep.

ps -e | grep firefox

Nous pouvons voir que l’ID de processus est 8483. Nous allons utiliser le -p (ID de processus) option à dire strace à quel processus se rattacher. Notez que vous devrez utiliser sudo :

sudo strace -p 8483

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

Création d’un rapport

le -c (Résumé uniquement) causes de l’option strace pour imprimer un rapport. Il génère un tableau contenant des informations sur les appels système effectués par le programme tracé.

strace -c ./stex

Les colonnes sont :

  • % temps: pourcentage du temps d’exécution passé dans chaque appel système.
  • secondes: temps total exprimé en secondes et en microsecondes passé dans chaque appel système.
  • utilisations/appel: temps moyen en microsecondes passé dans chaque appel système.
  • appels: nombre de fois que chaque appel système a été exécuté.
  • les erreurs: nombre d’échecs pour chaque appel système.
  • appel système: 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

le strace la sortie 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.

★★★★★