Utilidad de espacio de usuario para diagnóstico, depuración e instrucción para Linux
strace es una utilidad de diagnóstico, depuración e instrucción para Linux . Se utiliza para supervisar y manipular las interacciones entre los procesos y el núcleo de Linux , que incluyen llamadas al sistema , entregas de señales y cambios en el estado del proceso. El funcionamiento de strace es posible gracias a la característica del núcleo conocida como ptrace .
Algunos sistemas tipo Unix proporcionan otras herramientas de diagnóstico similares a strace, como truss .
Historia
Strace fue escrito originalmente para SunOS por Paul Kranenburg en 1991, según su aviso de copyright, y publicado a principios de 1992, en el volumen tres de comp.sources.sun. El archivo README inicial contenía lo siguiente: [5]
strace(1) es un rastreador de llamadas del sistema para sistemas Sun(tm) muy parecido al programa trace(1) provisto por Sun. strace(1) es una utilidad útil para depurar programas para los cuales no hay una fuente disponible y que desafortunadamente incluye casi todo el software de sistema provisto por Sun.
Más tarde, Branko Lankester portó esta versión a Linux , lanzando su versión en noviembre de 1992 y la segunda versión en 1993. [6] [7] Richard Sladkey combinó estas versiones separadas de strace en 1993 y portó el programa a SVR4 y Solaris en 1994, [8] lo que resultó en strace 3.0 que se anunció en comp.sources.misc a mediados de 1994. [9]
A partir de 1996, el mantenimiento de strace estuvo a cargo de Wichert Akkerman. Durante su mandato, el desarrollo de strace migró a CVS ; se introdujeron puertos a FreeBSD y muchas arquitecturas en Linux (incluidas ARM, IA-64, MIPS, PA-RISC, PowerPC, s390, SPARC). En 2002, la carga del mantenimiento de strace se transfirió a Roland McGrath. Desde entonces, strace obtuvo soporte para varias arquitecturas Linux nuevas (AMD64, s390x, SuperH), soporte bi-arquitectura para algunas de ellas y recibió numerosas adiciones y mejoras en decodificadores de llamadas al sistema en Linux; el desarrollo de strace migró a git durante ese período. Desde 2009, strace es mantenido activamente por Dmitry Levin. Desde entonces, strace obtuvo soporte para las arquitecturas AArch64, ARC, AVR32, Blackfin, Meta, Nios II, OpenSISC 1000, RISC-V, Tile/TileGx y Xtensa.
La última versión de strace que tenía algún código (evidentemente muerto) [10] para sistemas operativos no Linux fue la 4.6, lanzada en marzo de 2011. [11] En la versión 4.7 de strace, lanzada en mayo de 2012, [12] todo el código no Linux había sido eliminado; [13] desde strace 4.13, [14] el proyecto sigue el cronograma de lanzamiento del núcleo Linux, y a partir de la versión 5.0, [15] también sigue el esquema de versiones de Linux.
En 2012, strace también obtuvo soporte para el rastreo de rutas y la decodificación de rutas de descriptores de archivos. [16] En agosto de 2014, se lanzó strace 4.9, [17] [18] donde se agregó soporte para la impresión de seguimientos de pila. En diciembre de 2016, [19] [20] se implementó la función de inyección de fallas de llamadas al sistema .
Historial de versiones
Uso y características
El uso más común es iniciar un programa mediante strace, que imprime una lista de llamadas al sistema realizadas por el programa. Esto es útil si el programa falla continuamente o no se comporta como se espera; por ejemplo, el uso de strace puede revelar que el programa está intentando acceder a un archivo que no existe o que no se puede leer.
Una aplicación alternativa es utilizar la -p
bandera para asociarla a un proceso en ejecución. Esto es útil si un proceso ha dejado de responder y podría revelar, por ejemplo, que el proceso se está bloqueando mientras intenta hacer una conexión de red.
Entre otras características, strace permite lo siguiente:
- Especificar un filtro de nombres de llamadas al sistema que deben rastrearse (a través de la
-e trace=
opción): por nombre, como clone,fork,vfork ; usando uno de los grupos predefinidos, como %ipc o %file ; o (desde strace 4.17) usando la sintaxis de expresión regular, como .-e trace=/clock_.*
- Especificar una lista de rutas a rastrear (
-P /etc/ld.so.cache
, por ejemplo). - Especificar una lista de descriptores de archivos cuya E/S debe volcarse (
-e read=
y -e write=
opciones). - Conteo del tiempo de ejecución de llamadas al sistema y recuento ( opciones
-T
, -c
, -C
y -w
; -U
la opción habilita la impresión de información adicional, como el tiempo mínimo y máximo de ejecución de llamadas al sistema). - Impresión de marcas de tiempo relativas o absolutas (
-t
y -r
opciones). - Alterar las llamadas al sistema que se están ejecutando ( opción): modificar el retorno ( ; desde strace 4.16) y el código de error ( ; desde strace 4.15) de las llamadas al sistema especificadas, inyectar señales ( ; desde strace 4.16), retrasos ( y ; desde strace 4.22), y modificar los datos apuntados por los argumentos de las llamadas al sistema ( y ; desde strace 5.11) tras su ejecución.
-e inject=syscall specification:tampering specification
:retval=
:error=
:signal=
:delay_enter=
:delay_exit=
:poke_enter=
:poke_exit=
- Extraer información sobre descriptores de archivos (incluidos sockets,
-y
opción; -yy
la opción proporciona información adicional, como direcciones de puntos finales para sockets, rutas y números principales/secundarios de dispositivos para archivos). - Impresión de seguimientos de pila, incluyendo (desde strace 4.21) desmantelamiento de símbolos (
-k
opción). - Filtrado por estado de retorno de llamada al sistema (
-e status=
opción; desde strace 5.2 [nota 3] ). - Realizar la traducción de los identificadores de subprocesos, procesos, grupos de procesos y sesiones que aparecen en el seguimiento al espacio de nombres PID de strace (
--pidns-translation
opción; desde strace 5.9). - Decodificación de la información de contexto de SELinux asociada con procesos, archivos y descriptores (
--secontext
opción; desde strace 5.12).
strace admite la decodificación de argumentos de algunas clases de comandos ioctl , como BTRFS_* , V4L2_* , DM_* , NSFS_* , MEM* , EVIO* , KVM_* y varios otros; también admite la decodificación de varios protocolos netlink .
Como strace solo detalla las llamadas del sistema, no se puede utilizar para detectar tantos problemas como un depurador de código como GNU Debugger (gdb). Sin embargo, es más fácil de usar que un depurador de código y es una herramienta muy útil para los administradores de sistemas. También lo utilizan los investigadores para generar rastros de llamadas del sistema para su posterior reproducción . [66] [67] [68]
Ejemplos
El siguiente es un ejemplo de salida típica del strace
comando:
usuario@servidor:~$ strace ls ... open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3 fstat64(3, {modo_de_entrada=S_IFDIR|0755, tamaño_de_entrada=4096, ...}) = 0 fcntl64(3, F_GETFD) = 0x1 (indica FD_CLOEXEC) getdents64(3, /* 18 entradas */, 4096) = 496 getdents64(3, /* 0 entradas */, 4096) = 0 close(3) = 0 fstat64(1, {modo_de_entrada=S_IFIFO|0600, tamaño_de_entrada=0, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVADO|MAP_ANÓNIMO, -1, 0) = 0xb7f2c000 escritura(1, "autofs\ncopias de seguridad\ncache\nflexlm\njuegos"..., 86autofsA
El fragmento anterior es solo una pequeña parte de la salida de strace cuando se ejecuta con el comando ' ls '. Muestra que se abre el directorio de trabajo actual, se inspecciona y se recupera su contenido. La lista resultante de nombres de archivos se escribe en la salida estándar.
Herramientas similares
Los distintos sistemas operativos cuentan con otras herramientas de instrumentación similares o relacionadas , que ofrecen funciones similares o más avanzadas; algunas de las herramientas (aunque utilicen el mismo nombre o uno similar) pueden utilizar mecanismos de trabajo completamente diferentes, lo que da como resultado conjuntos de funciones o resultados diferentes. Entre estas herramientas se incluyen las siguientes:
Véase también
Notas
- ^ Sin embargo, la decodificación de mensajes de error del sistema se realiza de acuerdo con la configuración regional actual desde strace 4.22. [3]
- ^ El conjunto de pruebas tiene licencia GPL v2.0+ .
- ^ Su abreviatura para mostrar solo llamadas exitosas,
-z
option, se agregó originalmente en strace 4.5, pero nunca se documentó porque no funcionaba correctamente.
Referencias
- ^ "Versión 6.11". 15 de septiembre de 2024. Consultado el 26 de septiembre de 2024 .
- ^ "El proyecto de código abierto Strace en Open Hub". Openhub.net . Consultado el 23 de noviembre de 2021 .
- ^ Dmitry V. Levin (1 de abril de 2018). "[PARCHE] Añadir compatibilidad con i18n" (Lista de correo) . Consultado el 2 de septiembre de 2021 .
- ↑ Dmitry V. Levin (15 de diciembre de 2018). "I: cambiar la licencia de strace a una licencia copyleft" (Lista de correo) . Consultado el 2 de septiembre de 2021 .
- ^ Paul Kranenburg (2 de marzo de 1992). "Strace: un rastreador de llamadas al sistema alternativo". Grupo de noticias : comp.sources.sun.
- ^ Branko Lankester (5 de noviembre de 1992). "primer lanzamiento de strace para Linux".
- ^ Branko Lankester (18 de junio de 1993). "Segunda versión de Linux de strace".
- ^ "raza". tripulado.org. 21 de junio de 1994.
- ^ "Índice de /pub/usenet/ftp.uu.net/comp.sources.misc/volume43/strace de SUNET". Archivado desde el original el 11 de septiembre de 2007 . Consultado el 14 de enero de 2015 .
- ^ Denys Vlasenko (7 de febrero de 2012). "¿Qué tal si eliminamos el código que no es de Linux?".
- ^ Dmitry V. Levin (16 de marzo de 2011). "strace 4.6 lanzado".
- ^ Dmitry V. Levin (2 de mayo de 2012). "strace 4.7 lanzado".
- ^ Dmitry V. Levin (20 de abril de 2012). "Cambios notables en la versión 4.7".
- ^ Dmitry V. Levin (4 de octubre de 2016). "strace 4.14 lanzado".
- ^ Dmitry V. Levin (19 de marzo de 2019). "Se lanzó strace 5.0".
- ^ Dmitry V. Levin (1 de mayo de 2012). «Cambios notables en la versión 4.7». GitHub .
- ^ Dmitry V. Levin (15 de agosto de 2014). "strace 4.9 lanzado".
- ^ Dmitry V. Levin (15 de agosto de 2014). «Cambios notables en la versión 4.9». GitHub .
- ^ Dmitry V. Levin (14 de diciembre de 2016). "strace 4.15 lanzado".
- ^ Dmitry V. Levin (14 de diciembre de 2016). «Cambios notables en la versión 4.15». GitHub .
- ^ Dmitry V. Levin (26 de febrero de 2023). "Se lanzó strace 6.2".
- ^ Dmitry V. Levin (12 de diciembre de 2022). "Se lanzó strace 6.1".
- ^ Dmitry V. Levin (29 de octubre de 2022). "Lanzamiento de strace 6.0".
- ^ Dmitry V. Levin (12 de agosto de 2022). "Se lanzó strace 5.19".
- ^ Dmitry V. Levin (18 de junio de 2022). "Se lanzó strace 5.18".
- ^ Dmitry V. Levin (27 de marzo de 2022). "Se lanzó strace 5.17".
- ^ Dmitry V. Levin (10 de enero de 2022). "Se lanzó strace 5.16".
- ^ Dmitry V. Levin (1 de diciembre de 2021). "Se lanzó la versión 5.15 de Strace".
- ^ Dmitry V. Levin (2 de septiembre de 2021). "Se lanzó la versión 5.14 de Strace".
- ^ Dmitry V. Levin (18 de julio de 2021). "Se lanzó strace 5.13".
- ^ Dmitry V. Levin (26 de abril de 2021). "Se lanzó strace 5.12".
- ^ Dmitry V. Levin (17 de febrero de 2021). "Se lanzó la versión 5.11 de Strace".
- ^ Dmitry V. Levin (14 de diciembre de 2020). "Se lanzó strace 5.10".
- ^ Dmitry V. Levin (24 de septiembre de 2020). "Se lanzó strace 5.9".
- ^ Dmitry V. Levin (6 de agosto de 2020). "Se lanzó strace 5.8".
- ^ Dmitry V. Levin (1 de junio de 2020). "Se lanzó strace 5.7".
- ^ Dmitry V. Levin (7 de abril de 2020). "Se lanzó strace 5.6".
- ^ Dmitry V. Levin (6 de febrero de 2020). "Se lanzó strace 5.5".
- ^ Dmitry V. Levin (28 de noviembre de 2019). "Se lanzó strace 5.4".
- ^ Dmitry V. Levin (25 de septiembre de 2019). "Se lanzó strace 5.3".
- ^ Dmitry V. Levin (12 de julio de 2019). "Se lanzó strace 5.2".
- ^ Dmitry V. Levin (22 de mayo de 2019). "Se lanzó strace 5.1".
- ^ Dmitry V. Levin (19 de marzo de 2019). "Se lanzó strace 5.0".
- ^ Dmitry V. Levin (26 de diciembre de 2018). "strace 4.26 lanzado".
- ^ Dmitry V. Levin (30 de octubre de 2018). "strace 4.25 lanzado".
- ^ Dmitry V. Levin (14 de agosto de 2018). "strace 4.24 lanzado".
- ^ Dmitry V. Levin (14 de junio de 2018). "strace 4.23 lanzado".
- ^ Dmitry V. Levin (5 de abril de 2018). "strace 4.22 lanzado".
- ^ Dmitry V. Levin (13 de febrero de 2018). "strace 4.21 lanzado".
- ^ Dmitry V. Levin (13 de noviembre de 2017). "strace 4.20 lanzado".
- ^ Dmitry V. Levin (5 de septiembre de 2017). "strace 4.19 lanzado".
- ^ Dmitry V. Levin (5 de julio de 2017). "strace 4.18 lanzado".
- ^ Dmitry V. Levin (24 de mayo de 2017). "strace 4.17 lanzado".
- ^ Dmitry V. Levin (14 de febrero de 2017). "strace 4.16 lanzado".
- ^ Dmitry V. Levin (14 de diciembre de 2016). "strace 4.15 lanzado".
- ^ Dmitry V. Levin (4 de octubre de 2016). "Se lanzó strace 4.14".
- ^ Dmitry V. Levin (26 de julio de 2016). "strace 4.13 lanzado".
- ^ Dmitry V. Levin (31 de mayo de 2016). "strace 4.12 lanzado".
- ^ Dmitry V. Levin (21 de diciembre de 2015). "Se lanzó strace 4.11".
- ^ Dmitry V. Levin (6 de marzo de 2015). "Se lanzó strace 4.10".
- ^ Dmitry V. Levin (15 de agosto de 2014). "strace 4.9 lanzado".
- ^ Dmitry V. Levin (3 de junio de 2013). "strace 4.8 lanzado".
- ^ Dmitry V. Levin (2 de mayo de 2012). "strace 4.7 lanzado".
- ^ Dmitry V. Levin (15 de marzo de 2011). "strace 4.6 lanzado".
- ^ Rick Sladkey (9 de julio de 1994). "v43i075: strace - rastreador de llamadas del sistema para sunos, linux, svr4, solaris2, Parte 01/10".
- ^ Horky, Jiri (2013). "El generador de perfiles de E/S y el reproductor de trazas de E/S de ioapps" . Consultado el 16 de septiembre de 2013 .
- ^ Waterland, Amos (2007). "El sistema sreplay llama al reproductor" . Consultado el 16 de septiembre de 2013 .
- ^ Burton, Ariel (1998). "Caracterización de la carga de trabajo mediante el rastreo y la reejecución de llamadas al sistema ligero" (PDF) . Consultado el 16 de septiembre de 2013 .
- ^ "XTrace - seguimiento de conexiones del protocolo X". xtrace.alioth.debian.org . Archivado desde el original el 2014-08-05 . Consultado el 2014-08-12 .
- ^ "Página del manual de Mac OS X de dtrace(1)". Developer.apple.com . Consultado el 23 de julio de 2014 .
- ^ "IntellectualHeaven - Strace para Windows". intellectualheaven.com . Archivado desde el original el 5 de marzo de 2016. Consultado el 29 de enero de 2015 .
Enlaces externos
- Página del proyecto Strace
- Página del manual
- Artículo de reseñas de sistemas operativos en strace
- "Seguimiento de llamadas del sistema con strace", una charla con una descripción general de las características y el uso de strace, a cargo de Michael Kerrisk en NDC TechTown 2018
- "Modern strace" (fuente), una charla con una descripción general de las características de strace, impartida por Dmitry Levin en DevConf.cz 2019