Cómo usar Strace en Linux

Cómo usar Strace en Linux
Al trabajar con los sistemas Linux, a menudo deberá inspeccionar y comprender las acciones realizadas por los procesos y las llamadas del sistema realizadas por su ejecución.

Cuando se trata de realizar tales tareas, el kernel de Linux proporciona características como Ptrace para depurar y diagnosticar procesos.

Este artículo analiza cómo usar la herramienta Strace para rastrear, monitorear y depurar procesos que interactúan con el núcleo.

¿Qué son las llamadas del sistema??

Antes de discutir cómo usar Strace, debe comprender lo que estamos buscando y cómo funcionan. Eso significa que deberíamos repasar los conceptos básicos de las llamadas del sistema Linux.

Una llamada del sistema es Un método programático a través del cual un programa puede solicitar un servicio desde el núcleo del sistema. Ese es el proceso que utilizaremos para inspeccionar las acciones entre los procesos del usuario y el núcleo de Linux.

Cada vez que un usuario ejecuta un programa que hace una lectura, escritura, mata, salida, vinculación, etc., Solicitud, están haciendo una llamada del sistema. Hay una amplia gama de llamadas de sistema utilizadas por los programas para realizar diversas tareas, como redes, lectura y escritura en archivos, inicializando y terminando procesos, y mucho más.

Piense en las llamadas del sistema como funciones: se comportan de manera similar, porque pueden aceptar argumentos y devolver valores. La principal diferencia entre las llamadas del sistema y el funcionamiento normal es que las llamadas del sistema pueden interactuar directamente con el kernel. Las llamadas al sistema usan un mecanismo de trampa para navegar entre el espacio de usuario y el núcleo.

En el sistema Linux, este mecanismo está bien oculto a los usuarios por bibliotecas como GLIBC.

NOTA: Hay mucho más en las llamadas del sistema e interacciones del núcleo que las que hemos discutido en este tutorial. Consulte las páginas manuales para obtener más información.

https: // linkfy.a/syscalls

https: // linkfy.a/trapmanual

Cómo instalar Strace en Linux

Aunque las herramientas de strace no vienen preinstaladas de forma predeterminada en las principales distribuciones de Linux, está disponible en la mayoría de los repositorios oficiales de estas distribuciones; Puede instalarlo fácilmente utilizando administradores de paquetes predeterminados.

NOTA: Aunque no cubriremos cómo instalar Strace en todos los sistemas, discutiremos cómo hacerlo con los principales administradores de paquetes como APT, DNF, Pacman y Yum

1: Instalación de Debian (APT)

Instale Strace usando el comando:

apt -get install strace -y

2: Familia Redhat (DNF y YUM)

Para instalar Strace usando el Administrador de paquetes YUM, ingrese el comando:

yum instalación de strace

Para el administrador de paquetes DNF, ingrese el comando:

DNF Instalar Strace

3: Arch Linux (Pacman)

Para los usuarios de Arch Linux, puede instalar Strace con el comando:

Pacman -S Strace

Ahora que tiene Strace Instalado y en funcionamiento, podemos seguir adelante y aprender a usar

Uso básico de strace: una guía práctica

Discutamos el uso básico de strace y comprendamos la salida básica del comando y cómo podemos usarlo.

NOTA: Salida de strace, como nombres de llamadas al sistema, argumentos correspondientes y valores de retorno, se manejan por el descriptor de archivo de error estándar (STDERR).

La forma básica de usar Strace es llamando a la utilidad de Strace seguido del nombre del programa, cuyo comportamiento queremos entender.

Aquí hay un ejemplo de eso usando el comando LS:

Guau! Esa es una gran cantidad de salidas para un comando simple como LS.

Aunque no podemos discutir todo el resultado del comando strace, podemos destilar y comprender su significado.

Si considera la primera línea en la salida anterior, notará las siguientes funciones.

  • El nombre de la llamada del sistema
  • Los argumentos pasados ​​a la llamada del sistema encerrado entre paréntesis.
  • El valor de retorno de la llamada del sistema

Por lo tanto, en la primera línea, la llamada del sistema es ejecutada (ejecutar el programa utilizando la matriz especificada de argumentos), los argumentos de la llamada del sistema son ("/bin/ls", ["ls", "/"], 0x7fffc4b277a8/ * 13 vars */) y un valor de retorno de 0.

https: // linkfy.a/ejecve

Las llamadas al sistema EXECVE ejecutan el binario que queremos usar, en este caso, ubicado en (/bin/ls) y la variedad de argumentos es la ruta que queremos enumerar el contenido.

También notará una notación encerrada con un corte hacia adelante y un asterisco. Para nuestro ejemplo:

/ * 13 var */

La salida anterior indica el número de variables agregadas como resultado de llamar al proceso. Se accede al entorno dentro de la función EXECV utilizando la variable externa ambiental definida como:

int main (int argc, char *argv [], char *envp [])

La salida final es el valor de retorno, que es 0 en este caso.

También notará que la mayoría de las líneas de la salida de strace siguen un patrón similar que discutimos anteriormente.

Cómo rastrear las llamadas específicas del sistema

Aunque Strace ofrece mucha información sobre las llamadas del sistema de programas, la mayoría de las instancias le pedirán que filtren llamadas específicas del sistema. Para hacer esto, pasamos la bandera -e al comando strace seguido del nombre de la llamada del sistema que necesitamos.

¿Qué tal mirar el sistema de lectura requiere el comando ls. Por ejemplo:

strace -e lee ls

Notará que esto solo muestra solo llamadas al sistema de lectura.

La llamada al sistema de lectura acepta tres argumentos: descriptor de archivos, búfer y el número de bytes. La llamada del sistema luego se lee a los bytes de conteo del argumento del descriptor del archivo aprobado en el búfer.

https: // linkfy.a/readsyscall

Resumen de las llamadas del sistema

Strace también nos permite obtener un resumen de las llamadas del sistema realizadas por un proceso. Al pasar el argumento -c o -summary solo, podemos obtener una salida como la que se muestra a continuación:

El comando filtra y organiza la salida de manera más eficiente que la salida de strace normal. Para obtener la salida de strace de resumen y normal, pase el argumento -c.

Cómo usar Strace con procesos en ejecución

En otras ocasiones, necesitará un rastro de un proceso de ejecución. Hasta este punto, solo hemos usado strace un solo comando. Para rastrear un proceso en ejecución, podemos usar el argumento -p seguido del proceso de ID de proceso (PID) para unir Strace.

Puede obtener el PID de un proceso de ejecución utilizando la parte superior y GREP, PS, HTOP, PIDOF u otras herramientas de monitoreo del sistema.

Por ejemplo, para obtener el PID del proceso Apache, podemos usar:

PS -Ax | GREP -I apache2

Que debería darle el PID del proceso APACHE2 (PID 3514 en este caso), y podemos usarlo para adjuntarlo a Strace.

Que debe mostrar una salida similar a la que se muestra a continuación.

Strace trazará continuamente el proceso adjunto y mostrará la salida a medida que el proceso adjunto ejecuta llamadas al sistema. Para terminar la traza, presione Ctrl + C, que separa el proceso desde la strace.

Cómo guardar la salida de strace a los archivos

También podemos redirigir la salida de strace a un archivo como argumento. Usando el indicador -o seguido de la ruta del archivo como argumento, podemos guardar registros de strace.

Por ejemplo:

strace -p 3514 -o ~/escritorio/apache_trace

Una vez que se guarda el archivo, puede monitorearlo y analizarlo.

Conclusión

En esta guía, aprendimos a instalar y usar Strace en las principales distribuciones de Linux. Ahora que comprende las llamadas del sistema y cómo funcionan los procesos, puede usar Strace para monitorear y depurar un proceso del sistema en ejecución en ejecución.

Los conceptos aprendidos en este tutorial son muy útiles, principalmente porque puede usar lo que ha aprendido a monitorear si alguien está manipulando los procesos del sistema.