GNU/Linux >> Linux Esercitazione >  >> Linux

Tutorial sui comandi di Linux strace per principianti (8 esempi)

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.


Linux
  1. Tutorial sul comando cd di Linux per principianti (8 esempi)

  2. Tutorial comando Linux comm per principianti (5 esempi)

  3. Linux df Command Tutorial per principianti (8 esempi)

  4. Tutorial sul comando della data di Linux per principianti (8 esempi)

  5. Linux du Command Tutorial per principianti (10 esempi)

Tutorial sui comandi Linux nm per principianti (10 esempi)

Esercitazione sui comandi OD Linux per principianti (6 esempi)

Linux w Command Tutorial per principianti (5 esempi)

Linux passwd Command Tutorial per principianti (8 esempi)

Tutorial sui comandi Linux ss per principianti (8 esempi)

Linux chattr Command Tutorial per principianti (5 esempi)