El comando strace
El comando strace se puede utilizar para interceptar y registrar las llamadas al sistema realizadas y las señales recibidas por un proceso. Esto permite examinar la capa límite entre el usuario y el espacio del kernel, lo que puede ser muy útil para identificar por qué falla un proceso.
El uso de strace para analizar cómo un programa interactúa con el sistema es especialmente útil cuando el código fuente no está disponible. Además de su importancia en la resolución de problemas, strace puede proporcionar una visión profunda de cómo funciona el sistema. Cualquier usuario puede rastrear sus propios procesos en ejecución; además, el usuario raíz puede rastrear cualquier proceso en ejecución. Por ejemplo, lo siguiente podría usarse para adjuntar y rastrear el demonio rsyslogd en ejecución:
# strace -p $(pgrep rsyslogd) Process 819 attached select(1, NULL, NULL, NULL, {83009, 275934} ...
salida de seguimiento
La salida de strace corresponderá a una llamada o señal del sistema. El resultado de una llamada al sistema se compone de tres componentes:
1. La llamada al sistema
2. Cualquier argumento entre paréntesis
3. El resultado de la llamada siguiendo un signo igual
Un estado de salida de -1 generalmente indica un error. Por ejemplo:
# strace ls file1 execve("/bin/ls", ["ls", "file1"], [/* 21 vars */]) = 0 brk(0) = 0xadb000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f516bb79000 ..... close(1) = 0 munmap(0x7f516bb78000, 4096) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++
Las llaves se utilizan para indicar estructuras C desreferenciadas. Las llaves cuadradas se utilizan para indicar punteros simples o una matriz de valores.
Ejemplos del comando strace
Redirigir el seguimiento a un archivo
Dado que strace a menudo crea una gran cantidad de resultados, a menudo es conveniente redirigirlo a un archivo. Por ejemplo, lo siguiente podría usarse para iniciar bash shell, rastrear cualquier proceso secundario bifurcado y registrar todos los accesos a archivos en el archivo files.trace:
# strace -f -o files.trace -e trace=file bash
Contando el número de llamadas al sistema
Ejecute el comando ls para contar la cantidad de veces que se realizó cada llamada al sistema e imprima los totales que muestran la cantidad y el tiempo dedicado a cada llamada (útil para la creación de perfiles básicos o el aislamiento de cuellos de botella):
# strace -c ls
Ver archivos abiertos por un proceso/demonio
El siguiente ejemplo muestra los tres archivos de configuración que sshd de OpenSSH lee cuando se inicia. Tenga en cuenta que strace envía su salida a STDERR de forma predeterminada, por lo que si desea canalizarla a otros comandos como grep para realizar más modificaciones, debe redirigir la salida de manera adecuada:
# strace -f -eopen /usr/sbin/sshd 2>&1 | grep ssh
Rastrear solo llamadas al sistema relacionadas con la red
Rastree solo las llamadas al sistema relacionadas con la red mientras Netcat intenta conectarse a un servicio telnetd local:
# strace -e trace=network nc localhost 23
El comando ltrace
El comando ltrace se puede usar para interceptar y registrar las llamadas dinámicas realizadas a las bibliotecas compartidas. La cantidad de salida generada por el comando ltrace puede ser abrumadora para algunos comandos (especialmente si se usa la opción -S para mostrar también las llamadas al sistema). Puede enfocar la salida solo en la interacción entre el programa y alguna lista de bibliotecas. Por ejemplo, para ejecutar el comando id -Z y mostrar las llamadas realizadas al módulo libselinux.so, ejecute:
$ ltrace -l /lib/libselinux.so.1 id -Z is_selinux_enabled(0xc1c7a0, 0x9f291e8, 0xc1affc, 0, -1)a =1 getcon(0x804c2c8, 0xfee80ff4, 0x804b179, 0x804c020, 0)a =0 user_u:system_r:unconfined_t
Recuerde que puede ver a qué bibliotecas está vinculado un programa usando el comando ldd.