notas:strace
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
notas:strace [2020/04/17 01:25] – [Strace] cayu | notas:strace [2020/04/17 02:11] (actual) – [Extras y referencias útiles] cayu | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
====== Strace ====== | ====== Strace ====== | ||
- | **strace** es una utilidad que nos puede ayudar en la comprobación de errores y cuellos de botella en procesos en el sistema operativo GNU/Linux. La misma sirve para monitorear las llamadas al sistema usadas por un determinado programa, todas las señales que éste recibe y cuando tiempo toma cada llamada. Esto es posible por una característica del núcleo linux llamada **ptrace**. | + | **strace** es una utilidad que nos puede ayudar en la comprobación de errores y cuellos de botella en procesos en el sistema operativo GNU/Linux. La misma sirve para monitorear las llamadas al sistema usadas por un determinado programa, todas las señales que este recibe y cuando tiempo toma cada llamada. Esto es posible por una característica del núcleo linux llamada **ptrace**. |
Se puede arrancar junto al programa al que se le efectúa el trace, imprime la lista de llamadas al sistema que dicho programa ejecuta. Es útil para averiguar la causa del fallo de un programa determinado porque informa de situaciones en las que por ejemplo, el programa está intentando acceder a un fichero que no existe o que no tiene permiso de lectura o tiempos de espera muy altos al intentar obtener un servicio remoto por red. | Se puede arrancar junto al programa al que se le efectúa el trace, imprime la lista de llamadas al sistema que dicho programa ejecuta. Es útil para averiguar la causa del fallo de un programa determinado porque informa de situaciones en las que por ejemplo, el programa está intentando acceder a un fichero que no existe o que no tiene permiso de lectura o tiempos de espera muy altos al intentar obtener un servicio remoto por red. | ||
Línea 7: | Línea 7: | ||
===== Uso ===== | ===== Uso ===== | ||
- | En simples palabras su ejecución | + | En simples palabras su ejecución |
- | Si ejecutamos un **strace** al numero | + | Si ejecutamos un **strace** al número |
< | < | ||
Línea 121: | Línea 121: | ||
} | } | ||
</ | </ | ||
- | ===== Extras ===== | + | Para compilarlo procederemos a ejecutar **gcc**: |
- | A veces también puede servirnos **ltrace**, que es una utilidad de depuración, | + | < |
+ | gcc socket.c -o socket | ||
+ | </ | ||
+ | Strace nos mostrará muchos datos, como llamadas al sistema para imprimir datos en pantalla, files descriptors, | ||
+ | Si solo nos interesan las llamadas a funciones de red, podemos agregarle los siguientes argumentos //-e trace=network, | ||
+ | < | ||
+ | 00 strace -e trace=network, | ||
+ | 01 read(3, " | ||
+ | 02 read(3, " | ||
+ | 03 read(3, " | ||
+ | 04 read(3, " | ||
+ | 05 read(3, " | ||
+ | 06 read(3, " | ||
+ | 07 read(3, " | ||
+ | 08 read(3, "# The \" | ||
+ | 09 read(3, "", | ||
+ | 10 read(3, "# Generated by NetworkManager\nna" | ||
+ | 11 read(3, "", | ||
+ | 12 socket(AF_UNIX, | ||
+ | 13 connect(3, {sa_family=AF_UNIX, | ||
+ | 14 socket(AF_UNIX, | ||
+ | 15 connect(3, {sa_family=AF_UNIX, | ||
+ | 16 read(3, "# / | ||
+ | 17 read(3, "", | ||
+ | 18 read(3, " | ||
+ | 19 read(3, " | ||
+ | 20 read(3, "", | ||
+ | 21 read(3, " | ||
+ | 22 read(3, " | ||
+ | 23 read(3, " | ||
+ | 24 socket(AF_INET, | ||
+ | 25 setsockopt(3, | ||
+ | 26 connect(3, {sa_family=AF_INET, | ||
+ | 27 sendto(3, " | ||
+ | 28 recvfrom(3, " | ||
+ | 29 socket(AF_INET, | ||
+ | 30 setsockopt(3, | ||
+ | 31 connect(3, {sa_family=AF_INET, | ||
+ | 32 write(3, "GET / | ||
+ | 33 read(3, "< | ||
+ | 34 write(2, "< | ||
+ | 35 < | ||
+ | 36 <body bgcolor=" | ||
+ | 37 < | ||
+ | 38 < | ||
+ | 39 </ | ||
+ | 40 </ | ||
+ | 41 ) = 178 | ||
+ | 42 read(3, "", | ||
+ | 43 shutdown(3, SHUT_RDWR) | ||
+ | 44 +++ exited with 0 +++ | ||
+ | 45 | ||
+ | </ | ||
+ | |||
+ | En la línea 00 podemos ver el comando completo, vemos llamadas al DNS en varios read y un connect en la línea **26** para efectivamente realizar la consulta, la resolución del nombre en la línea **28** y efectivamente el connect de lo que queremos obtener en la línea **31**, el GET que enviamos en la línea **32**, su lectura y su escritura en pantalla. | ||
+ | |||
+ | Si por ejemplo solo queremos ver los system calls //open, close, read, y write// podemos proceder de la siguiente forma : | ||
+ | < | ||
+ | strace -e trace=open, | ||
+ | close(3) | ||
+ | read(3, " | ||
+ | read(3, " | ||
+ | read(3, " | ||
+ | read(3, " | ||
+ | read(3, " | ||
+ | read(3, " | ||
+ | read(3, " | ||
+ | close(3) | ||
+ | read(3, "# The \" | ||
+ | read(3, "", | ||
+ | close(3) | ||
+ | read(3, "# Generated by NetworkManager\nna" | ||
+ | read(3, "", | ||
+ | close(3) | ||
+ | close(3) | ||
+ | close(3) | ||
+ | read(3, "# / | ||
+ | read(3, "", | ||
+ | close(3) | ||
+ | close(3) | ||
+ | read(3, " | ||
+ | close(3) | ||
+ | read(3, " | ||
+ | read(3, "", | ||
+ | close(3) | ||
+ | close(3) | ||
+ | read(3, " | ||
+ | close(3) | ||
+ | read(3, " | ||
+ | close(3) | ||
+ | close(3) | ||
+ | read(3, " | ||
+ | close(3) | ||
+ | close(3) | ||
+ | write(3, "GET / | ||
+ | read(3, "< | ||
+ | write(2, "< | ||
+ | < | ||
+ | <body bgcolor=" | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | ) = 178 | ||
+ | read(3, "", | ||
+ | close(3) | ||
+ | +++ exited with 0 +++ | ||
+ | </ | ||
+ | |||
+ | Estadísticas de las llamadas : | ||
+ | < | ||
+ | strace -c ./ | ||
+ | < | ||
+ | < | ||
+ | <body bgcolor=" | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | % time | ||
+ | ------ ----------- ----------- --------- --------- ---------------- | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | 8,37 0, | ||
+ | 4,55 0, | ||
+ | 2,79 0, | ||
+ | 2,35 0, | ||
+ | 2,06 0, | ||
+ | 1,91 0, | ||
+ | 0,88 0, | ||
+ | 0,88 0, | ||
+ | 0,00 0, | ||
+ | 0,00 0, | ||
+ | 0,00 0, | ||
+ | 0,00 0, | ||
+ | 0,00 0, | ||
+ | 0,00 0, | ||
+ | 0,00 0, | ||
+ | 0,00 0, | ||
+ | 0,00 0, | ||
+ | 0,00 0, | ||
+ | 0,00 0, | ||
+ | ------ ----------- ----------- --------- --------- ---------------- | ||
+ | 100.00 | ||
+ | </ | ||
+ | ===== Extras | ||
+ | A veces también puede servirnos **ltrace**, que es una utilidad de depuración, | ||
+ | |||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// |
notas/strace.1587086732.txt.gz · Última modificación: 2020/04/17 01:25 por cayu