Qué muestran ltrace y strace
ltrace y strace muestran qué pide un programa mientras corre: ltrace, las llamadas a la biblioteca, y strace, las llamadas al sistema operativo. Con ellos ves qué texto compara un programa o qué archivo busca, sin leer una línea de ensamblador.
Un programa de caja de una tienda busca un archivo de licencia que no existe. Una traza dice cuál.
Al final de esta lección
Nota
Puedo leer una traza y decir qué texto compara un programa y qué archivo busca.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Llamada a biblioteca | una llamada a código ya hecho, como strcmp o puts | ltrace |
| Llamada al sistema | una petición del programa al sistema operativo, como abrir un archivo | strace |
| Traza | la lista, en orden, de las llamadas que hace un programa | |
| Ruta | el nombre completo de un archivo, con sus carpetas | /tmp/.tienda-licencia |
| ENOENT | el error que dice que el archivo pedido no existe |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
ltrace lista las llamadas a la biblioteca
ltrace programa ejecuta el programa y escribe cada llamada que hace a una biblioteca, con sus argumentos. Una llamada a strcmp enseña los dos textos que compara.
Recuerda la regla: solo programas del laboratorio. El primer Run crea tienda, un programa de ejemplo nuestro. Los otros filtran la salida con grep -o para dejar solo la llamada que interesa.
Crea el programa de ejemplo tienda
printf '#include <stdio.h>\n#include <string.h>\nint main(int argc, char **argv) {\n if (argc == 2 && strcmp(argv[1], "REBAJAS26") == 0) { puts("Descuento aplicado"); return 0; }\n puts("Codigo incorrecto");\n return 1;\n}\n' | gcc -O0 -no-pie -x c -o /tmp/tienda -Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Mira los dos textos de strcmp
ltrace /tmp/tienda hola 2>&1 | grep -o 'strcmp("[^"]*", "[^"]*")'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Mira el texto que imprime puts
ltrace /tmp/tienda hola 2>&1 | grep -o 'puts("[^"]*")'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
strace lista las llamadas al sistema
strace programa escribe cada petición que el programa hace al sistema operativo: abrir un archivo, leer, escribir. -e trace=openat deja solo las aperturas de archivos.
Si el archivo no existe, la apertura devuelve -1 y el error ENOENT. El segundo programa de ejemplo, licencia, busca un archivo de licencia en /tmp.
Crea el programa de ejemplo licencia
printf '#include <stdio.h>\nint main(void) {\n FILE *f = fopen("/tmp/.tienda-licencia", "r");\n if (f) { fclose(f); puts("Licencia encontrada"); return 0; }\n puts("Falta la licencia");\n return 1;\n}\n' | gcc -O0 -no-pie -x c -o /tmp/licencia -Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecútalo y lee lo que dice
/tmp/licenciaSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Mira qué archivo abre y no encuentra
strace -e trace=openat /tmp/licencia 2>&1 | grep tiendaSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Mira lo mismo en la biblioteca
ltrace /tmp/licencia 2>&1 | grep -o 'fopen("[^"]*", "r")'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente ve ENOENT en una traza y cree que el programa está fallando. Un programa pide a menudo archivos que pueden no estar, y sigue. En una traza completa, el cargador falla con /etc/ld.so.preload y es normal. Importa la ruta que el programa busca por su cuenta.
Crear el archivo confirma la lectura
La traza dice qué archivo busca el programa. Para confirmarlo, crea ese archivo vacío con touch y vuelve a ejecutar licencia. Después bórralo con rm.
Es un archivo de tu copia, en /tmp, que el programa de ejemplo busca. No cambias nada más.
Crea el archivo que busca
touch /tmp/.tienda-licenciaSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecuta licencia otra vez
/tmp/licenciaSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Borra el archivo de prueba
rm /tmp/.tienda-licenciaSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Para ir más lejos
Ejecuta strace -c /tmp/licencia en el terminal. La opción -c no escribe las llamadas una a una: resume cuántas hizo de cada tipo y cuántas fallaron.
Explica con tus palabras cuándo te interesa más ese resumen que la traza entera.