Un collègue m'a dit une fois que la dernière option lorsque tout n'a pas réussi à déboguer sous Linux était d'utiliser strace .
J'ai essayé d'apprendre la science derrière cet outil étrange, mais je ne suis pas un gourou de l'administration système et je n'ai pas vraiment obtenu de résultats.
Alors,
- Qu'est-ce que c'est exactement et que fait-il?
- Comment et dans quels cas faut-il l'utiliser?
- Comment comprendre et traiter le résultat?
En bref, en termes simples , comment ça marche?
man strace
très facile à lire et utile. (PS ne connaissait pas Strace avant hier et pas un expert Linux)Réponses:
Présentation de Strace
strace peut être considéré comme un débogueur léger. Il permet à un programmeur / utilisateur de découvrir rapidement comment un programme interagit avec le système d'exploitation. Pour ce faire, il surveille les appels et les signaux du système.
Utilisations
Idéal lorsque vous n'avez pas de code source ou que vous ne voulez pas vous embêter à le parcourir.
Aussi, utile pour votre propre code si vous n'avez pas envie d'ouvrir GDB, mais que vous souhaitez simplement comprendre l'interaction externe.
Une bonne petite introduction
J'ai rencontré cette intro pour utiliser Strace l'autre jour: Strace Hello World
la source
ltrace
stackoverflow.com/a/52012215/5884955-EFAULT
(oups, lecture seule tampon) ou-ENOENT
(oups, exécuté à partir du mauvais répertoire où le chemin relatif ne fonctionnait pas).)En termes simples, strace trace tous les appels système émis par un programme avec leurs codes retour. Pensez à des choses telles que les opérations de fichier / socket et beaucoup plus obscures.
Il est très utile si vous avez une connaissance pratique de C car ici les appels système représenteraient plus précisément les appels de bibliothèque C standard.
Disons que votre programme est / usr / local / bin / cough. Utilisez simplement:
ou
pour écrire dans 'out_file'.
Toutes les sorties strace iront à stderr (attention, le volume de celui-ci demande souvent une redirection vers un fichier). Dans les cas les plus simples, votre programme s'interrompra avec une erreur et vous pourrez voir où en sont ses dernières interactions avec l'OS en sortie strace.
Plus d'informations devraient être disponibles avec:
la source
strace répertorie tous les appels système effectués par le processus auquel il est appliqué. Si vous ne savez pas ce que les appels système signifient, vous ne pourrez pas en tirer beaucoup de kilométrage.
Néanmoins, si votre problème concerne des fichiers ou des chemins ou des valeurs d'environnement, l'exécution de strace sur le programme problématique et la redirection de la sortie vers un fichier, puis en accueillant ce fichier pour votre chaîne chemin / fichier / env peut vous aider à voir ce que votre programme tente réellement de faire, contrairement à ce que vous attendiez.
la source
strace <prog_name>
pour tracer un programme.strace -o <out_file> <prog_name>
à mettre dans un fichierstrace -e open myprog
OU pour tous les appels sys liés aux fichiers:strace -e file myprog
Strace se démarque comme un outil pour étudier les systèmes de production où vous ne pouvez pas vous permettre d'exécuter ces programmes sous un débogueur. En particulier, nous avons utilisé strace dans les deux situations suivantes:
Pour un exemple d'analyse à l'aide de strace, voir ma réponse à cette question .
la source
J'utilise strace tout le temps pour déboguer les problèmes d'autorisation. La technique va comme ceci:
Où
gnome-calculator
est la commande que vous souhaitez exécuter.la source
strace -tfp PID surveillera les appels système du processus PID, ainsi nous pouvons déboguer / surveiller l'état de notre processus / programme.
la source
Strace peut être utilisé comme outil de débogage ou comme profileur primitif.
En tant que débogueur, vous pouvez voir comment les appels système donnés ont été appelés, exécutés et ce qu'ils renvoient. C'est très important, car cela vous permet de voir non seulement qu'un programme a échoué, mais POURQUOI un programme a échoué. Habituellement, c'est simplement le résultat d'un codage moche qui n'attrape pas tous les résultats possibles d'un programme. D'autres fois, ce ne sont que des chemins codés en dur vers des fichiers. Sans effort, vous devinez ce qui s'est mal passé, où et comment. Avec strace, vous obtenez une ventilation d'un appel système, généralement en regardant simplement une valeur de retour vous en dit beaucoup.
Le profilage est une autre utilisation. Vous pouvez l'utiliser pour chronométrer l'exécution de chaque syscall individuellement ou en tant qu'agrégat. Bien que cela ne soit pas suffisant pour résoudre vos problèmes, cela réduira au moins considérablement la liste des suspects potentiels. Si vous voyez beaucoup de paires fopen / close sur un seul fichier, vous ouvrez et fermez inutilement des fichiers à chaque exécution d'une boucle, au lieu de l'ouvrir et de le fermer en dehors d'une boucle.
Ltrace est le proche cousin de strace, également très utile. Vous devez apprendre à différencier où se trouve votre goulot d'étranglement. Si une exécution totale est de 8 secondes et que vous ne dépensez que 0,05 s en appels système, alors le stracing du programme ne vous fera pas beaucoup de bien, le problème est dans votre code, qui est généralement un problème de logique, ou le programme a réellement besoin de prendre autant de temps à courir.
Le plus gros problème avec strace / ltrace est la lecture de leur sortie. Si vous ne savez pas comment les appels sont effectués, ou au moins les noms des appels système / fonctions, il sera difficile de déchiffrer la signification. Savoir ce que les fonctions renvoient peut également être très bénéfique, en particulier pour différents codes d'erreur. Bien que ce soit difficile à déchiffrer, ils retournent parfois vraiment une perle de connaissances; une fois que j'ai vu une situation où j'ai manqué d'inodes, mais pas d'espace libre, donc tous les utilitaires habituels ne m'ont donné aucun avertissement, je ne pouvais tout simplement pas créer un nouveau fichier. La lecture du code d'erreur à partir de la sortie de strace m'a indiqué la bonne direction.
la source
Strace est un outil qui vous indique comment votre application interagit avec votre système d'exploitation.
Pour ce faire, il vous indique quel système d'exploitation appelle votre application et avec quels paramètres il les appelle.
Ainsi, par exemple, vous voyez quels fichiers votre programme essaie d'ouvrir et la météo de l'appel réussit.
Vous pouvez déboguer toutes sortes de problèmes avec cet outil. Par exemple, si l'application indique qu'elle ne peut pas trouver la bibliothèque que vous savez que vous avez installée, votre strace vous dira où l'application recherche ce fichier.
Et ce n'est là qu'une partie de l'iceberg.
la source
strace est un bon outil pour apprendre comment votre programme effectue divers appels système (demandes au noyau) et signale également ceux qui ont échoué ainsi que la valeur d'erreur associée à cet échec. Tous les échecs ne sont pas des bogues. Par exemple, un code qui essaie de rechercher un fichier peut obtenir une erreur ENOENT (aucun fichier ou répertoire), mais cela peut être un scénario acceptable dans la logique du code.
Un bon cas d'utilisation de strace consiste à déboguer les conditions de concurrence lors de la création de fichiers temporaires. Par exemple, un programme qui peut créer des fichiers en ajoutant l'ID de processus (PID) à une chaîne prédéterminée peut rencontrer des problèmes dans des scénarios multithreads. [Un PID + TID (identifiant de processus + identifiant de thread) ou un meilleur appel système tel que mkstemp corrigera ce problème].
Il est également bon pour déboguer les plantages. Vous pouvez trouver cet (mon) article sur strace et le débogage des plantages utile.
la source
Exemple exécutable minimal
Si un concept n'est pas clair, il y a un exemple plus simple que vous n'avez pas vu qui l'explique.
Dans ce cas, cet exemple est le monde bonjour de l'assemblage Linux x86_64 (pas de libc):
bonjour.S
GitHub en amont .
Assemblez et exécutez:
Produit les résultats attendus:
Maintenant, utilisons strace sur cet exemple:
Nous utilisons:
env -i ASDF=qwer
pour contrôler les variables d'environnement: /unix/48994/how-to-run-a-program-in-a-clean-environment-in-bash-s999 -v
pour afficher des informations plus complètes sur les journauxstrace.log
contient désormais:Avec un exemple aussi minimal, chaque caractère de la sortie est évident:
execve
ligne: montre commentstrace
exécutéhello.out
, y compris les arguments CLI et l'environnement comme documenté àman execve
write
ligne: affiche l'appel système d'écriture que nous avons effectué.6
est la longueur de la chaîne"hello\n"
.= 6
est la valeur de retour de l'appel système, qui, comme indiqué dans,man 2 write
est le nombre d'octets écrits.exit
ligne: affiche l'appel système de sortie que nous avons effectué. Il n'y a pas de valeur de retour, car le programme quitte!Exemples plus complexes
L'application de strace est bien sûr de voir quels appels système les programmes complexes font réellement pour aider à déboguer / optimiser votre programme.
Notamment, la plupart des appels système que vous êtes susceptible de rencontrer sous Linux ont des wrappers glibc, dont beaucoup proviennent de POSIX .
En interne, les wrappers glibc utilisent un assemblage en ligne plus ou moins comme ceci: Comment appeler un appel système via sysenter dans un assemblage en ligne?
L'exemple suivant que vous devriez étudier est un
write
monde bonjour POSIX :principal c
Compiler et exécuter:
Cette fois, vous verrez qu'un tas d'appels système sont effectués par glibc avant
main
de configurer un environnement agréable pour main.C'est parce que nous n'utilisons pas maintenant un programme autonome, mais plutôt un programme glibc plus commun, qui permet la fonctionnalité libc.
Ensuite, à chaque extrémité,
strace.log
contient:Nous concluons donc que la
write
fonction POSIX utilise, surprise !, l'write
appel système Linux .On observe également que cela
return 0
conduit à unexit_group
appel au lieu deexit
. Ha, je ne connaissais pas celui-ci! C'est pourquoistrace
c'est si cool.man exit_group
explique ensuite:Et voici un autre exemple où j'ai étudié quel appel système
dlopen
utilise: /unix/226524/what-system-call-is-used-to-load-libraries-in-linux/462710#462710Testé dans Ubuntu 16.04, GCC 6.4.0, noyau Linux 4.4.0.
la source
Voici quelques exemples de la façon dont j'utilise strace pour creuser dans des sites Web. J'espère que cela vous sera utile.
Vérifiez le temps de premier octet comme ceci:
Voyez quel pourcentage d'actions fait quoi. Beaucoup
lstat
etfstat
pourrait être une indication qu'il est temps de vider le cache:Sorties a
trace.txt
pour que vous puissiez voir exactement quels appels sont effectués.Utilisez cette option pour vérifier si quelque chose a entre
.1
à.9
une seconde à la charge:Voyez quels fichiers ou répertoires manquants se sont retrouvés dans le
strace
. Cela produira beaucoup de choses impliquant notre système - les seuls bits pertinents impliquent les fichiers du client:la source
J'ai aimé certaines des réponses où il lit
strace
vérifie comment vous interagissez avec votre système d'exploitation.C'est exactement ce que nous pouvons voir. Le système appelle. Si vous comparez
strace
etltrace
la différence est plus évidente.D'un autre côté, il existe
ltrace
des fonctions de trace.Bien que j'ai vérifié les manuels plusieurs fois, je n'ai pas trouvé l'origine du nom,
strace
mais il s'agit probablement d'une trace des appels système, car cela est évident.Il y a trois notes plus importantes à dire
strace
.Remarque 1: ces deux fonctions
strace
etltrace
utilisent l'appel systèmeptrace
. Doncptrace
, l'appel système est efficacestrace
.Remarque 2: vous pouvez utiliser différents paramètres
strace
, car ilsstrace
peuvent être très détaillés. J'aime expérimenter-c
ce qui est comme un résumé des choses. En fonction de,-c
vous pouvez sélectionner un appel système comme celui-e trace=open
où vous ne verrez que cet appel. Cela peut être intéressant si vous examinez quels fichiers seront ouverts lors de la commande que vous tracez. Et bien sûr, vous pouvez utiliser legrep
dans le même but, mais notez que vous devez rediriger comme ceci2>&1 | grep etc
pour comprendre que les fichiers de configuration sont référencés lorsque la commande a été émise.Note 3: Je trouve cette note très importante. Vous n'êtes pas limité à une architecture spécifique.
strace
vous épatera, car il peut tracer des binaires de différentes architectures.la source