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 strace2. 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 lsEsto 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 PIDPara encontrar el PID, puedes usar el comando ps o pgrep:
ps aux | grep nombre_programa
pgrep nombre_programa4. 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_programaRed: Para ver solo las llamadas relacionadas con la red.
strace -e trace=network nombre_programaErrores: 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_programaLuego 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_programa8. 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_programaEjemplo 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_programaRevisar el archivo de salida en busca de errores comunes (
ENOENT,EACCES, etc.) usandogrep:grep "ENOENT" salida.logAnalizar las llamadas al sistema más lentas para detectar cuellos de botella:
strace -T -o salida_tiempos.log mi_programaRevisar 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