notas:strace
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Próxima revisión | Revisión previa | ||
| notas:strace [2011/01/14 13:47] – creado 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 | + | **strace** es una utilidad |
| - | 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 36: | Línea 36: | ||
| **f** = hace un traceo del proceso y de sus forks | **f** = hace un traceo del proceso y de sus forks | ||
| + | |||
| **p** = numero de PID (process ID) | **p** = numero de PID (process ID) | ||
| Línea 51: | 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 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 y referencias útiles ===== | ||
| + | A veces también puede servirnos **ltrace**, que es una utilidad de depuración, | ||
| + | |||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
notas/strace.1295012873.txt.gz · Última modificación: 2011/01/14 13:47 por cayu
