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ónAmbos lados, revisión siguiente
notas:strace [2020/04/17 01:25] – [Strace] cayunotas:strace [2020/04/17 01:52] – [Ejemplo de ejecución] cayu
Línea 120: Línea 120:
  return 0;  return 0;
 } }
 +</code>
 +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> </code>
 ===== Extras ===== ===== Extras =====
 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.
notas/strace.txt · Última modificación: 2020/04/17 02:11 por cayu