Linux strace Command Tutorial per principianti (8 esempi)
Su questa pagina
- D1. Come usare il comando strace?
- Q2. Come comprendere l'output di strace?
- Q3. Come creare un puntatore di istruzioni per la stampa strace?
- Q4. Come creare un timestamp di stampa strace per ogni chiamata di sistema?
- D5. Come aggiungere il prefisso a ciascuna riga di output con l'ora dell'orologio?
- D6. Come fare in modo che strace mostri il tempo speso nelle chiamate di sistema?
- D7. Come fare in modo che strace stampi un riepilogo invece del solito output?
- Conclusione
La riga di comando di Linux offre molti strumenti utili per gli sviluppatori di software. Uno di questi è strace, un comando per tracciare chiamate e segnali di sistema Linux. Le basi strace di cui discuteremo 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 22.04 LTS e Debian 11.
Il comando strace in Linux ti consente di tracciare chiamate e segnali di sistema. Di seguito la sua sintassi:
strace [OPTIONS] command
Ed ecco come lo spiega la pagina man degli strumenti:
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.
I seguenti sono alcuni esempi in stile Q&A che dovrebbero darti un'idea migliore di come funziona il comando strace.
Installazione del comando strace
Il comando strace non è installato per impostazione predefinita sulla maggior parte dei sistemi, per installarlo su Debian e Ubuntu, eseguire 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:
D2. 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 precisa:
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 +++
D3. Come creare un puntatore di istruzioni per la stampa strace?
C'è un'opzione -i che dice a strace di stampare il puntatore dell'istruzione al momento della chiamata di sistema.
Per esempio:
strace -i ls
Ecco l'output:
Quindi puoi vedere che il puntatore dell'istruzione è stato stampato in ogni riga nell'output.
D4. 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'accesso a ciascuna chiamata di sistema. La pagina man degli strumenti dice che questo registra la differenza di tempo tra l'inizio delle successive chiamate di sistema.
Per esempio:
strace -r ls
Di seguito è riportato l'output prodotto da questo comando:
Quindi puoi vedere che un timestamp relativo è stato prodotto all'inizio di ogni riga.
Q5. Come aggiungere il prefisso a ciascuna riga di output con l'ora dell'orologio?
Se si desidera che ogni riga nell'output di strace inizi con l'ora dell'orologio, è possibile farlo utilizzando l'opzione della riga di comando -t.
Per esempio:
strace -t ls
Ecco l'output di questo comando sul mio sistema:
Quindi puoi vedere che l'ora del sistema è stata stampata all'inizio di ogni riga.
Si noti che ci sono altre due opzioni correlate strace offre:
-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.
D6. Come fare in modo che strace mostri il tempo speso nelle chiamate di sistema?
Ciò può essere ottenuto utilizzando l'opzione della riga di comando -T.
Per esempio:
strace -T ls
Di seguito è riportato l'output:
Quindi puoi vedere 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 seguente comando:
strace -c ls
ha 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
Quindi puoi vedere il riepilogo che ti dà un'idea di quante chiamate sono state effettuate per syscall e informazioni relative al tempo per ogni syscall.
Conclusione
Abbiamo appena scalfito la superficie qui poiché il comando strace offre anche molte altre funzionalità. Una volta che hai finito di esercitarti con ciò che abbiamo discusso qui, vai alla pagina man di strace per saperne di più sullo strumento.