Comment utiliser strace pour tracer les appels et les signaux système –
Le traçage d’un programme informatique n’est pas réservé uniquement à ceux qui ont le code source, peuvent le lire et savent utiliser un débogueur. Tout utilisateur Linux peut tracer un exécutable avec strace. Trouver comment!
Sommaire
Qu’est-ce que strace?
strace est un utilitaire Linux qui vous permet de tracer les appels système effectués par une application donnée. Il captera également les signaux et produira une sortie détaillée de toutes les informations qu’il observe.
Une personne novice dans le domaine du strace et du traçage, en général, pourrait se demander pourquoi cela est utile. Un ingénieur informatique professionnel peut demander quelle quantité d’informations peut réellement capter, surtout s’il sait quelle quantité peut être consultée à partir d’un débogueur comme GDB.
Si vous êtes intéressé par le débogage de code informatique et de programmes, consultez notre article Débogage avec GDB: Premiers pas.
Il y a de bonnes nouvelles dans les deux cas! Le suivi de tous les appels et signaux système fournit une image complète du fonctionnement d’un programme, et c’est un excellent outil de dépannage et même de débogage. De plus, il s’exécute pendant l’exécution (en tant que processus wrapper), mais peut facilement tracer dans un fichier journal et offre une vue d’ensemble facile à comprendre des actions d’un programme.
En comparant cela avec GDB, qui est également un processus wrapper, les choses sont sensiblement différentes. Par exemple, dans GDB, on pourrait tracer un programme étape par étape (par exemple, une ligne de code à la fois ou un bloc logique de code – ou en utilisant des points d’arrêt dans le code). Cependant, de telles étapes sont faites durant runtime, tandis que strace exécute simplement le programme dans son ensemble jusqu’à ce qu’une erreur se produise ou jusqu’à la fin.
L’ingénieur ou l’utilisateur peut alors aller analyser le journal complet (basé sur du texte), rechercher des chaînes intéressantes, etc. De plus, GDB permettrait également de voir les signaux et les appels système, bien que configurer cela et analyser la même chose soit beaucoup plus complexe qu’avec strace
.
Avec strace, vous pouvez simplement exécuter le programme sous strace
(c’est à dire strace some_program
), et bien que ce soit à peu près le même que GDB, le fonctionnement diffère considérablement, comme décrit ci-dessus.
En ce qui concerne la quantité d’informations pouvant être consultées à partir d’une trace, il est bon de prendre du recul et de se rappeler d’où viennent la plupart des problèmes informatiques: disque plein, mémoire épuisée, certains fichiers n’ont pas été trouvés, entrée incorrecte, etc.
Surtout dans les domaines de l’accès disque, strace
brille vraiment. Comme il enregistre tous les appels système, chaque accès au disque est très visible dans le journal. Encore une fois, vous pouvez rechercher des chaînes de texte et des noms de fichiers pertinents, mais sachez que parfois, les chaînes peuvent être réduites en longueur, de sorte que seule la sortie partielle peut être visible.
En résumé, si nous devions évaluer strace
comme outil de débogage et / ou de dépannage et attribuez-lui une place dans une boîte à outils utilisateur Linux plus récente ou plus compétente, puis dans les deux cas, la réponse est environ au milieu, bien que se penchant un peu plus vers le dépannage que le débogage. Installons strace
suivant.
Installation strace
À installer strace sur votre distribution Linux basée sur Debian / Apt (comme Ubuntu et Mint), exécutez la commande suivante dans votre terminal:
sudo apt install strace
À installer strace sur votre distribution Linux basée sur RedHat / Yum (comme RHEL, Centos et Fedora), exécutez la commande suivante dans votre terminal:
sudo yum install strace
Utilisant strace
Après l’installation strace
, c’est assez simple pour commencer. On peut, par exemple, tracer le Linux sleep
commande / utilitaire:
strace sleep 1
Immédiatement, la sortie prouve la déclaration faite ci-dessus. Il y a une pléthore d’informations sur toutes les actions entreprises par le (très) simple sleep 1
commande, qui, après tout, ne fait que dormir pendant une seule seconde.
Regardons quelques choses que nous pouvons observer immédiatement:
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
Nous pouvons voir que peu de temps après le démarrage, le programme a tenté d’accéder (sur disque) au fichier /etc/ld.so.preload
. Nous pouvons également voir que cela a échoué (-1 status
), car le fichier n’a pas été trouvé (ENOENT
) avec le message d’erreur descriptif No such file or directory
.
Cette seule ligne de production pourrait conduire à des recherches plus poussées. Par exemple, nous pouvons scanner notre moteur de recherche préféré pour ce que le fichier /etc/ld.so.preload
est / fait et que se passe-t-il lorsqu’un programme ne peut pas le trouver, ainsi que comment nous pouvons l’installer.
Comme vous pouvez le voir, si vous exécutiez un logiciel / programme plus compliqué sous strace
, vous constaterez peut-être qu’il essaie d’accéder à un fichier, par exemple, un fichier partagé .so
bibliothèque – et ne peut pas la trouver. Il est facilement analysé et probablement facilement corrigé grâce à strace
.
Ensuite, nous voyons le conf.d
cache binaire ouvert avec succès en tant que lecture seulement (O_RDONLY
), avec l’indicateur close-on-exec (utilisé dans les programmes multithread pour éviter les conditions de concurrence) O_CLOEXEC
ensemble de drapeaux:
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
Même si l’on ne sait pas ce que signifie chaque élément, une simple recherche en ligne fournira rapidement des informations sur chaque terme ou mot spécifique, aidant à comprendre les informations présentées et ce qui se passe.
Cette ligne vers la fin est également particulièrement intéressante:
+++ exited with 0 +++
Cela indique que le programme s’est terminé avec succès avec le code de sortie 0
. Un code de sortie de 0 indique généralement une exécution et une terminaison réussies dans les programmes Linux.
Comme vous pouvez le voir dans les exemples ci-dessus, il est facile de voir ce que fait un programme en utilisant strace
. Chaque ligne et même chaque mot de chaque ligne peuvent être analysés, et souvent, un moteur de recherche est nécessaire pour faire la lumière. Cependant, même jeter un coup d’œil sur la sortie d’un programme défaillant peut suffire pour trouver la cause exacte et la corriger, et en particulier lorsque, par exemple, un fichier requis est manquant, etc.
Suivi des processus enfants
Lors de l’utilisation strace
, il semblera parfois que strace
ne trace pas correctement tous les appels système du programme, etc. Cela pourrait simplement être dû au fait que le programme en cours de suivi a lancé / démarré un certain nombre de processus enfants, par exemple en forçant des processus enfants.
Il est simple d’inclure ces processus enfants dans la capture strace: ajoutez simplement le -f
option à la ligne de commande (c’est-à-dire, strace -f your_program
), et tous les appels système, etc., de tous les processus enfants seront également suivis.
Emballer
Dans cet article, nous avons discuté de la strace
outil, qui peut être utilisé pour faire des traces de tout programme ou application s’exécutant sur un ordinateur Linux.
Après avoir installé l’outil, nous pouvons simplement et directement démarrer le programme sous strace
et profitez du haut niveau d’informations de dépannage et de débogage que le strace
wrapper nous présentera.