Herramientas de usuario

Herramientas del sitio


notas:strace

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
Próxima revisiónAmbos lados, revisión siguiente
notas:strace [2020/04/17 01:25] – [Strace] cayunotas:strace [2020/04/17 01:59] – [Ejemplo de ejecución] cayu
Línea 121: Línea 121:
 } }
 </code> </code>
-===== Extras =====+Para compilarlo procederemos a ejecutar **gcc**: 
 +<code> 
 +gcc socket.c -o socket 
 +</code> 
 +Strace nos mostrará muchos datos, como llamadas al sistema para imprimi como files descriptors, llamadas a memoria etc. Si solo nos interesa las llamadas a funciones de red, podemos agregarle los siguientes argumentos //-e trace=network,read,write// o simplemente //-e trace=network// 
 +<code> 
 +00    strace -e trace=network,read,write ./socket  cayu.com.ar 80 
 +01    read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360r\2\0\0\0\0\0"..., 832) = 832 
 +02    read(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784) = 784 
 +03    read(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32) = 32 
 +04    read(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0q7?\324>\326\250>\n\253\230<:\227\0362"..., 68) = 68 
 +05    read(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784) = 784 
 +06    read(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32) = 32 
 +07    read(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0q7?\324>\326\250>\n\253\230<:\227\0362"..., 68) = 68 
 +08    read(3, "# The \"order\" line is only used "..., 4096) = 92 
 +09    read(3, "", 4096)                       = 0 
 +10    read(3, "# Generated by NetworkManager\nna"..., 4096) = 52 
 +11    read(3, "", 4096)                       = 0 
 +12    socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3 
 +13    connect(3, {sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No existe el archivo o el directorio) 
 +14    socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3 
 +15    connect(3, {sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No existe el archivo o el directorio) 
 +16    read(3, "# /etc/nsswitch.conf\n#\n# Example"..., 4096) = 542 
 +17    read(3, "", 4096)                       = 0 
 +18    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\3005\0\0\0\0\0\0"..., 832) = 832 
 +19    read(3, "127.0.0.1\tlocalhost\n127.0.1.1\tt4"..., 4096) = 303 
 +20    read(3, "", 4096)                       = 0 
 +21    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\16\0\0\0\0\0\0"..., 832) = 832 
 +22    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@G\0\0\0\0\0\0"..., 832) = 832 
 +23    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 #\0\0\0\0\0\0"..., 832) = 832 
 +24    socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 3 
 +25    setsockopt(3, SOL_IP, IP_RECVERR, [1], 4) = 0 
 +26    connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.53")}, 16) = 0 
 +27    sendto(3, "\334f\1\0\0\1\0\0\0\0\0\0\4cayu\3com\2ar\0\0\1\0\1", 29, MSG_NOSIGNAL, NULL, 0) = 29 
 +28    recvfrom(3, "\334f\201\200\0\1\0\1\0\0\0\0\4cayu\3com\2ar\0\0\1\0\1\300\f\0"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.53")}, [28->16]) = 45 
 +29    socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3 
 +30    setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0 
 +31    connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("69.61.93.142")}, 16) = 0 
 +32    write(3, "GET /\r\n", 7)                = 7 
 +33    read(3, "<html>\r\n<head><title>301 Moved P"..., 1023) = 178 
 +34    write(2, "<html>\r\n<head><title>301 Moved P"..., 178<html> 
 +35    <head><title>301 Moved Permanently</title></head> 
 +36    <body bgcolor="white"> 
 +37    <center><h1>301 Moved Permanently</h1></center> 
 +38    <hr><center>nginx</center> 
 +39    </body> 
 +40    </html> 
 +41    ) = 178 
 +42    read(3, "", 1023)                       = 0 
 +43    shutdown(3, SHUT_RDWR)                  = 0 
 +44    +++ exited with 0 +++ 
 +45     
 +</code> 
 + 
 +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 : 
 +<code> 
 +strace -e trace=open,close,read,write  ./socket  cayu.com.ar 80 
 +close(3)                                = 0 
 +read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360r\2\0\0\0\0\0"..., 832) = 832 
 +read(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784) = 784 
 +read(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32) = 32 
 +read(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0q7?\324>\326\250>\n\253\230<:\227\0362"..., 68) = 68 
 +read(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784) = 784 
 +read(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32) = 32 
 +read(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0q7?\324>\326\250>\n\253\230<:\227\0362"..., 68) = 68 
 +close(3)                                = 0 
 +read(3, "# The \"order\" line is only used "..., 4096) = 92 
 +read(3, "", 4096)                       = 0 
 +close(3)                                = 0 
 +read(3, "# Generated by NetworkManager\nna"..., 4096) = 52 
 +read(3, "", 4096)                       = 0 
 +close(3)                                = 0 
 +close(3)                                = 0 
 +close(3)                                = 0 
 +read(3, "# /etc/nsswitch.conf\n#\n# Example"..., 4096) = 542 
 +read(3, "", 4096)                       = 0 
 +close(3)                                = 0 
 +close(3)                                = 0 
 +read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\3005\0\0\0\0\0\0"..., 832) = 832 
 +close(3)                                = 0 
 +read(3, "127.0.0.1\tlocalhost\n127.0.1.1\tt4"..., 4096) = 303 
 +read(3, "", 4096)                       = 0 
 +close(3)                                = 0 
 +close(3)                                = 0 
 +read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\16\0\0\0\0\0\0"..., 832) = 832 
 +close(3)                                = 0 
 +read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@G\0\0\0\0\0\0"..., 832) = 832 
 +close(3)                                = 0 
 +close(3)                                = 0 
 +read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 #\0\0\0\0\0\0"..., 832) = 832 
 +close(3)                                = 0 
 +close(3)                                = 0 
 +write(3, "GET /\r\n", 7)                = 7 
 +read(3, "<html>\r\n<head><title>301 Moved P"..., 1023) = 178 
 +write(2, "<html>\r\n<head><title>301 Moved P"..., 178<html> 
 +<head><title>301 Moved Permanently</title></head> 
 +<body bgcolor="white"> 
 +<center><h1>301 Moved Permanently</h1></center> 
 +<hr><center>nginx</center> 
 +</body> 
 +</html> 
 +) = 178 
 +read(3, "", 1023)                       = 0 
 +close(3)                                = 0 
 ++++ exited with 0 +++ 
 +</code> 
 + 
 +Estadísticas de las llamadas : 
 +<code> 
 +strace -c  ./socket  cayu.com.ar 80 
 +<html> 
 +<head><title>301 Moved Permanently</title></head> 
 +<body bgcolor="white"> 
 +<center><h1>301 Moved Permanently</h1></center> 
 +<hr><center>nginx</center> 
 +</body> 
 +</html> 
 +% time     seconds  usecs/call     calls    errors syscall 
 +------ ----------- ----------- --------- --------- ---------------- 
 + 24,08    0,000164          82                   write 
 + 22,76    0,000155                  21           read 
 + 16,45    0,000112         112                   shutdown 
 + 12,92    0,000088          22                 2 connect 
 +  8,37    0,000057                  17           close 
 +  4,55    0,000031          31                   sendto 
 +  2,79    0,000019                             socket 
 +  2,35    0,000016                             poll 
 +  2,06    0,000014                             munmap 
 +  1,91    0,000013                             setsockopt 
 +  0,88    0,000006                             ioctl 
 +  0,88    0,000006                             recvfrom 
 +  0,00    0,000000                             stat 
 +  0,00    0,000000                  13           fstat 
 +  0,00    0,000000                             lseek 
 +  0,00    0,000000                  26           mmap 
 +  0,00    0,000000                             mprotect 
 +  0,00    0,000000                             brk 
 +  0,00    0,000000                           1 access 
 +  0,00    0,000000                             execve 
 +  0,00    0,000000                             uname 
 +  0,00    0,000000                           1 arch_prctl 
 +  0,00    0,000000                  13           openat 
 +------ ----------- ----------- --------- --------- ---------------- 
 +100.00    0,000681                   138         4 total 
 +</code> 
 +===== Extras y referencias útiles =====
 A veces también puede servirnos **ltrace**, que es una utilidad de depuración, que se usa para mostrar las llamadas que una aplicación de espacio de usuario hace a las bibliotecas compartidas. A veces también puede servirnos **ltrace**, que es una utilidad de depuración, que se usa para mostrar las llamadas que una aplicación de espacio de usuario hace a las bibliotecas compartidas.
 +
 +  * https://www.linkedin.com/learning/faster-python-services/strace
 +  * https://www.amazon.es/Linux-Security-Cookbook-Daniel-Barrett/dp/0596003919
 +  * https://www.mcanan.uy/blog/strace/
 +  * https://strace.io/
notas/strace.txt · Última modificación: 2020/04/17 02:11 por cayu