Cómo usar strace para monitorear las llamadas del sistema Linux

Publicado: 2022-01-29
Una ventana de terminal estilizada en una computadora portátil.
fatmawati achmad zaenuri/Shutterstock.com

Los programas de Linux le piden al núcleo que haga algunas cosas por ellos. El comando strace revela estas llamadas al sistema. Puede usarlos para comprender cómo funcionan los programas y por qué, a veces, no lo hacen.

El núcleo y las llamadas al sistema

Tan inteligentes como puedan ser, los programas de computadora no pueden hacer todo por sí mismos. Necesitan hacer solicitudes para que se realicen ciertas funciones para ellos. Estas solicitudes van al kernel de Linux. Por lo general, hay una biblioteca u otra interfaz de software a la que llama el programa, y ​​luego la biblioteca realiza la solicitud adecuada, llamada llamada al sistema, al núcleo.

Poder ver las llamadas al sistema que ha realizado un programa y cuáles fueron las respuestas puede ayudarlo a comprender el funcionamiento interno de los programas que le interesan o que ha escrito. Esto es lo que hace strace . Puede ayudar a solucionar problemas y buscar cuellos de botella.

Esto no es lo mismo que depurar una aplicación con una herramienta como gdb . Un programa de depuración le permite investigar el funcionamiento interno de un programa mientras se ejecuta. Le permite recorrer la lógica de su programa e inspeccionar la memoria y los valores de las variables. En comparación, lo que hace strace es capturar la información de la llamada al sistema mientras se ejecuta el programa. Cuando finaliza el programa rastreado, strace muestra la información de la llamada del sistema en la ventana del terminal.

Las llamadas al sistema proporcionan todo tipo de funciones de bajo nivel, como acciones de lectura y escritura en archivos, eliminación de procesos, etc. Hay una lista de cientos de llamadas al sistema en la página de manual de syscalls.

RELACIONADO: Depuración con GDB: Primeros pasos

Instalación de strace

Si strace no está instalado en su computadora, puede instalarlo muy fácilmente.

En Ubuntu, use este comando:

 sudo apt install strace 

En Fedora, escriba este comando:

 sudo dnf instalar strace 

En Manjaro, el comando es:

 sudo pacman-Sy strace 

Primeros pasos con strace

Usaremos un pequeño programa para demostrar strace . No hace mucho: abre un archivo y escribe una línea de texto en él, y no tiene ningún error al verificarlo. Es solo un truco rápido para que tengamos algo para usar con strace .

 #incluir <stdio.h>

int main(int argc, char argv[]) { 

  // identificador de archivo 
  ARCHIVO *fileGeek;

  // abre un archivo llamado "strace_demo.txt", o créalo 
  fileGeek = fopen("strace_demo.txt", "w");

  // escribe algo de texto en el archivo 
  fprintf(fileGeek, "Escribe esto en el archivo" );

  // cerrar el archivo 
  fclose(fileGeek);

  // salir del programa 
  retorno (0); 

} // fin de principal

Guardamos esto en un archivo llamado "file-io.c" y lo compilamos con gcc en un ejecutable llamado stex , llamado así por " st race ex mple".

 gcc -o archivo stex-io.c

Llamaremos a strace desde la línea de comando y le pasaremos el nombre de nuestro nuevo ejecutable como el proceso que queremos rastrear. Podríamos rastrear fácilmente cualquiera de los comandos de Linux o cualquier otro ejecutable binario. Estamos usando nuestro pequeño programa por dos razones.

La primera razón es que strace es detallado. Puede haber mucha producción. Eso es genial cuando usas strace cuando estás enojado, pero puede ser abrumador al principio. Hay una salida de strace limitada para nuestro pequeño programa. La segunda razón es que nuestro programa tiene una funcionalidad limitada y el código fuente es breve y sencillo. Esto facilita identificar qué secciones de la salida se refieren a las diferentes partes del funcionamiento interno del programa.

 trazo ./stex 

Podemos ver claramente que la llamada al sistema de write envía el texto "Escribir esto en el archivo" a nuestro archivo abierto y la llamada al sistema exit_group . Esto finaliza todos los subprocesos de la aplicación y envía un valor de retorno al shell.

Filtrado de la salida

Incluso con nuestro sencillo programa de demostración, hay bastantes resultados. Podemos usar la opción -e (expresión). Pasaremos el nombre de la llamada al sistema que queremos ver.

 strace -e escribe ./stex 

Anuncio publicitario

Puede informar sobre múltiples llamadas al sistema agregándolas como una lista separada por comas. No incluya ningún espacio en blanco en la lista de llamadas al sistema.

 strace -e cerrar, escribir ./stex 

Envío de la salida a un archivo

El beneficio de filtrar la salida es también el problema de filtrar la salida. Ves lo que has pedido ver, pero no ves nada más. Y algunos de esos otros resultados pueden ser más útiles para usted que las cosas que ha pedido ver.

A veces, es más conveniente capturar todo y buscar y desplazarse por todo el conjunto de resultados. De esa manera, no excluirá accidentalmente nada importante. La opción -o (salida) le permite enviar la salida de una sesión de strace a un archivo de texto.

 strace -o rastrear-salida.txt ./stex 

Luego puede usar el comando less para desplazarse por la lista y buscar llamadas del sistema, o cualquier otra cosa, por nombre.

 menos traza-salida.txt 

Ahora puede usar todas las capacidades de búsqueda de less para investigar la salida.

RELACIONADO: Cómo usar el comando less en Linux

Adición de marcas de tiempo

Puede agregar varias marcas de tiempo diferentes a la salida. La opción -r (marcas de tiempo relativas) agrega marcas de tiempo que muestran la diferencia de tiempo entre el inicio de cada llamada sucesiva al sistema. Tenga en cuenta que estos valores de tiempo incluirán el tiempo empleado en la llamada al sistema anterior y cualquier otra cosa que el programa estuviera haciendo antes de la siguiente llamada al sistema.

 strace -r ./stex 

Anuncio publicitario

Las marcas de tiempo se muestran al comienzo de cada línea de salida.

Para ver la cantidad de tiempo empleado en cada llamada al sistema, use la opción -T (syscall-times). Esto muestra la duración del tiempo pasado dentro de cada llamada al sistema.

 strace -T ./stex 

Las duraciones de tiempo se muestran al final de cada línea de llamada del sistema.

Para ver la hora a la que se llamó cada llamada al sistema, use la -tt (marcas de tiempo absolutas). Muestra la hora del "reloj de pared", con una resolución de microsegundos.

 strace -tt ./stex 

Los tiempos se muestran al comienzo de cada línea.

Seguimiento de un proceso en ejecución

Si el proceso que desea rastrear ya se está ejecutando, aún puede adjuntarle strace . Para hacerlo, necesita conocer el ID del proceso. Puedes usar ps con grep para encontrar esto. Tenemos Firefox funcionando. Para averiguar el ID del proceso de firefox , podemos usar ps y canalizarlo a través de grep .

 pd-e | grep firefox 

Anuncio publicitario

Podemos ver que el ID del proceso es 8483. Usaremos la opción -p (ID del proceso) para decirle a strace a qué proceso debe adjuntarse. Tenga en cuenta que deberá usar sudo :

 sudo strace -p 8483 

Verá una notificación de que strace se adjuntó al proceso, y luego las llamadas de seguimiento del sistema se mostrarán en la ventana de la terminal como de costumbre.

Creación de un informe

La opción -c (solo resumen) hace que strace imprima un informe. Genera una tabla con información sobre las llamadas al sistema realizadas por el programa rastreado.

 strace -c ./stex 

Las columnas son:

  • % de tiempo : el porcentaje del tiempo de ejecución que se gastó en cada llamada al sistema.
  • segundos : El tiempo total expresado en segundos y microsegundos gastados en cada llamada al sistema.
  • usecs/call : el tiempo promedio en microsegundos empleado en cada llamada al sistema.
  • llamadas : El número de veces que se ejecutó cada llamada al sistema.
  • errores : El número de fallas para cada llamada al sistema.
  • syscall : El nombre de la llamada al sistema.

Estos valores mostrarán ceros para programas triviales que se ejecutan y terminan rápidamente. Los valores del mundo real se muestran para programas que hacen algo más significativo que nuestra aplicación de demostración.

Insights profundos, fácilmente

La salida de strace puede mostrarle qué llamadas al sistema se están realizando, cuáles se están realizando repetidamente y cuánto tiempo de ejecución se gasta dentro del código del lado del kernel. Esa es una gran información. A menudo, cuando intenta comprender lo que sucede dentro de su código, es fácil olvidar que su binario interactúa casi sin parar con el núcleo para realizar muchas de sus funciones.

Al usar strace , ves la imagen completa.

RELACIONADO: Las mejores computadoras portátiles Linux para desarrolladores y entusiastas