Ricerca nel sito web

Linux strace Command Tutorial per principianti (8 esempi)


Su questa pagina

  1. D1. Come usare il comando strace?
  2. Q2. Come comprendere l'output di strace?
  3. Q3. Come creare un puntatore di istruzioni per la stampa strace?
  4. Q4. Come creare un timestamp di stampa strace per ogni chiamata di sistema?
  5. D5. Come aggiungere il prefisso a ciascuna riga di output con l'ora dell'orologio?
  6. D6. Come fare in modo che strace mostri il tempo speso nelle chiamate di sistema?
  7. D7. Come fare in modo che strace stampi un riepilogo invece del solito output?
  8. 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.