Uso del comando strace en linux

Uso del comando strace en linux.

Examinar y comprender las acciones hechas por los procesos y, las llamadas al sistema por ejecución, es una tarea que en algunos casos nos pueden ayudar a solventar problemas en nuestro sistema.

Así como existe ptrace que nos ayuda a depurar y diagnosticar procesos del kernel, tenemos el comando strace que tiene la capacidad de rastrear y monitorizar procesos, de forma que nos facilite el trabajo de depurar los procesos que interactúan con el Kernel.

En este artículo vemos algunos ejemplos de cómo usar la herramienta strace, para rastrear, monitorear y depurar procesos. Pero antes, debes tener claro… el significado de «llamadas al sistema».

Cada vez que se ejecuta una aplicación o herramienta, se lanza una solicitud de lectura, escritura, borrado, salida, enlace, etc., se realiza una llamada al sistema. Las llamadas pueden ser producidas por cualquier motivo, y en un sistema que funciona correctamente son constantes y diversas. Comando strace.

Comando strace

Comando strace

Uso del comando strace

 

Uso del comando strace en linux

La herramienta strace, no viene preinstalada en las distribuciones Linux corrientes, pero si la encontramos en sus repositorios oficiales; puedes instalarlo de manera sencilla desde el administrador de paquetes del sistema.

Instalar strace

Instalar strace en Debian, Ubuntu y derivados
sudo apt install strace
Instalar strace en CentOS, Fedora y derivados
sudo yum install strace

# o

sudo dnf install strace
Instalar strace en Arch Linux, Manjaro y derivados
sudo pacman -S strace

Ejemplo…

[root@185 ~]# yum install strace
Complementos cargados:fastestmirror
Loading mirror speeds from cached hostfile
 * base: nl.mirrors.clouvider.net
 * epel: mirror.hostnet.nl
 * extras: mirror.ams1.nl.leaseweb.net
 * remi: mirrors.ukfast.co.uk
 * remi-php73: mirrors.ukfast.co.uk
 * remi-php74: mirrors.ukfast.co.uk
 * remi-safe: mirrors.ukfast.co.uk
 * remi-test: mirrors.ukfast.co.uk
 * updates: mirror.ams1.nl.leaseweb.net
Resolviendo dependencias
--> Ejecutando prueba de transacción
---> Paquete strace.x86_64 0:4.24-6.el7 debe ser instalado
--> Resolución de dependencias finalizada

Dependencias resueltas

================================================================================
 Package          Arquitectura     Versión                 Repositorio    Tamaño
================================================================================
Instalando:
 strace           x86_64           4.24-6.el7              base           902 k

Resumen de la transacción
================================================================================
Instalar  1 Paquete

Tamaño total de la descarga: 902 k
Tamaño instalado: 1.6 M
Is this ok [y/d/N]:

 

Uso del comando strace

Strace básico

En nuestro primer ejemplo, nos apoyamos en «ls». La salida es total, a lo mejor un poco liosa.

sudo strace ls

Observa la imagen de ejemplo…

Ejemplo del comando strace con ls

Ejemplo del comando strace con ls

Si por ejemplo separamos la primera línea, identificamos tres partes bien diferenciadas.

  • El nombre de la llamada al sistema.
  • Argumentos que hacen la llamada al sistema (entre paréntesis).
  • El valor de retorno de la llamada, en este caso «0».

También destacamos en la salida del comando strace, que la anotación entre barras inclinadas, son las variables agregadas para obtener el resultado. En este caso 31…

/* 31 vars */

 

Rastrear una llamada especifica

El comando strace nos ofrece mucha información sobre las llamadas al sistema, pero tal vez… nosotros solo estamos interesados en una en particular.  Aprovechando que en el ejemplo anterior usamos «ls», es la llamada que vamos a buscar. Nos ayudamos de «e» y «read».

sudo strace -e read ls

En nuestro caso nos aparece lo siguiente.

root@sololinux:~# strace -e read ls
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20b\0\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\35\2\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \25\0\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\16\0\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000b\0\0\0\0\0\0"..., 832) = 832
read(3, "nodev\tsysfs\nnodev\ttmpfs\nnodev\tbd"..., 1024) = 400
read(3, "", 1024)                       = 0
+++ exited with 0 +++

La petición ejecutada, solo nos muestra las llamadas al sistema que fueron leídas, es lo que necesitamos en este caso.

 

Resumen de las llamadas al sistema

Obtener un resumen de llamadas, también es tarea simple con el comando strace. En este caso usaremos el argumento «c» o «–summary-only».

sudo strace -c ls

Revisa el ejemplo.

root@sololinux:~# strace -c ls
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 35.24    0.000562          33        17           mmap
 14.86    0.000237          20        12           mprotect
 13.73    0.000219          24         9           openat
 11.97    0.000191          24         8         8 access
  7.52    0.000120          13         9           fstat
  7.15    0.000114          16         7           read
  6.83    0.000109          10        11           close
  1.00    0.000016          16         1           execve
  0.88    0.000014          14         1           arch_prctl
  0.82    0.000013           4         3           brk
  0.00    0.000000           0         1           munmap
  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         2           getdents
  0.00    0.000000           0         2         2 statfs
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
  0.00    0.000000           0         1           prlimit64
------ ----------- ----------- --------- --------- ----------------
100.00    0.001595                    91        10 total

Otra opción interesante es, usar el argumento «C». Con este argumento, el comando strace nos imprime dos salidas, una normal y otra resumida.

sudo strace -C ls

Imagen de ejemplo.

Argumento C en el comando strace

Argumento -C en el comando strace

 

Llamadas de proceso en ejecución en tiempo real

Para esta acción debes conocer el PID del proceso, para ello utilizamos por ejemplo, ps + grep. En nuestro ejemplo buscamos el PID de XORG.

ps -ax | grep -i xorg

Nos encontramos con una salida similar a la siguiente.

sergio@sololinux:~$ ps -ax | grep -i xorg
  831 tty7     Ssl+   0:20 /usr/lib/xorg/Xorg -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
 2350 pts/0    S+     0:00 grep --color=auto -i xorg

El PID es «831», por tanto para visualizarlo en tiempo real ejecuta el comando strace con la opción «-p».

sudo strace -p 831

AVISO: Ten cuidado con esta opción, puede llegar a saturar el sistema y provocar un bloqueo total.

 

Manual de strace

Para finalizar este artículo, te recomiendo que revises el manual oficial de strace.

sudo strace -h
root@sololinux:~# strace -h
usage: strace [-CdffhiqrtttTvVwxxy] [-I n] [-e expr]...
              [-a column] [-o file] [-s strsize] [-P path]...
              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]
   or: strace -c[dfw] [-I n] [-e expr]... [-O overhead] [-S sortby]
              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]

Output format:
  -a column      alignment COLUMN for printing syscall results (default 40)
  -i             print instruction pointer at time of syscall
  -k             obtain stack trace between each syscall (experimental)
  -o file        send trace output to FILE instead of stderr
  -q             suppress messages about attaching, detaching, etc.
  -r             print relative timestamp
  -s strsize     limit length of print strings to STRSIZE chars (default 32)
  -t             print absolute timestamp
  -tt            print absolute timestamp with usecs
  -T             print time spent in each syscall
  -x             print non-ascii strings in hex
  -xx            print all strings in hex
  -y             print paths associated with file descriptor arguments
  -yy            print protocol specific information associated with socket file descriptors

Statistics:
  -c             count time, calls, and errors for each syscall and report summary
  -C             like -c but also print regular output
  -O overhead    set overhead for tracing syscalls to OVERHEAD usecs
  -S sortby      sort syscall counts by: time, calls, name, nothing (default time)
  -w             summarise syscall latency (default is system time)

Filtering:
  -e expr        a qualifying expression: option=[!]all or option=[!]val1[,val2]...
     options:    trace, abbrev, verbose, raw, signal, read, write, fault
  -P path        trace accesses to path

Tracing:
  -b execve      detach on execve syscall
  -D             run tracer process as a detached grandchild, not as parent
  -f             follow forks
  -ff            follow forks with output into separate files
  -I interruptible
     1:          no signals are blocked
     2:          fatal signals are blocked while decoding syscall (default)
     3:          fatal signals are always blocked (default if '-o FILE PROG')
     4:          fatal signals and SIGTSTP (^Z) are always blocked
                 (useful to make 'strace -o FILE PROG' not stop on ^Z)

Startup:
  -E var         remove var from the environment for command
  -E var=val     put var=val in the environment for command
  -p pid         trace process with process id PID, may be repeated
  -u username    run command as username handling setuid and/or setgid

Miscellaneous:
  -d             enable debug output to stderr
  -v             verbose mode: print unabbreviated argv, stat, termios, etc. args
  -h             print help message
  -V             print version
Uso del comando strace

Uso del comando strace

 

Canales de Telegram: Canal SoloLinux – Canal SoloWordpress

Espero que este artículo te sea de utilidad, puedes ayudarnos a mantener el servidor con una donación (paypal), o también colaborar con el simple gesto de compartir nuestros artículos en tu sitio web, blog, foro o redes sociales. Uso del comando strace en linux.

Chat de SoloLinux en Telegram

 

Agregar comentario

1 logo sololinux

Suscríbete a SoloLinux

Recibe todos los nuevos artículos es tu correo electrónico

You have Successfully Subscribed!

Ir al contenido