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

La ligne de commande Linux offre de nombreux outils qui sont utiles aux développeurs de logiciels. L’un d’entre eux est strace, une commande qui permet de tracer les appels et les signaux du système Linux. Les bases de strace dont nous allons parler dans ce tutoriel à l’aide de quelques exemples faciles à comprendre.

Mais avant cela, il est bon de mentionner que tous les exemples de cet article ont été testés sur une machine Ubuntu 22.04 LTS et Debian 11.

Commande strace de Linux

La commande strace de Linux te permet de suivre les appels et 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 sous forme de questions-réponses qui devraient te 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écute 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 le résultat produit sur mon système :

Utiliser la commande strace sur Linux

Q2. Comment comprendre la sortie de strace ?

Comme tu peux le voir sur la capture d’écran de la section précédente, la commande strace produit beaucoup de sorties. Tu dois donc savoir comment les comprendre.

Les extraits suivants de la page de manuel fournissent une explication pertinente :

       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 faire pour que strace imprime le pointeur d’instruction ?

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

Par exemple :

strace -i ls

Voici la sortie :

Comment faire en sorte que strace imprime le pointeur d'instruction

Tu peux donc voir que le pointeur d’instruction a été imprimé dans chaque ligne de la sortie.

Q4. Comment faire pour que strace imprime l’horodatage pour chaque appel système ?

Il existe une option de ligne de commande -r qui indique à strace d’afficher un horodatage relatif à 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 :

Comment faire en sorte que strace imprime l'horodatage pour chaque appel système

Tu peux donc 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 tu veux que chaque ligne de la sortie de strace commence par l’heure, tu peux le faire en utilisant l’option de ligne de commande -t.

Par exemple :

strace -t ls

Voici la sortie de cette commande sur mon système :

Préfixe de temps Strace

Tu peux donc voir que l’heure système a été imprimée au début de chaque ligne.

Note qu’il existe deux autres options connexes que strace propose :

-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 pour que strace affiche le temps passé dans les appels système ?

Tu peux le faire en utilisant l’option de ligne de commande -T.

Par exemple :

strace -T ls

Voici le résultat :

Montre les timings des appels de fonction avec strace

Tu peux donc voir que le temps passé dans les appels système est imprimé à la fin de chaque ligne.

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

La sortie de la ligne de commande -c peut être utilisée si tu veux 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

Tu peux donc voir que le résumé te donne une idée du nombre d’appels effectués par syscall ainsi que des informations relatives au temps pour chaque syscall.

Conclusion

Nous n’avons fait qu’effleurer la surface ici car la commande strace offre aussi beaucoup d’autres fonctionnalités. Une fois que tu auras mis en pratique ce dont nous avons parlé ici, consulte la page de manuel de strace pour en savoir plus sur cet outil.

Vous aimerez aussi...