El uso de strace para solucionar problemas con los servidores Linux

  

strace es un gadget útil: se han instalado la mayoría de los sistemas Linux por defecto – puede hacer un seguimiento de las llamadas al sistema para informarle qué está haciendo un programa en segundo plano. Strace es una herramienta de depuración básica, pero es un gran software incluso si no está rastreando un problema. Puede decirle mucho sobre cómo funciona un programa de Linux.

Una llamada del sistema es un mensaje de la aplicación al kernel. Los programas de usuario en los sistemas informáticos modernos se ejecutan en un recinto de seguridad: no permiten la interacción directa con la computadora (por lo que no se pueden meter algunos datos en los registros para que funcionen como antes). En cambio, siempre que un programa necesita interactuar con el sistema, envía una solicitud (llamada del sistema) al kernel. Strace se utiliza para rastrear estos mensajes. Así que ten en cuenta que si no ves ningún resultado de strace durante un tiempo, eso no significa que tu programa esté bloqueando. Es muy probable que el programa haga algo en su propia caja de arena, y estas cosas no necesitan comunicarse con el resto del sistema.

Uso

Los programas de Strace pueden hacer estas cosas, pero siempre envían todo directamente al archivo de error estándar (es decir, la pantalla). Como verá, produce una gran cantidad de resultados; por lo general, es mejor configurar un archivo de salida con la opción -o:

strace -o outputfile.txt tiene algunos editores (por ejemplo, vim) puede sintaxis resaltar la salida de strace. Esto significa que diferentes partes del archivo, así como diferentes partes de cada línea, se muestran en diferentes colores. Esta característica es bastante útil, y recomiendo usar un editor como este para ver la salida de strace.

Explicación de la salida del comando

Intente strace -o strace.out ls – l, luego abra strace.out con su editor favorito y habilite el resaltado de sintaxis.

Antes de sumergirnos en los detalles, echemos un vistazo a la estructura básica de cada línea. Strace registra cada llamada al sistema realizada por el programa y se muestra en una línea separada. El nombre de la llamada al sistema aparece al comienzo de cada línea, los parámetros aparecen entre paréntesis y el valor de retorno es después del signo igual, que es el final de una línea. Las primeras líneas del comando ls – l son básicamente las siguientes:

execve (" /bin /ls ", [" ls ", " -l "], [/* 21 Vars * /]) = 0 brk (0) = 0x619000 mmap (NULL, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) = 0x2b412f2b9000 uname ({sys = " Linux ", node = " juliet.example.com ", ...}) = 0 La primera línea muestra una excelente llamada al sistema, la cual Los parámetros son los siguientes:  La ubicación del ejecutable actual (/bin /ls)  Una matriz de argumentos pasados ​​desde la línea de comandos (ls y -l)  También se pasa un puntero a 21 variables de entorno al programa. Un valor de retorno de 0 indica una ejecución exitosa. Esta es la estructura básica donde todas las llamadas al sistema son iguales. Todo dentro del fondo Las siguientes líneas están relacionadas con la administración de la memoria. Brk cambia el tamaño del segmento de datos, y mmap se usa para devolver la ubicación de memoria disponible para un proceso.
(Si necesita más información, intente man 2 mmap.)

La siguiente línea es la llamada al sistema uname, que se usa para mostrar los detalles del sistema. Lo que Uname devuelve es un puntero a una estructura de datos que almacena esta información. Las llamadas al sistema a menudo devuelven punteros: esta es una referencia de memoria que le indica dónde buscar esta información. Esto es muy útil si usted es una computadora, pero no es necesario si es una persona, por lo tanto, por conveniencia, cuando __strace__ ve un puntero, lo busca automáticamente y luego lo devuelve (parte de él) El contenido señalado por el puntero. Esto es exactamente lo que sucedió anteriormente en la llamada al sistema uname.

Si continúa viendo la salida de strace, verá muchos accesos y llamadas abiertas. Access busca un archivo (devuelve -1 y un código de error si no se encuentra) y luego verifica si el programa actual tiene acceso. Abra los intentos de abrir un archivo y, si tiene éxito, lo conectará a un manejador de archivos (comenzando en 3, ya que 0-2 se usa para STDIN, STDOUT y STDERR) y devuelve este manejador. Luego, fstat obtendrá información sobre el archivo adjunto al identificador, y el identificador pasa a través del primer argumento, de esta manera (tenga en cuenta que el segundo argumento es un puntero):

fstat (3, {st_mode = S_IFREG | 0644, st_size = 53482, ...}) = 0 Después de otra llamada mmap, el archivo se cerrará. En la salida de ls, verá que esta secuencia se repite muchas veces en el archivo de la biblioteca. Después de eso, hay llamadas a lstat, lgetxattr y getxattr para cada archivo listado. Todo esto se utiliza para obtener información para cada archivo. Finalmente, cada archivo se escribe en el archivo de salida de esta manera: stat (" /etc /localtime ", {st_mode = S_IFREG | 0644, st_size = 3661, ...}) = 0 write (1, " -rw ------- 1 juliet juliet 10 " ..., 72) = 72 identificadores de archivos numerados 1 y 2 ( STDOUT y STDERR) se cerrarán, por lo que todo está hecho.

Copyright © Conocimiento de Windows All Rights Reserved