La riga di comando di Linux offre molti strumenti utili per gli sviluppatori di software. Uno di questi è strace , le basi di cui parleremo in questo tutorial utilizzando alcuni esempi di facile comprensione.
Ma prima di farlo, vale la pena ricordare che tutti gli esempi in questo articolo sono stati testati su una macchina Ubuntu 18.04 LTS e Debian 10.
Il comando strace in Linux ti consente di tracciare chiamate e segnali di sistema. Di seguito è riportata la sua sintassi:
strace [OPTIONS] command
Ed ecco come lo spiega la pagina man dello strumento:
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.
Di seguito sono riportati alcuni esempi in stile domande e risposte che dovrebbero darti un'idea migliore di come funziona il comando strace.
Installazione del comando strace
Il comando strace non è installato di default sulla maggior parte dei sistemi, per installarlo su Debian e Ubuntu, esegui questo comando:
sudo apt-get install strace
Q1. Come usare il comando strace?
L'utilizzo di base è semplice, basta eseguire 'strace' con un comando come input. Ad esempio, l'ho usato con il comando ls:
strace ls
Ed ecco l'output prodotto sul mio sistema:
Q2. Come comprendere l'output di strace?
Come puoi vedere nello screenshot nella sezione precedente, il comando strace produce molto output. Quindi devi essere consapevole di come comprenderlo.
I seguenti estratti dalla pagina man forniscono una spiegazione dettagliata:
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 +++
T3. Come creare un puntatore di istruzioni di stampa strace?
C'è un'opzione -i che dice a strace di stampare il puntatore di istruzione al momento della chiamata di sistema.
Ad esempio:
strace -i ls
Ecco l'output:
Quindi puoi vedere che il puntatore dell'istruzione è stato stampato in ogni riga dell'output.
Q4. Come creare un timestamp di stampa strace per ogni chiamata di sistema?
Esiste un'opzione della riga di comando -r che dice a strace di visualizzare un timestamp relativo all'ingresso di ogni chiamata di sistema. La pagina man dello strumento dice che questo registra la differenza di tempo tra l'inizio delle successive chiamate di sistema.
Ad esempio:
strace -r ls
Di seguito è riportato l'output prodotto da questo comando:
Quindi puoi vedere che è stato prodotto un timestamp relativo all'inizio di ogni riga.
Q5. Come anteporre a ciascuna riga di output l'ora dell'orologio?
Se vuoi che ogni riga nell'output di strace inizi con l'ora dell'orologio, puoi farlo usando l'opzione della riga di comando -t.
Ad esempio:
strace -t ls
Ecco l'output di questo comando sul mio sistema:
Quindi puoi vedere che l'ora di sistema è stata stampata all'inizio di ogni riga.
Nota che ci sono altre due opzioni correlate offerte 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. Come rendere strace show il tempo speso nelle chiamate di sistema?
Questo può essere ottenuto usando l'opzione della riga di comando -T.
Ad esempio:
strace -T ls
Di seguito è riportato l'output:
Così puoi vedere che il tempo trascorso nelle chiamate di sistema è stampato alla fine di ogni riga.
Q7. Come fare in modo che strace stampi un riepilogo invece del solito output?
L'output della riga di comando -c può essere utilizzato se si desidera che lo strumento produca un riepilogo.
Ad esempio, il comando seguente:
strace -c ls
prodotto questo output sul mio sistema:
% 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
In questo modo puoi vedere il riepilogo ti dà un'idea di quante chiamate sono state effettuate per syscall e informazioni relative al tempo per ciascuna syscall.
Conclusione
Abbiamo appena graffiato la superficie qui poiché il comando strace offre anche molte altre funzionalità. Una volta che hai finito di esercitarti su ciò di cui abbiamo discusso qui, vai alla pagina man di strace per saperne di più sullo strumento.