strace es una utilidad de espacio de usuario para Linux que permite realizar diagnósticos, depuraciones y obtener instrucciones . Se utiliza para monitorizar y manipular las interacciones entre los procesos y el núcleo de Linux , incluyendo llamadas al sistema , envío de señales y cambios de estado de los procesos. El funcionamiento de strace es posible gracias a la función 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 derechos de autor, 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 al sistema para sistemas Sun(tm), muy similar al programa trace(1) proporcionado por Sun. strace ( 1) es una utilidad útil para depurar programas cuyo código fuente no está disponible, lo que lamentablemente incluye casi todo el software del sistema proporcionado por Sun.
Más tarde, Branko Lankester adaptó esta versión a Linux , publicando su versión en noviembre de 1992, seguida de una segunda versión en 1993. [ 6 ] [ 7 ] Richard Sladkey combinó estas versiones separadas de strace en 1993 y adaptó el programa a SVR4 y Solaris en 1994, [ 8 ] dando como resultado strace 3.0 que se anunció en comp.sources.misc a mediados de 1994. [ 9 ]
A partir de 1996, strace fue mantenido por Wichert Akkerman. Durante su gestión, el desarrollo de strace migró a CVS ; se introdujeron versiones para FreeBSD y muchas arquitecturas en Linux (incluidas ARM, IA-64, MIPS, PA-RISC, PowerPC, s390 y SPARC). En 2002, la responsabilidad del mantenimiento de strace se transfirió a Roland McGrath. Desde entonces, strace obtuvo soporte para varias arquitecturas nuevas de Linux (AMD64, s390x, SuperH), soporte para arquitecturas duales en algunas de ellas y recibió numerosas adiciones y mejoras en los 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 ha obtenido 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 algo de código (evidentemente muerto) [ 10 ] para sistemas operativos que no eran Linux fue la 4.6, publicada en marzo de 2011. [ 11 ] En la versión 4.7 de strace, publicada en mayo de 2012, [ 12 ] se había eliminado todo el código que no era Linux; [ 13 ] desde strace 4.13, [ 14 ] el proyecto sigue el calendario de lanzamiento del kernel de 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 rastreos 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 consiste en ejecutar un programa con strace, que imprime una lista de las llamadas al sistema realizadas por el programa. Esto resulta útil si el programa falla continuamente o no se comporta como se espera; por ejemplo, usar 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 consiste en usar la -pbandera para adjuntarse a un proceso en ejecución. Esto resulta útil si un proceso ha dejado de responder y podría revelar, por ejemplo, que el proceso se está bloqueando al intentar establecer 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 (mediante 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 expresiones regulares, como .-e trace=/clock_.* - Especificar una lista de rutas que se van a rastrear (
-P /etc/ld.so.cachepor ejemplo, ). - Especificar una lista de descriptores de archivo cuya E/S se debe volcar (
-e read=y-e write=opciones). - Conteo del tiempo de ejecución de la llamada al sistema y recuento (
-T,-c,-C, y-wopciones;-Ula opción permite imprimir información adicional, como el tiempo mínimo y máximo de ejecución de la llamada al sistema). - Impresión de marcas de tiempo relativas o absolutas (
-ty-ropciones). - Manipular 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 a los que apuntan los argumentos de las llamadas al sistema ( y ; desde strace 5.11) durante su ejecución.
-e inject=syscall specification:tampering specification:retval=:error=:signal=:delay_enter=:delay_exit=:poke_enter=:poke_exit= - Extracción de información sobre descriptores de archivos (incluidos sockets,
-yopción;-yyla opción proporciona información adicional, como direcciones de punto final para sockets, rutas y números mayor/menor de dispositivo para archivos). - Impresión de rastros de pila, incluyendo (desde strace 4.21) la decodificación de símbolos (
-kopció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 ID de subprocesos, procesos, grupos de procesos y sesiones que aparecen en el rastreo al espacio de nombres PID de strace (
--pidns-translationopción; desde strace 5.9). - Decodificación de la información de contexto de SELinux asociada con procesos, archivos y descriptores (
--secontextopció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 .
Dado que strace solo detalla las llamadas al sistema, no puede utilizarse 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 la utilizan los investigadores para generar trazas de llamadas al sistema para su posterior reproducción . [ 66 ] [ 67 ] [ 68 ]
Ejemplos
A continuación se muestra un ejemplo de la salida típica del stracecomando:
user@server:~$ strace ls ... open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3 fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 fcntl64(3, F_GETFD) = 0x1 (flags FD_CLOEXEC) getdents64(3, /* 18 entradas */, 4096) = 496 getdents64(3, /* 0 entradas */, 4096) = 0 close(3) = 0 fstat64(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f2c000 write(1, "autofs\nbackups\ncache\nflexlm\ngames"..., 86autofsAEl fragmento anterior es solo una pequeña parte de la salida de strace al ejecutar 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 archivo se escribe en la salida estándar.
Herramientas similares
Los distintos sistemas operativos incluyen otras herramientas de instrumentación similares o relacionadas , que ofrecen funciones parecidas o más avanzadas; algunas de estas herramientas (aunque utilicen el mismo nombre o uno similar) pueden emplear mecanismos de funcionamiento completamente diferentes, lo que da lugar a conjuntos de funciones o resultados distintos. Dichas herramientas incluyen las siguientes:
- Linux tiene ltrace que puede rastrear llamadas a bibliotecas y sistemas, xtrace que puede rastrear programas del sistema X Window , [ 69 ] SystemTap , perf , y trace-cmd y KernelShark que extienden ftrace .
- AIX proporciona el comando truss
- HP-UX ofrece el comando Tusc
- Solaris / Illumos tiene truss y DTrace
- UnixWare proporciona el comando truss
- FreeBSD proporciona los comandos truss , ktrace y DTrace.
- NetBSD proporciona ktrace y DTrace.
- OpenBSD utiliza ktrace y kdump.
- macOS proporciona ktrace (10.4 y anteriores), DTrace (de Solaris) y dtruss asociado en 10.5 y posteriores. [ 70 ]
- Microsoft Windows tiene una utilidad similar llamada StraceNT, escrita por Pankaj Garg, [ 71 ] y una utilidad similar basada en GUI llamada Process Monitor , desarrollada por Sysinternals .
Véase también
Notas
- ↑ Sin embargo, la decodificación de los mensajes de error del sistema se realiza de acuerdo con la configuración regional actual desde strace 4.22. [ 3 ]
- ↑ El conjunto de pruebas está licenciado bajo GPL v2.0+ .
- ↑ Su abreviatura para mostrar solo las llamadas exitosas,
-zopción, se agregó originalmente en strace 4.5, pero nunca se documentó ya que no funcionaba correctamente.
Referencias
- ↑ "Versión 7.1" . 15 de junio de 2026. Consultado el 16 de junio de 2026 .
- ↑ "El proyecto de código abierto strace en Open Hub" . Openhub.net . Consultado el 23 de noviembre de 2021 .
- ↑ Dmitry V. Levin (01-04-2018). " [ PARCHE ] Agregar soporte i18n" (Lista de correo) . Recuperado el 02-09-2021 .
- ↑ Dmitry V. Levin (15-12-2018). "I: cambio de la licencia de strace a una licencia copyleft" (Lista de correo) . Consultado el 02-09-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). "Primera versión de strace para Linux" .
- ↑ Branko Lankester (18 de junio de 1993). "segunda versión de strace para Linux" .
- ↑ «rastra» . tripulado.org. 21 de junio de 1994.
- ↑ "Índice de SUNET de /pub/usenet/ftp.uu.net/comp.sources.misc/volume43/strace" . Archivado del original el 11 de septiembre de 2007. Recuperado 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). "Lanzamiento de strace 4.7" .
- ↑ Dmitry V. Levin (20 de abril de 2012). "Cambios destacables 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). "Lanzamiento de strace 5.0" .
- ↑ Dmitry V. Levin (1 de mayo de 2012). "Cambios destacables en la versión 4.7" . GitHub .
- ↑ Dmitry V. Levin (15 de agosto de 2014). "Lanzamiento de strace 4.9" .
- ↑ Dmitry V. Levin (15 de agosto de 2014). "Cambios destacables 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 destacables en la versión 4.15" . GitHub .
- ↑ Dmitry V. Levin (26-02-2023). "strace 6.2 lanzado" .
- ↑ Dmitry V. Levin (12 de diciembre de 2022). "Lanzamiento de strace 6.1" .
- ↑ Dmitry V. Levin (29-10-2022). "strace 6.0 lanzado" .
- ↑ Dmitry V. Levin (12 de agosto de 2022). "Lanzamiento de strace 5.19" .
- ↑ Dmitry V. Levin (18-06-2022). "strace 5.18 lanzado" .
- ↑ Dmitry V. Levin (27-03-2022). "strace 5.17 lanzado" .
- ↑ Dmitry V. Levin (10 de enero de 2022). "Lanzamiento de strace 5.16" .
- ↑ Dmitry V. Levin (01-12-2021). "strace 5.15 lanzado" .
- ↑ Dmitry V. Levin (2021-09-02). "strace 5.14 lanzado" .
- ↑ Dmitry V. Levin (18-07-2021). "strace 5.13 lanzado" .
- ↑ Dmitry V. Levin (26-04-2021). "strace 5.12 lanzado" .
- ↑ Dmitry V. Levin (17 de febrero de 2021). "Lanzamiento de strace 5.11" .
- ↑ Dmitry V. Levin (14-12-2020). "strace 5.10 lanzado" .
- ↑ Dmitry V. Levin (24-09-2020). "strace 5.9 lanzado" .
- ↑ Dmitry V. Levin (06-08-2020). "strace 5.8 lanzado" .
- ↑ Dmitry V. Levin (01-06-2020). "strace 5.7 lanzado" .
- ↑ Dmitry V. Levin (2020-04-07). "strace 5.6 lanzado" .
- ↑ Dmitry V. Levin (06-02-2020). "strace 5.5 lanzado" .
- ↑ Dmitry V. Levin (28-11-2019). "strace 5.4 lanzado" .
- ↑ Dmitry V. Levin (25-09-2019). "strace 5.3 lanzado" .
- ↑ Dmitry V. Levin (12 de julio de 2019). "Lanzamiento de strace 5.2" .
- ↑ Dmitry V. Levin (22-05-2019). "strace 5.1 lanzado" .
- ↑ Dmitry V. Levin (19 de marzo de 2019). "Lanzamiento de strace 5.0" .
- ↑ Dmitry V. Levin (26-12-2018). "strace 4.26 lanzado" .
- ↑ Dmitry V. Levin (30-10-2018). "strace 4.25 lanzado" .
- ↑ Dmitry V. Levin (14-08-2018). "strace 4.24 lanzado" .
- ↑ Dmitry V. Levin (14-06-2018). "strace 4.23 lanzado" .
- ↑ Dmitry V. Levin (05-04-2018). "strace 4.22 lanzado" .
- ↑ Dmitry V. Levin (13 de febrero de 2018). "Lanzamiento de strace 4.21" .
- ↑ Dmitry V. Levin (13-11-2017). "strace 4.20 lanzado" .
- ↑ Dmitry V. Levin (05-09-2017). "strace 4.19 lanzado" .
- ↑ Dmitry V. Levin (05-07-2017). "strace 4.18 lanzado" .
- ↑ Dmitry V. Levin (24-05-2017). "strace 4.17 lanzado" .
- ↑ Dmitry V. Levin (14-02-2017). "strace 4.16 lanzado" .
- ↑ Dmitry V. Levin (14-12-2016). "strace 4.15 lanzado" .
- ↑ Dmitry V. Levin (04-10-2016). "strace 4.14 lanzado" .
- ↑ Dmitry V. Levin (26-07-2016). "strace 4.13 lanzado" .
- ↑ Dmitry V. Levin (31-05-2016). "strace 4.12 lanzado" .
- ↑ Dmitry V. Levin (21-12-2015). "strace 4.11 lanzado" .
- ↑ Dmitry V. Levin (06-03-2015). "strace 4.10 lanzado" .
- ↑ Dmitry V. Levin (15-08-2014). "strace 4.9 lanzado" .
- ↑ Dmitry V. Levin (03-06-2013). "strace 4.8 lanzado" .
- ↑ Dmitry V. Levin (2012-05-02). "strace 4.7 lanzado" .
- ↑ Dmitry V. Levin (15-03-2011). "strace 4.6 lanzado" .
- ↑ Rick Sladkey (1994-07-09). "v43i075: strace - rastreador de llamadas al sistema para sunos, linux, svr4, solaris2, Parte 01/10" .
- ↑ Horky, Jiri (2013). "El perfilador de E/S y el reproductor de trazas de E/S de ioapps" . Recuperado el 16 de septiembre de 2013 .
- ↑ Waterland, Amos (2007). "El sistema de repetición llama al reproductor" . Archivado del original el 1 de abril de 2016. Recuperado 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 ligeros" (PDF) . Recuperado el 16 de septiembre de 2013 .
- ↑ "XTrace - rastrea conexiones del protocolo X" . xtrace.alioth.debian.org . Archivado del original el 5 de agosto de 2014. Consultado el 12 de agosto de 2014 .
- ↑ "dtrace(1) Página del manual de Mac OS X" . Developer.apple.com . Consultado el 23 de julio de 2014 .
- ↑ "IntellectualHeaven - Strace para Windows" . intellectualheaven.com . Archivado del 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 OS Reviews sobre strace
- "Rastreo de llamadas al sistema con strace" , una charla con una descripción general de las características y el uso de strace, impartida por Michael Kerrisk en NDC TechTown 2018.
- "Trace moderno" ( fuente ), una charla con una descripción general de las características de strace, impartida por Dmitry Levin en DevConf.cz 2019.
- Software de línea de comandos
- Depuradores
- Software libre programado en C
- Software que utiliza la Licencia Pública General Reducida de GNU.
- Herramientas de programación Unix