Tabla de contenido
- 1 1. Instalación de strace
- 2 2. Ejecutar un programa con strace
- 3 3. Adjuntar strace a un proceso en ejecución
- 4 4. Filtrar tipos específicos de llamadas al sistema
- 5 5. Identificar y localizar problemas comunes
- 6 6. Registrar salida a un archivo
- 7 7. Analizar el tiempo de cada llamada
- 8 8. Resumen de estadísticas
- 9 Ejemplo práctico: Diagnosticar problemas de un programa
- 10 Resumen final
strace
es una herramienta de diagnóstico en sistemas Unix y Linux que permite rastrear las llamadas al sistema que realiza un programa en ejecución. Es muy útil para depurar problemas, analizar el rendimiento y entender cómo interactúa una aplicación con el sistema operativo. Aquí te dejo una guía básica para comenzar a usar strace
y localizar problemas en tiempo de ejecución.
1. Instalación de strace
La mayoría de las distribuciones de Linux vienen con strace
preinstalado. Si no lo tienes, puedes instalarlo con:
# En Debian/Ubuntu
sudo apt-get install strace
# En CentOS/RHEL
sudo yum install strace
2. Ejecutar un programa con strace
Para iniciar un programa y rastrear sus llamadas al sistema, simplemente usa:
strace nombre_programa [argumentos]
Por ejemplo, para rastrear ls
:
strace ls
Esto mostrará todas las llamadas al sistema que ls
realiza desde que inicia hasta que termina.
3. Adjuntar strace a un proceso en ejecución
Si deseas rastrear un programa que ya está ejecutándose, puedes adjuntar strace
a su proceso con el PID
:
strace -p PID
Para encontrar el PID
, puedes usar el comando ps
o pgrep
:
ps aux | grep nombre_programa
pgrep nombre_programa
4. Filtrar tipos específicos de llamadas al sistema
strace
genera mucha salida, por lo que puede ser útil filtrar solo las llamadas que te interesan. Para ello, puedes especificar tipos de llamadas con el parámetro -e
:
Archivo: Para ver solo las llamadas relacionadas con archivos.
strace -e trace=open,close,read,write nombre_programa
Red: Para ver solo las llamadas relacionadas con la red.
strace -e trace=network nombre_programa
Errores: Para ver solo las llamadas que resultan en errores.
strace -e trace=error nombre_programa
5. Identificar y localizar problemas comunes
a. Problemas de permisos
Si una llamada al sistema falla debido a permisos, verás un error EACCES
. Esto puede significar que el usuario que ejecuta el programa no tiene acceso a algún archivo o directorio. Busca líneas como estas:
open("/ruta/al/archivo", O_RDONLY) = -1 EACCES (Permission denied)
b. Archivos no encontrados
Si un programa intenta abrir un archivo inexistente, verás un error ENOENT
:
open("/ruta/al/archivo", O_RDONLY) = -1 ENOENT (No such file or directory)
Este tipo de error suele indicar rutas de archivo incorrectas o archivos faltantes.
c. Problemas de red
Para rastrear problemas de red, puedes filtrar por llamadas como connect
, sendto
, recvfrom
, etc. Si ves un error ECONNREFUSED
, podría indicar que el servidor al que intentas conectarte no está disponible o se está rechazando la conexión.
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("192.168.1.1")}, 16) = -1 ECONNREFUSED (Connection refused)
d. Fallos de memoria
Errores como ENOMEM
pueden indicar que el sistema se está quedando sin memoria para ejecutar el programa.
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
e. Errores de llamadas al sistema específicas
A veces, verás errores en llamadas específicas como fork
o execve
. Esto puede deberse a que el programa esté intentando ejecutar otro proceso que no encuentra o no tiene permisos. Para problemas con execve
, revisa la existencia y los permisos de ejecución de los binarios.
execve("/bin/ls", ["ls"], [/* 23 vars */]) = -1 ENOENT (No such file or directory)
6. Registrar salida a un archivo
Si necesitas analizar la salida de strace
después de la ejecución, redirígela a un archivo con -o
:
strace -o salida_strace.log nombre_programa
Luego puedes analizar el archivo con herramientas como grep
para buscar errores específicos.
7. Analizar el tiempo de cada llamada
Usa -T
para mostrar el tiempo que cada llamada al sistema tarda en completarse, útil para detectar cuellos de botella:
strace -T nombre_programa
8. Resumen de estadísticas
Para obtener un resumen de estadísticas al final de la ejecución, usa -c
. Esto muestra cuántas veces se llamó cada función, cuántos errores ocurrieron y el tiempo total.
strace -c nombre_programa
Ejemplo práctico: Diagnosticar problemas de un programa
Supongamos que tienes un programa llamado mi_programa
que está experimentando problemas de rendimiento y fallos ocasionales. Podrías:
Ejecutar con strace:
strace -o salida.log mi_programa
Revisar el archivo de salida en busca de errores comunes (
ENOENT
,EACCES
, etc.) usandogrep
:grep "ENOENT" salida.log
Analizar las llamadas al sistema más lentas para detectar cuellos de botella:
strace -T -o salida_tiempos.log mi_programa
Revisar las estadísticas de llamadas al sistema para ver si alguna se ejecuta inusualmente a menudo o consume demasiado tiempo:
strace -c mi_programa
Resumen final
strace