Tutorial del comando strace de Linux para principiantes (8 ejemplos)

Usando el comando strace en Linux

La l√≠nea de comandos de Linux ofrece muchas herramientas √ļtiles para los desarrolladores de software. Uno entre ellos es rastro cuyos conceptos b√°sicos analizaremos en este tutorial con algunos ejemplos f√°ciles de entender.

Pero antes de hacerlo, vale la pena mencionar que todos los ejemplos de este artículo se probaron en una máquina con Ubuntu 18.04 LTS y Debian 10.

El comando strace en Linux le permite rastrear llamadas y se√Īales del sistema. A continuaci√≥n se muestra su sintaxis:

strace [OPTIONS] command

Y así es como lo explica la página de manual de la herramienta:

       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.


Los siguientes son algunos ejemplos con estilo de preguntas y respuestas que deberían darle una mejor idea de cómo funciona el comando strace.

Instalando el comando strace

El comando strace no está instalado de forma predeterminada en la mayoría de los sistemas, para instalarlo en Debian y Ubuntu, ejecute este comando:

sudo apt-get install strace

Q1. ¬ŅC√≥mo usar el comando strace?

El uso b√°sico es simple, simplemente ejecute ‘strace’ con un comando como entrada. Por ejemplo, lo us√© con el comando ls:

strace ls

Y aquí está la salida producida en mi sistema:

Usando el comando strace en Linux

Q2. ¬ŅC√≥mo comprender la salida de strace?

Como puede ver en la captura de pantalla de la sección anterior, el comando strace produce muchos resultados. Por lo tanto, debe ser consciente de cómo comprenderlo.

Los siguientes extractos de la página del manual proporcionan una explicación 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 +++


Q3. ¬ŅC√≥mo hacer un puntero de instrucciones de impresi√≥n de strace?

Hay una opción -i que le dice a strace que imprima el puntero de instrucciones en el momento de la llamada al sistema.

Por ejemplo:

strace -i ls

Aquí está la salida:

Cómo hacer un puntero de instrucciones de impresión de strace

Entonces puede ver que el puntero de instrucción se imprimió en cada línea en la salida.

Q4. ¬ŅC√≥mo hacer que strace imprima la marca de tiempo para cada llamada al sistema?

Existe una opción de línea de comando -r que le dice a strace que muestre una marca de tiempo relativa al ingresar a cada llamada del sistema. La página de manual de la herramienta dice que esto registra la diferencia de tiempo entre el comienzo de las sucesivas llamadas al sistema.

Por ejemplo:

strace -r ls

La siguiente es la salida producida por este comando:

Cómo hacer que la marca de tiempo de impresión de strace para cada llamada al sistema

Entonces puede ver que se produjo una marca de tiempo relativa al comienzo de cada línea.

P5. ¬ŅC√≥mo prefijar cada l√≠nea de salida con la hora del reloj?

Si desea que cada línea en la salida de strace comience con la hora del reloj, puede hacerlo usando la opción de línea de comando -t.

Por ejemplo:

strace -t ls

Aquí está el resultado de este comando en mi sistema: Anuncio

Prefijo de tiempo de seguimiento

Entonces puede ver que la hora del sistema se imprimió al comienzo de cada línea.

Tenga en cuenta que hay dos opciones m√°s relacionadas que ofrece 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.


P6. ¬ŅC√≥mo hacer que strace muestre el tiempo dedicado a las llamadas al sistema?

Esto se puede lograr usando la opción de línea de comando -T.

Por ejemplo:

strace -T ls

La siguiente es la salida:

Mostrar tiempos de llamada de función con strace

Para que pueda ver el tiempo empleado en las llamadas al sistema se imprime al final de cada línea.

P7. ¬ŅC√≥mo hacer que strace imprima un resumen en lugar de la salida habitual?

La salida de la línea de comando -c se puede usar si desea que la herramienta produzca un resumen.

Por ejemplo, el siguiente comando:

strace -c ls

produjo esta salida en mi 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

Para que pueda ver el resumen, le da una idea de cuántas llamadas se realizaron por llamada al sistema, así como información relacionada con el tiempo para cada llamada al sistema.

Conclusión

Acabamos de ara√Īar la superficie aqu√≠, ya que el comando strace tambi√©n ofrece muchas otras caracter√≠sticas. Una vez que haya terminado de practicar todo lo que hemos discutido aqu√≠, dir√≠jase a la p√°gina man de strace para obtener m√°s informaci√≥n sobre la herramienta.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *