julio 27, 2020

C贸mo Git Bisect ayuda a la depuraci贸n

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
Referencia de Git bisect

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