Programmes Linux Demandez à la
noyau
faire certaines choses pour eux. Les
strace
La commande révèle ces appels système. Vous pouvez les utiliser pour comprendre comment les programmes fonctionnent et pourquoi, parfois, ils ne le font pas.
Le noyau et le système appelle
Aussi intelligent que possible, les programmes informatiques ne peuvent pas tout faire pour eux-mêmes. Ils doivent faire des demandes d'avoir certaines fonctions effectuées pour eux. Ces demandes vont au noyau Linux. En règle générale, il y a une bibliothèque ou une autre interface logicielle que le programme appelle, et la bibliothèque appelle ensuite la demande appropriée appelée appel au noyau.
Être capable de voir le système appelle qu'un programme a fait et quelles étaient les réponses peut vous aider à comprendre le fonctionnement interne des programmes qui vous intéressent ou que vous avez écrit. C'est
Quel
strace
Est-ce que
. Cela peut aider à résoudre les problèmes et à rechercher des goulots d'étranglement.
Ce n'est pas la même chose que
Déboguer une demande
avec un outil comme
gdb
. Un programme de débogage vous permet d'enquêter sur le fonctionnement interne d'un programme tel qu'il est exécuté. Il vous permet de passer à travers la logique de votre programme et d'inspecter la mémoire et les valeurs variables. Par comparaison, quoi
strace
Capturez-vous les informations d'appel système car le programme est en cours d'exécution. Lorsque le programme tracé se termine,
strace
Répertorie les informations d'appel système à la fenêtre du terminal.
Les appels système fournissent toutes sortes de fonctionnalités de bas niveau, telles que la lecture et l'écriture d'actions sur les fichiers, les processus de tuerie, etc. Il y a une liste de centaines d'appels système sur le SysCalls Man Page .
EN RELATION: Débogage avec GDB: Mise en route
Installation de la ronde
Si
strace
N'est déjà déjà installé sur votre ordinateur, vous pouvez l'installer très facilement.
Sur Ubuntu, utilisez cette commande:
Sudo apt install install strace
Sur Fedora, tapez cette commande:
Sudo DNF Installation Strace
Sur Manjaro, le commandement est:
Sudo Pacman -Sy Strace
Premiers pas avec la strace
Nous utiliserons un petit programme pour démontrer
strace
. Cela ne fait pas grand chose: il ouvre un fichier et écrit une ligne de texte à ce sujet, et il n'a aucune erreur d'erreur. C'est juste un piratage rapide pour que nous ayons quelque chose à utiliser avec
strace
.
#include & lt; stdio.h & gt;
int Main (int Argc, chargeur []) {
// poignée de fichier
Fichier * FileGeek;
// ouvre un fichier appelé "strace_demo.txt" ou le créer
FileGeek = fopen ("strace_demo.txt", "w");
// écrit du texte dans le fichier
fprintf (FileGeek, "Ecrivez ceci dans le fichier");
// Fermez le fichier
fcfrose (FileGeek);
// sortie du programme
retour (0);
} // FIN DE MAIN
Nous l'avons sauvegardé dans un fichier appelé "fichier-io.c" et l'a compilée avec
gcc
dans un exécutable appelé
stose
, Nommé pour "
style
course
ex
ample."
GCC -O File STEX-IO.c
Nous allons appeler
strace
De la ligne de commande et transmettez le nom de notre nouvel exécutable comme processus que nous voulons avoir tracé. Nous pourrions simplement suivre facilement 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 verbose. Il peut y avoir beaucoup de production. C'est génial quand vous utilisez
strace
En colère, mais cela peut être écrasant au début. Il y a limité
strace
Sortie pour notre petit programme. La deuxième raison est que notre programme a une fonctionnalité limitée et que le code source est court et direct. Cela facilite l'identification de quelles sections de la sortie se réfèrent aux différentes parties du fonctionnement interne du programme.
strace ./stex
Nous pouvons clairement voir la
écrivez
appel système Envoi du texte "Ecrivez ceci dans le fichier" à notre fichier ouvert et à la
Exit_group
Appel système. Ceci met fin à tous les threads de l'application et envoie une valeur de retour à la coquille.
Filtrer la sortie
Même avec notre programme de démonstration simple, il y a beaucoup de résultats. Nous pouvons utiliser le
--e
(expression) option. Nous passerons au nom de l'appel système que nous voulons voir.
Strace -e écrire ./stex
Vous pouvez signaler plusieurs appels système en les ajoutant sous forme de liste séparée par des virgules. N'incluez pas de blancheur dans la liste des appels système.
Strace -e Fermer, écrivez ./stex
Envoi de la sortie à un fichier
L'avantage de filtrer la sortie est également le problème de filtrage de la sortie. Vous voyez ce que vous avez demandé de voir, mais vous ne voyez rien d'autre. Et une partie de cette autre sortie pourrait vous être plus utile que celle que vous avez invitée à voir.
Parfois, il est plus pratique de tout capturer et de rechercher et de faire défiler tout l'ensemble des résultats. De cette façon, vous n'exclure pas accidentellement quelque chose d'important. Les
-o
L'option (sortie) vous permet d'envoyer la sortie d'un
strace
Session à un fichier texte.
Strace -o Trace-Sortie.txt ./stex
Vous pouvez alors
Utilisez le
moins
commander
Pour faire défiler la liste et rechercher des appels système - ou quelque chose d'autre par nom.
Moins Trace-Output.txt
Vous pouvez maintenant utiliser tous
moins
Capacités de recherche de la recherche d'enquête sur la sortie.
EN RELATION: Comment utiliser la commande moins sur Linux
Ajouter des horodatages
Vous pouvez ajouter plusieurs horodatages différents à la sortie. Les
-R
(horodatage relatif) L'option ajoute des horodatages montrant 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 du 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 la quantité de temps passée dans chaque appel système, utilisez le
-T
Option (SysCall-Times). Cela montre la durée du temps passé à l'intérieur de chaque appel système.
strace -t ./stex
Les durées de temps sont affiché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
option (horodatage absolu). Cela montre l'heure "Horloge murale", avec une résolution de microseconde.
strace -tt ./stex
Les temps sont affichés au début de chaque ligne.
Tracer un processus de course
Si le processus que vous souhaitez tracer est déjà en cours d'exécution, vous pouvez toujours attacher
strace
à cela. Pour ce faire, vous devez connaître l'ID de processus. Vous pouvez
utilisation
ps
avec
grep
trouver ceci. Nous avons Firefox en cours d'exécution. Pour découvrir l'ID de la
firefox
processus, nous pouvons utiliser
ps
et
la pipe à travers
grep
.
PS -E | grep firefox
Nous pouvons voir que l'ID de processus est 8483. Nous allons utiliser le
-p
(ID de processus) Option à raconter
strace
quel processus attacher à. Notez que vous devrez utiliser
sudo
:
Sudo Strace -P 8483
Vous verrez une notification que
strace
s'est attachée au processus, puis les appels de trace du système seront affichés dans la fenêtre du terminal comme d'habitude.
Création d'un rapport
Les
-c
(Résumé uniquement) Option Causes
strace
imprimer un rapport. Il génère une table pour des informations sur les appels système effectués par le programme tracé.
strace -c ./stex
Les colonnes sont:
- % temps : Le pourcentage du temps d'exécution passé dans chaque appel système.
- secondes : Le temps total exprimé en secondes et les microsecondes dépensés dans chaque appel système.
- USECS / CALL : Le délai moyen des microsecondes a passé dans chaque appel système.
- appels : Le nombre de fois que chaque appel système a été exécuté.
- les erreurs : Nombre d'échecs pour chaque appel système.
- syscall : Le nom de l'appel système.
Ces valeurs montreront des zéros pour des programmes triviaux exécutés et terminés rapidement. Les valeurs du monde réel sont présentées pour des programmes qui font quelque chose de plus significatif que notre demande de démonstration.
Des idées profondes, facilement
Les
strace
La sortie peut vous montrer quels appels système sont fabriqués, lesquels sont faits à plusieurs reprises et la quantité de temps d'exécution consacrée à l'intérieur du code côté noyau. C'est une grande information. Souvent, lorsque vous essayez de comprendre ce qui se passe à l'intérieur de votre code, il est facile d'oublier que votre binaire interagit presque sans escale avec le noyau pour effectuer de nombreuses fonctions.
En utilisant
strace
, vous voyez la photo complète.