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

fatmawati achmad zaenuri / Shutterstock.com

Los programas de Linux le piden al kernel que haga algunas cosas por ellos. La 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.

Índice de contenidos()

    El kernel y las llamadas al sistema

    Por más inteligentes que sean, los programas de computadora no pueden hacerlo todo por sí mismos. Necesitan hacer solicitudes para que se les realicen determinadas funciones. Estas solicitudes van al kernel de Linux. Por lo general, existe una biblioteca u otra interfaz de software que el programa llama y luego la biblioteca realiza la solicitud adecuada, llamada llamada al sistema, al kernel.

    Ser capaz de ver las llamadas al sistema que se realizó 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 strace lo hace. Puede ayudar a resolver problemas y buscar cuellos de botella.

    Esto no es lo mismo que depurar una aplicación con una herramienta como gdb . Un depurador le permite examinar el funcionamiento interno de un programa mientras se está ejecutando. Le permite revisar la lógica de su programa e inspeccionar la memoria y los valores de las variables. En comparación, ¿qué? strace no captura información de llamadas al sistema mientras se ejecuta el programa. Cuando finaliza el programa trazado, 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, terminación de procesos, etc. Hay una lista de cientos de llamadas al sistema en la página de manual de syscalls.

    RELACIONADOS: Depurar con GDB: cómo empezar

    Instalación de strace

    Uno mismo 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 ninguna comprobación de errores. Es solo un truco rápido para que tengas algo con lo que usar 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

    Lo guardamos en un archivo llamado "file-io.c" y lo compilamos con gcc en un ejecutable llamado stex, pedido "estoyraza anterioramplio. "

    gcc -o stex file-io.c

    llamaremos strace desde la línea de comando y pasarle el nombre de nuestro nuevo ejecutable como un proceso que queremos rastrear. Podríamos rastrear fácilmente cualquier comando de Linux o cualquier otro ejecutable binario. Usamos nuestro pequeño programa por dos razones.

    La primera razón es que strace es detallado. Puede haber muchos resultados. Es genial cuando lo usas strace enfadado, pero al principio puede ser abrumador. Hay limitado strace salida 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 hace que sea más fácil identificar qué secciones de la salida se refieren a las diferentes partes del mecanizado 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

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

    strace -e write ./stex

    Puede informar sobre varias llamadas al sistema agregándolas como una lista separada por comas. No incluya espacios en blanco en la lista de llamadas del sistema.

    strace -e close,write ./stex

    Enviar la salida a un archivo

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

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

    strace -o trace-output.txt ./stex

    A continuación, puede utilizar el less comando para desplazarse por la lista y buscar llamadas al sistema, o lo que sea, por nombre.

    less trace-output.txt

    Ahora puedes usar todo lesslas capacidades de investigación de 's para investigar el resultado.

    RELACIONADOS: Cómo usar el comando less en Linux

    Agregar marcas de tiempo

    Puede agregar diferentes marcas de tiempo a la salida. La -r (marcas de tiempo relativas) agrega marcas de tiempo que muestran la diferencia de tiempo entre el inicio de cada llamada al sistema subsiguiente. Tenga en cuenta que estos valores de tiempo incluirán el tiempo transcurrido 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

    Las marcas de tiempo aparecen al principio de cada línea de salida.

    Para ver la cantidad de tiempo dedicado a cada llamada al sistema, use el botón -T (syscall-times) opción. Muestra el 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 en que se llamó a cada llamada del sistema, use la tecla -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 principio de cada línea.

    Rastrear un proceso continuo

    Si el proceso que desea rastrear ya se está ejecutando, aún puede adjuntar strace ahora. Para hacer esto, necesita conocer el ID del proceso. puedes usar ps con grep para encontrar esto. Tenemos Firefox en ejecución. Para averiguar el ID del firefox proceso, podemos usar ps y pasar por eso grep.

    ps -e | grep firefox

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

    sudo strace -p 8483

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

    Crear un informe

    La -c (solo resumen) causas de la opción strace para imprimir un informe. Genera una tabla con información sobre las llamadas al sistema realizadas por el programa rastreado.

    strace -c ./stex

    Las columnas son:

    • % hora- El porcentaje del tiempo de ejecución dedicado a cada llamada al sistema.
    • segundos: El tiempo total en segundos y microsegundos dedicado a cada llamada al sistema.
    • usecs / call: El tiempo promedio en microsegundos invertido en cada llamada al sistema.
    • quien ama: el número de veces que se realizó cada llamada al sistema.
    • errores: El número de errores 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 los programas que hacen algo más significativo que nuestra aplicación de demostración.

    Insights, fácilmente

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

    Utilizando strace, vea la imagen completa.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir