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
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
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
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
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.