Comment utiliser strace pour surveiller les appels système Linux
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.
Sommaire
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 less
les 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.