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 previaPróxima revisiónAmbos lados, revisión siguiente | ||
notas:strace [2020/04/16 23:05] – cayu | notas:strace [2020/04/17 01:55] – [Extras] 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 | + | **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 ===== | ||
Línea 52: | Línea 52: | ||
</ | </ | ||
+ | ===== Ejemplo de ejecución ===== | ||
+ | Podemos tomar este código : https:// | ||
+ | <code c> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | int socket_connect(char *host, in_port_t port){ | ||
+ | struct hostent *hp; | ||
+ | struct sockaddr_in addr; | ||
+ | int on = 1, sock; | ||
+ | |||
+ | if((hp = gethostbyname(host)) == NULL){ | ||
+ | herror(" | ||
+ | exit(1); | ||
+ | } | ||
+ | bcopy(hp-> | ||
+ | addr.sin_port = htons(port); | ||
+ | addr.sin_family = AF_INET; | ||
+ | sock = socket(PF_INET, | ||
+ | setsockopt(sock, | ||
+ | |||
+ | if(sock == -1){ | ||
+ | perror(" | ||
+ | exit(1); | ||
+ | } | ||
+ | |||
+ | if(connect(sock, | ||
+ | perror(" | ||
+ | exit(1); | ||
+ | |||
+ | } | ||
+ | return sock; | ||
+ | } | ||
+ | |||
+ | #define BUFFER_SIZE 1024 | ||
+ | |||
+ | int main(int argc, char *argv[]){ | ||
+ | int fd; | ||
+ | char buffer[BUFFER_SIZE]; | ||
+ | |||
+ | if(argc < 3){ | ||
+ | fprintf(stderr, | ||
+ | exit(1); | ||
+ | } | ||
+ | |||
+ | fd = socket_connect(argv[1], | ||
+ | write(fd, "GET / | ||
+ | bzero(buffer, | ||
+ | |||
+ | while(read(fd, | ||
+ | fprintf(stderr, | ||
+ | bzero(buffer, | ||
+ | } | ||
+ | |||
+ | shutdown(fd, | ||
+ | close(fd); | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | Para compilarlo procederemos a ejecutar **gcc**: | ||
+ | < | ||
+ | gcc socket.c -o socket | ||
+ | </ | ||
+ | Strace nos mostrará muchos datos, como llamadas al sistema para imprimi como files descriptors, | ||
+ | < | ||
+ | 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 +++ | ||
+ | </ | ||
+ | ===== Extras y referencias útiles ===== | ||
+ | A veces también puede servirnos **ltrace**, que es una utilidad de depuración, | ||
+ | |||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// |
notas/strace.txt · Última modificación: 2020/04/17 02:11 por cayu