Cómo utilizar strace para rastrear las llamadas y señales del sistema

Contenidos

Bash Shell

El rastreo de un programa de computadora no está reservado solo para aquellos que disponen el código fuente, pueden leerlo y conocen cómo utilizar un depurador. Cualquier usuario de Linux puede rastrear un ejecutable con strace. ¡Averiguar como!

Que es strace?

strace es una utilidad de Linux que le posibilita rastrear las llamadas al sistema que realiza una aplicación determinada. Además captará señales y producirá una salida detallada de toda la información que observe.

Una persona nueva en el rastreo y el rastreo, en general, podría preguntar por qué esto es útil. Un ingeniero de TI profesional podría preguntar cuánta información puede captar Strace verdaderamente, especialmente si sabe cuánta información puede ver un depurador como GDB.

Si está interesado en depurar códigos y programas informáticos, consulte nuestro post Depuración con GDB: introducción.

¡Hay buenas noticias en ambos casos! El seguimiento de todas las llamadas y señales del sistema proporciona una imagen completa del funcionamiento de un programa, y ​​es una magnífica herramienta de resolución de problemas e inclusive de depuración. Al mismo tiempo, se ejecuta a lo largo del tiempo de ejecución (como un procedimiento de envoltura), pero se puede rastrear fácilmente en un archivo de registro y ofrece una descripción general fácil de digerir de las acciones de un programa.

Comparando esto con GDB, que además es un procedimiento de envoltura, las cosas son sustancialmente diferentes. A modo de ejemplo, en GDB, uno podría rastrear un programa paso a paso (a modo de ejemplo, una línea de código al mismo tiempo o un bloque lógico de código, o usando puntos de interrupción en el código). A pesar de esto, estos pasos se realizan durante runtime, mientras que strace simplemente ejecuta el programa como un todo hasta que ocurre algún error o hasta que se completa.

El ingeniero o usuario puede ir y analizar el registro completo (basado en texto), buscar cadenas interesantes, etc. Al mismo tiempo, GDB permitiría ver señales y llamadas al sistema además, aún cuando configurarlo y analizarlo es mucho más complejo que con strace.

Con strace, simplemente puede ejecutar el programa en strace (dicho de otra forma strace some_program), y aún cuando esto es aproximadamente lo mismo que GDB, la operación difiere significativamente, como se describe previamente.

Con respecto a la cantidad de información que se puede ver en una traza, es bueno dar un paso atrás y recordar de dónde provienen la mayoría de los problemas de la computadora: disco lleno, memoria agotada, no se encontró algún archivo, entrada incorrecta, etc.

Especialmente en las áreas de acceso al disco, strace verdaderamente brilla. Como registra todas las llamadas al sistema, cada acceso al disco es muy visible en el registro. Nuevamente, puede buscar cadenas de texto y nombres de archivo relevantes, aún cuando tenga en cuenta que, a veces, las cadenas pueden tener una longitud reducida, por lo que solo la salida parcial puede ser visible.

En resumen, si tuviéramos que calificar strace como una herramienta de depuración y / o solución de problemas y asígnele un lugar en una caja de herramientas de usuario de Linux más nueva o más competente, entonces, en ambos casos, la solución es aproximadamente en el medio, aún cuando se inclina un poco más hacia la resolución de problemas que hacia la depuración. Vamos a instalar strace Siguiente.

RELACIONADO: Cómo funcionan las puertas lógicas: OR, AND, XOR, NOR, NAND, XNOR y NOT

Instalando strace

Instalar strace en su distribución de Linux basada en Debian / Apt (como Ubuntu y Mint), ejecute el siguiente comando en su terminal:

sudo apt install strace

Instalar strace en su distribución de Linux basada en RedHat / Yum (como RHEL, Centos y Fedora), ejecute el siguiente comando en su terminal:

sudo yum install strace

Usando strace

Después de instalar strace, es bastante sencillo comenzar. Podemos, a modo de ejemplo, rastrear el Linux sleep comando / utilidad:

strace sleep 1

strace de un proceso de sueño de un segundo

Inmediatamente, el resultado prueba la afirmación anterior. Hay una gran cantidad de información sobre todas las acciones tomadas por el (muy) simple sleep 1 comando, que, después de todo, solo acciones durmiendo por un solo segundo.

Veamos algunas cosas que podemos observar de inmediato:

access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)

Podemos ver que poco después de iniciarse, el programa intentó entrar (en el disco) al archivo /etc/ld.so.preload. Además podemos ver que esto falló (-1 status), dado que no se encontró el archivo (ENOENT) con el mensaje de error descriptivo No such file or directory.

Solo esta única línea de salida podría dar lugar a más investigaciones. A modo de ejemplo, podemos escanear nuestro motor de búsqueda favorito en busca de lo que el archivo /etc/ld.so.preload es / hace y qué sucede cuando un programa no puede encontrarlo, así como además cómo podemos instalarlo.

Como puede ver, si ejecutara un software / programa más complejo en strace, es factible que descubra que está intentando entrar a un archivo, a modo de ejemplo, un archivo compartido .so biblioteca y no puedo encontrarlo. Se analiza fácilmente y probablemente se arregla fácilmente gracias a strace.

A continuación, vemos el conf.d caché binario que se abre con éxito como solo lectura (O_RDONLY), con el indicador close-on-exec (utilizado en programas multiproceso para evitar condiciones de carrera) O_CLOEXEC conjunto de banderas:

openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3

Inclusive si uno no sabe lo que significa cada elemento, una simple búsqueda en línea proporcionará rápidamente información sobre cada término o palabra específica, lo que le ayudará a comprender la información presentada y lo que está sucediendo.

Además de particular interés es esta línea hacia el final:

+++ exited with 0 +++

Esto indica que el programa se cerró correctamente con el código de salida. 0. Un código de salida de 0 de forma general indica una ejecución y finalización satisfactoria en los programas de Linux.

Como puede ver en los ejemplos anteriores, es fácil ver lo que hace un programa usando strace. Se puede analizar cada línea e inclusive cada palabra en cada línea y, a menudo, se necesita un motor de búsqueda para arrojar algo de luz. A pesar de esto, inclusive echar un vistazo a la salida de un programa que falla puede ser suficiente para hallar la causa exacta y solucionarlo, y especialmente cuando, a modo de ejemplo, falta un archivo requerido, etc.

RELACIONADO: Cómo impactan los niveles de ejecución de Linux a los servicios en ejecución

Seguimiento de procesos secundarios

Cuando usas strace, a veces parecerá que strace no está rastreando correctamente todas las llamadas al sistema del programa, etc. Esto podría deberse simplemente a que el programa que se está rastreando ha iniciado / iniciado varios procesos secundarios, a modo de ejemplo, al bifurcar procesos secundarios.

Es simple incluir estos procesos secundarios en la captura de strace: simplemente agregue el -f opción a la línea de comando (dicho de otra forma, strace -f your_program), y además se rastrearán todas las llamadas al sistema, etc., de todos los procesos secundarios.

Terminando

En este post, discutimos el strace herramienta, que se puede usar para rastrear cualquier programa o aplicación que se ejecute en una computadora basada en Linux.

Después de instalar la herramienta, podemos iniciar el programa de manera simple y directa bajo strace y disfrute del alto nivel de información de resolución de problemas y depuración que strace envoltorio nos presentará.

Suscribite a nuestro Newsletter

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