GNU/Linux >> Tutoriels Linux >  >> Linux

Tutoriel de commande Linux strace pour les débutants (8 exemples)

La ligne de commande Linux offre de nombreux outils utiles aux développeurs de logiciels. L'un d'eux est strace , dont nous aborderons les bases dans ce didacticiel à l'aide d'exemples faciles à comprendre.

Mais avant cela, il convient de mentionner que tous les exemples de cet article ont été testés sur une machine Ubuntu 18.04 LTS et Debian 10.

La commande strace sous Linux vous permet de suivre les appels et les signaux système. Voici sa syntaxe :

strace [OPTIONS] command

Et voici comment la page de manuel de l'outil l'explique :

       In  the simplest case strace runs the specified command until it exits.
       It intercepts and records the  system  calls  which  are  called  by  a
       process  and  the signals which are received by a process.  The name of
       each system call, its arguments and its return  value  are  printed  on
       standard error or to the file specified with the -o option.

strace is a useful diagnostic, instructional, and debugging tool.  Sys?
       tem administrators, diagnosticians and trouble-shooters  will  find  it
       invaluable  for  solving problems with programs for which the source is
       not readily available since they do not need to be recompiled in  order
       to trace them.  Students, hackers and the overly-curious will find that
       a great deal can be learned about a system  and  its  system  calls  by
       tracing  even  ordinary programs.  And programmers will find that since
       system calls and signals are events  that  happen  at  the  user/kernel
       interface,  a close examination of this boundary is very useful for bug
       isolation, sanity checking and attempting to capture race conditions.

Voici quelques exemples de style questions-réponses qui devraient vous donner une meilleure idée du fonctionnement de la commande strace.

Installation de la commande strace

La commande strace n'est pas installée par défaut sur la plupart des systèmes, pour l'installer sur Debian et Ubuntu, exécutez cette commande :

sudo apt-get install strace

Q1. Comment utiliser la commande strace ?

L'utilisation de base est simple, il suffit d'exécuter 'strace' avec une commande en entrée. Par exemple, je l'ai utilisé avec la commande ls :

strace ls

Et voici la sortie produite sur mon système :

Q2. Comment comprendre la sortie strace ?

Comme vous pouvez le voir dans la capture d'écran de la section précédente, la commande strace produit beaucoup de sortie. Vous devez donc savoir comment le comprendre.

Les extraits suivants de la page de manuel fournissent une explication précise :

       Each line in the trace contains the system call name, followed  by  its
       arguments  in parentheses and its return value.  An example from strac?
       ing the command "cat /dev/null" is:

           open("/dev/null", O_RDONLY) = 3

       Errors (typically a return value of -1) have the errno symbol and error
       string appended.

           open("/foo/bar", O_RDONLY) = -1 ENOENT (No such file or directory)

       Signals are printed as signal symbol and decoded siginfo structure.  An
       excerpt from stracing and interrupting the command "sleep 666" is:

           sigsuspend([] <unfinished ...>
           --- SIGINT {si_signo=SIGINT, si_code=SI_USER, si_pid=...} ---
           +++ killed by SIGINT +++

Q3. Comment créer un pointeur d'instruction d'impression strace ?

Il existe une option -i qui indique à strace d'afficher le pointeur d'instruction au moment de l'appel système.

Par exemple :

strace -i ls

Voici le résultat :

Ainsi, vous pouvez voir que le pointeur d'instruction a été imprimé sur chaque ligne de la sortie.

Q4. Comment créer un horodatage d'impression strace pour chaque appel système ?

Il existe une option de ligne de commande -r qui indique à strace d'afficher un horodatage relatif lors de l'entrée de chaque appel système. La page de manuel de l'outil indique que cela enregistre la différence de temps entre le début des appels système successifs.

Par exemple :

strace -r ls

Voici la sortie produite par cette commande :

Ainsi, vous pouvez voir qu'un horodatage relatif a été produit au début de chaque ligne.

Q5. Comment préfixer chaque ligne de sortie avec l'heure de l'horloge ?

Si vous souhaitez que chaque ligne de la sortie strace commence par l'heure d'horloge, cela peut être fait à l'aide de l'option de ligne de commande -t.

Par exemple :

strace -t ls

Voici le résultat de cette commande sur mon système :

Ainsi, vous pouvez voir que l'heure système est imprimée au début de chaque ligne.

Notez qu'il existe deux autres options liées à strace :

-tt         
If given twice, the time printed will include the microseconds.

-ttt       
If given thrice, the  time  printed  will  include  the microseconds and the leading portion will
be printed as the number of seconds since the epoch.

Q6. Comment faire en sorte que strace affiche le temps passé dans les appels système ?

Ceci peut être réalisé en utilisant l'option de ligne de commande -T.

Par exemple :

strace -T ls

Voici le résultat :

Ainsi, vous pouvez voir que le temps passé dans les appels système est imprimé à la fin de chaque ligne.

Q7. Comment faire en sorte que strace imprime un résumé au lieu de la sortie habituelle ?

La sortie de ligne de commande -c peut être utilisée si vous souhaitez que l'outil produise un résumé.

Par exemple, la commande suivante :

strace -c ls

a produit cette sortie sur mon système :

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 93.66    0.000133           5        28           write
  6.34    0.000009           1        11           close
  0.00    0.000000           0         7           read
  0.00    0.000000           0        10           fstat
  0.00    0.000000           0        17           mmap
  0.00    0.000000           0        12           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         2           ioctl
  0.00    0.000000           0         8         8 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         2           getdents
  0.00    0.000000           0         2         2 statfs
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         9           openat
  0.00    0.000000           0         1           set_robust_list
  0.00    0.000000           0         1           prlimit64
------ ----------- ----------- --------- --------- ----------------
100.00    0.000142                   120        10 total

Ainsi, vous pouvez voir que le résumé vous donne une idée du nombre d'appels effectués par appel système ainsi que des informations relatives au temps pour chaque appel système.

Conclusion

Nous venons d'effleurer la surface ici car la commande strace offre également de nombreuses autres fonctionnalités. Une fois que vous avez terminé de pratiquer tout ce dont nous avons discuté ici, rendez-vous sur la page de manuel de strace pour en savoir plus sur l'outil.


Linux
  1. Tutoriel de commande cd Linux pour les débutants (8 exemples)

  2. Tutoriel de commande Linux comm pour les débutants (5 exemples)

  3. Tutoriel de commande Linux df pour les débutants (8 exemples)

  4. Tutoriel de commande de date Linux pour les débutants (8 exemples)

  5. Tutoriel Linux du Command pour débutants (10 exemples)

Tutoriel de commande Linux nm pour les débutants (10 exemples)

Tutoriel de commande Linux OD pour les débutants (6 exemples)

Tutoriel de commande Linux w pour débutants (5 exemples)

Tutoriel de commande Linux passwd pour les débutants (8 exemples)

Tutoriel de commande Linux ss pour les débutants (8 exemples)

Tutoriel de commande Linux chattr pour les débutants (5 exemples)