A lo largo de los años, he escrito extensamente sobre cómo solucionar problemas relacionados con el software en el mundo de TI en general y en Linux en particular. Después de todo, este ha sido mi pan y mantequilla durante mucho tiempo, y todavía estoy muy interesado en el arte de resolver problemas. Uno de los temas que cubrí profusamente es gdb, el depurador de software por excelencia. El único problema es que necesitas pensar para ganar.
Lo que quiero decir con esto:gdb es excelente si puede reproducir sus problemas. Pero si ejecuta el software en una configuración de producción, es posible que no tenga el lujo de seguir desencadenando problemas una y otra vez. La capacidad de capturar y luego reproducir errores es una gran ventaja, y viene en forma de RR, una herramienta diseñada para ayudar a depurar ejecuciones de software registradas de manera precisa y determinista. A ver que da.
RReady, ready, set
En esencia, RR es gdb y gdb es RR. La idea es simple y la implementación elegante. Ejecuta su herramienta con rr, captura la ejecución (y la falla) y luego reproduce la grabación tantas veces como desee, fuera del entorno de producción. Además, si hay problemas escurridizos, es posible que pueda tomar un escenario repetible, lo que le permite descubrir más rápidamente la causa raíz y solucionar el problema.
Instalé y configuré RR en Fedora 32. Bastante sencillo. Ahora, la ejecución requiere cierta atención a los detalles. Si ejecuta el programa como un usuario normal, es posible que vea una advertencia de que RR en realidad no puede obtener eventos privilegiados del kernel. Puede cambiar esto, y luego no necesita sudo. Similar a lo que hemos visto con perf realmente. Dulce.
rr record ./seg
rr necesita /proc/sys/kernel/perf_event_paranoid <=1, pero es 2.
Cámbielo a 1, o use 'rr record -n' (lento).
Considere colocar 'kernel.perf_event_paranoid =1' en /etc/sysctl.conf
Hay muchas maneras de cambiar esto. Asigne un valor a /proc, use sysctl -w para escribir el valor, edite manualmente el archivo /etc/sysctl.conf y luego vuelva a cargar la configuración. Cualquiera que sea la forma que elija, tendrá un mejor rendimiento y la capacidad de rastrear todos los eventos necesarios.
sudo sysctl -w kernel.perf_event_paranoid=1
Ejemplo de falla de segmento
Para ver cuán práctico y útil es RR, decidí usar el mismo ejemplo de falla de segmento del tutorial de gdb. Básicamente, un bucle con malloc() que conducirá a una falla de segmentación:
#incluir
#incluir
main()
{
int *puntero;
int yo;
puntero =malloc(tamaño(int));
para (i =0; 1; i++)
{
puntero[i]=i;
printf("puntero[%d] =%d\n", i, puntero[i]);
}
retorno(0);
}
gcc -g seg.c -o seg
seg.c:4:1:advertencia:el tipo de retorno predeterminado es 'int' [-Wimplicit-int]
4 | principal()
| ^~~~
Grabación de RR y reproducción de RR
Las dos funciones principales que utiliza RR:grabar y reproducir.
rr record ./seg
...
puntero[33621] =33621
puntero[33622] =33622
puntero[33623] =33623
Falla de segmentación (núcleo desechado)
Tenga en cuenta que la ejecución real será más lenta de lo habitual. Esto significa que si tiene problemas que dependen del tiempo, RR puede no ser útil. Bastante similar a lo que hemos visto con strace realmente. Desea problemas deterministas que se puedan replicar de manera confiable (es decir, en las condiciones adecuadas).
De todos modos, una vez que tengamos el problema registrado, podemos reproducirlo:
rr reproducir
La primera vez que se cargó RR, me advirtió que los símbolos de depuración no estaban disponibles; esto es muy importante si realmente desea poder solucionar el problema. No es específico de RR de ninguna manera, pero esto es algo a tener en cuenta:puede instalar los paquetes que faltan si lo desea, el programa incluso enumera el comando exacto que puede usar para hacerlo.
Depuración remota usando 127.0.0.1:7747
Lectura de símbolos de /lib64/ld-linux-x86-64.so.2...
(No se encontraron símbolos de depuración en /lib64/ld-linux-x86 -64.so.2)
0x00007f25ce73e110 en _start () de /lib64/ld-linux-x86-64.so.2
Falta información de depuración separada, use:dnf debuginfo-install glibc-2.31-2 .fc32.x86_64--Escriba
Una vez cargada la interfaz RR, estás en la tierra gdb. Los comandos son los mismos. Puede establecer puntos de interrupción y luego usar condiciones para cuándo esos puntos de interrupción deberían activarse realmente y detenerse la ejecución de la tarea.
romper 10
condición 1 i ==33610
continuar
Y la sesión de depuración se parecerá a:
(rr) siguiente
puntero[33611] =33611
9 para (i =0; 1; i++)
(rr) siguiente
11 puntero[i]=i;
(rr) siguiente
Programa recibido señal SIGSEGV, Fallo de segmentación.
0x000000000040116a en main () en seg.c:11
11 puntero[i]=i;
Ahora, puede profundizar y realizar comprobaciones adicionales. La principal diferencia es que todo esto ocurre en una instancia grabada de su software, por lo que no interfiere potencialmente con el uso real de sus servicios y aplicaciones. Idealmente, necesita una configuración inteligente que pueda detectar problemas automáticamente y registrarlos, pero esa es una historia completamente diferente.
Conclusión
No he pasado mucho tiempo usando RR, pero me gusta lo que veo. El programa utiliza los sólidos y familiares fundamentos de gdb, lo que significa que no necesita volver a aprender a solucionar problemas de Linux desde cero. Además de eso, agrega una capa de poderosa flexibilidad, lo que le permite minimizar la presión del tiempo que a menudo se asocia con problemas de TI, como fallas de software. Puede grabar y reproducir a su conveniencia. Esto también significa que es más probable que encuentre el problema, especialmente si se trata de ejecuciones largas y complicadas de tareas.
Con suerte, encontrará útil este breve tutorial. En un mundo en el que hay diez chefs para cada comida y cincuenta herramientas redundantes de Linux para cada necesidad, es bueno ver un software que ofrece una funcionalidad adicional significativa en lugar de una repetición de lo mismo. Bueno, ahora tienes otra utilidad en tu arsenal, lo que también significa una excusa menos para no poder resolver esos molestos problemas de software lo suficientemente rápido. Así es como funciona, no.