Te presentamos c贸mo Git Bisect ayuda a la depuraci贸n, que es una herramienta muy buena para que la depuraci贸n sea muy f谩cil. Sin embargo, pocas personas lo usan activamente.
Depuraci贸n Delta
La depuraci贸n de Delta es el proceso de completar m煤ltiples pasos de depuraci贸n y en cada uno de estos, el objetivo es eliminar la mitad del 芦problema禄. Se puede considerar como una b煤squeda binaria de depuraci贸n. O como se indica desde su terminolog铆a:
Delta Debugging automatiza el m茅todo cient铆fico de depuraci贸n. La idea b谩sica del m茅todo cient铆fico es establecer una hip贸tesis sobre por qu茅 algo no funciona. Se debe de realizar una prueba de esta hip贸tesis y refinarla o rechazarla seg煤n el resultado de la prueba. Al depurar, la gente hace esto a mano. Delta Debugging automatiza este proceso.
Git bisect es la forma de c贸mo aplicamos la depuraci贸n delta con Git.
Supongamos que tenemos un error e intentamos encontrar la causa ra铆z. En cada paso de nuestra investigaci贸n para encontrar una soluci贸n, eliminamos la mitad del espacio de la soluci贸n. Configuraci贸n, c贸digo, entrada … entre otras cosas. Aqu铆 un ejemplo para hacerlo m谩s claro.
Ejemplo de git bisect
Primero, necesitamos iniciar con un repositorio para rastrear nuestro trabajo.
mkdir test_git_bisect && cd test_git_bisect && git init
Vamos a hacer un script que tenga una 茅poca y lo convierta a
Datetime
Para hacerlo, aplicamos el uso de un archivo de entrada (llamado epochs.txt) que solo tenga 茅pocas.
Para ejecutar un git bisect sin problemas, necesitamos tener bastantes commits.
El script de Python parse_epochs.pyque usaremos aqu铆 no tiene nada de extraordinario.
from time import localtime, strftime
with open(‘epochs.txt’, ‘r’) as handler:
epochs = handler.readlines()
for epoch in epochs:
current_datetime = strftime(‘%Y-%m-%d %H:%M:%S’, localtime(int(epoch)))
print(current_datetime)
Apliquemos el primer cambio:
git add . && git commit -m 芦Created epoch parser禄
luego crea la entrada:
for i in {1..100}; do sleep 3; date +%s >> epochs.txt; done
Esto se enfoca en las 茅pocas desde el momento en que comenzamos el script (m谩s 3 segundos) hasta cinco minutos m谩s tarde, con un paso de 3 segundos.
Nuevamente aplicaremos el cambio:
git add . && git commit -m 芦Generated the first version of input禄
Ahora ejecutaremos el script inicial, obteniendo todas las entradas analizadas por fechas:
$ python3 parse_epochs.py
2020-07-21 16:08:39
2020-07-21 16:10:40
2020-07-21 16:10:43
2020-07-21 16:10:46
2020-07-21 16:10:49
2020-07-21 16:10:52
…
Ahora es importante modificar la entrada ahora para que sea defectuosa:
echo 芦random string禄 >> epochs.txt
y cometer de nuevo:
git add . && git commit -m 芦Added faulty input禄
A fin de alinearse a la entrop铆a y para hacer el ejemplo m谩s complejo, se debe agregar entradas m谩s defectuosas: commits.
echo 芦This is not an epoch禄 >> epochs.txt
&& git add . && git commit -m 芦Added faulty input v2禄
echo 芦Stop this, the script will break禄 >> epochs.txt
&& git add . && git commit -m 芦Added faulty input v3禄
Aqu铆 el registro de confirmaci贸n que hasta ahora hemos creado:
$ git log –pretty=format:禄%h – %an, %ar : %s禄
b811d35 – Periklis Gkolias, 2 minutes ago: Added faulty input v3
dbf75cd – Periklis Gkolias, 2 minutes ago: Added faulty input v2
cbfa2f5 – Periklis Gkolias, 8 minutes ago: Added faulty input
d02eae8 – Periklis Gkolias, 20 minutes ago: Generated first version of input
a969f3d – Periklis Gkolias, 26 minutes ago: Created epoch parser
Si ejecutamos el script nuevamente, l贸gicamente fallar谩 con el siguiente error:
Traceback (most recent call last):
File 芦parse_epochs.py禄, line 6, in <module>
current_datetime = strftime(‘%Y-%m-%d %H:%M:%S’, localtime(int(epoch)))
ValueError: invalid literal for int() with base 10: ‘random string\n’
Todo indica que necesitaremos git bisect para arreglar esto. Para hacerlo, debemos comenzar la investigaci贸n:
git bisect start
Ahora hay que marcar una confirmaci贸n como mala (generalmente la 煤ltima) y una confirmaci贸n como buena. Esta ser铆a la segunda confirmaci贸n cuando generamos la entrada:
git bisect bad b811d35 && git bisect good d02eae8
Despu茅s de eso, git bisect dividir谩 la historia entre el buen y el mal compromiso en dos. Puedes ver eso aplicando git bisect visualize para ver los commits que se consideran los culpables, y
git show
Para imprimir el que est谩 actualmente desprotegido, en nuestro caso ser铆a:
dbf75cd
Si ejecutamos el script, seguir谩 fallando. Entonces deberemos marcar el commit actual como malo:
git bisect bad dbf75cd
Vale la pena mencionar la salida de Git en ese caso:
git bisect bad dbf75cd
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[cbfa2f5f52b7e8a0c3a510a151ac7653377cfae1] Added faulty input
Git registrar谩 nuestros avances, casi llegamos.
Si ejecutamos el script nuevamente, obviamente fallar谩. Y si lo marcamos como malo, Git dir谩:
git bisect bad cbfa2f5
cbfa2f5f52b7e8a0c3a510a151ac7653377cfae1 is the first bad commit
Para entonces, se puede corregir el error o contactar a quien haya cometido el c贸digo / entrada / configuraci贸n incorrecta. Aqu铆 mostraremos c贸mo obtener los detalles:
$ git show -s –format=’%an, %ae’ cbfa2f5
Periklis Gkolias, myemail@domain.com
Le铆ste: C贸mo Git Bisect ayuda a la depuraci贸n, te recomendamos: C贸mo crear y publicar biblioteca de componentes Vue
Te invitamos a que nos sigas en nuestras redes sociales: Facebook, Twitter, Instagram y Youtube con el perfil:聽@tortugacode