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:21] – [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 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 |
| - | Su uso más común consiste en arrancarlo | + | Se puede arrancar |
| ===== 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.1587086473.txt.gz · Última modificación: 2020/04/17 01:21 por cayu
