Cómo usar strace para monitorear llamadas al sistema Linux

Contenidos

Una ventana de terminal estilizada en una computadora portátil.

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

Las llamadas al kernel y al sistema

Por muy inteligentes que sean, los programas de computadora no pueden hacer todo por sí mismos. Necesitan hacer solicitudes para que se les realicen determinadas funciones. 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 ​​después la biblioteca realiza la solicitud adecuada, llamada llamada al sistema, al kernel.

Ser capaz de 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. Este es qué strace lo hace. Puede ayudar a arreglar 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 posibilita investigar el funcionamiento interno de un programa mientras se ejecuta. Le posibilita recorrer la lógica de su programa e inspeccionar la memoria y los valores de las variables. En comparación, ¿qué strace lo que hace es capturar la información de la llamada al sistema mientras se ejecuta el programa. Cuando finaliza el programa rastreado, strace enumera la información de la llamada al 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 el página de manual de syscalls.

RELACIONADO: Depuración con GDB: introducción

Instalación de strace

Si strace aún 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 install 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 con qué utilizar strace.

#include <stdio.h>

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

  // file handle 
  FILE *fileGeek;

  // open a file called "strace_demo.txt", or create it 
  fileGeek = fopen("strace_demo.txt", "w");

  // write some text to the file 
  fprintf(fileGeek, "Write this to the file" );

  // close the file 
  fclose(fileGeek);

  // exit from program 
  return (0); 

} // end of main

Guardamos esto en un archivo llamado «file-io.c» y lo compilamos con gcc en un ejecutable llamado stex, nombrado para «S traza examplio.»

gcc -o stex file-io.c

Llamaremos strace desde la línea de comando y pasarle el nombre de nuestro nuevo ejecutable como el procedimiento 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 prolijo. Puede haber muchos resultados. Eso es genial cuando estás usando strace enfadado, pero puede ser abrumador al principio. Hay limitado strace salida para nuestro pequeño programa. La segunda razón es que nuestro programa cuenta con una funcionalidad limitada y el código fuente es breve y sencillo. Esto hace que sea más fácil identificar qué secciones de la salida se refieren a las diferentes partes del funcionamiento interno del programa.

strace ./stex

Podemos ver claramente el write llamada al sistema enviando el texto «Escribe esto en el archivo» a nuestro archivo abierto y el exit_group llamada al sistema. Esto termina todos los subprocesos en la aplicación y envía un valor de retorno al shell.

Filtrar la salida

Inclusive con nuestro programa de demostración simple, hay bastante salida. Podemos utilizar el -e Opción (expresión). Pasaremos el nombre de la llamada al sistema que queremos ver.

strace -e write ./stex

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

strace -e close,write ./stex

Enviar la salida a un archivo

El beneficio de filtrar la salida es además 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 ti que las cosas que has 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. los -o La opción (salida) le posibilita enviar la salida desde un strace sesión a un archivo de texto.

strace -o trace-output.txt ./stex

A continuación, puede usar el less comando para desplazarse por la lista y buscar llamadas al sistema, o cualquier otra cosa, por nombre.

less trace-output.txt

Ahora puede utilizar todos los lesscapacidades de búsqueda para investigar la salida.

RELACIONADO: Cómo utilizar el comando less en Linux

Agregar marcas de tiempo

Puede agregar varias marcas de tiempo diferentes a la salida. los -r La opción (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 próxima llamada al sistema.

strace -r ./stex

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

Para ver la cantidad de tiempo invertido en cada llamada al sistema, use el -T (syscall-times) opción. Esto muestra la duración del tiempo transcurrido 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ó a cada llamada del sistema, utilice el -tt (marcas de tiempo absolutas). Esto 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 procedimiento en ejecución

Si el procedimiento que desea rastrear ya se está ejecutando, aún puede adjuntar strace lo. Para hacerlo, necesita conocer el ID del procedimiento. Puedes utilizar ps con grep para hallar esto. Tenemos Firefox en ejecución. Para averiguar el ID del firefox procedimiento, podemos utilizar ps y canalizarlo a través grep.

ps -e | grep firefox

Podemos ver que el ID de procedimiento es 8483. Usaremos el -p (ID de procedimiento) opción para decir strace a qué procedimiento adjuntar. Tenga en cuenta que necesitará utilizar sudo :

sudo strace -p 8483

Verás una notificación que strace se ha adjuntado al procedimiento, y después las llamadas de rastreo del sistema se mostrarán en la ventana del terminal como de costumbre.

Crear un reporte

los -c (solo resumen) opción causas strace para imprimir un reporte. Genera una tabla para obtener información sobre las llamadas al sistema que realizó el programa rastreado.

strace -c ./stex

Las columnas son:

  • % tiempo: El porcentaje del tiempo de ejecución que se invirtió en cada llamada al sistema.
  • segundos: El tiempo total expresado en segundos y microsegundos en cada llamada al sistema.
  • usecs / call: El tiempo promedio en microsegundos invertido 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.

Conocimientos profundos, fácilmente

los strace La salida puede mostrarle qué llamadas al sistema se están realizando, cuáles se hacen repetidamente y cuánto tiempo de ejecución se está gastando 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 está interactuando casi sin parar con el kernel para realizar muchas de sus funciones.

A través de el uso strace, ves la imagen completa.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.