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.