저평가된 디버깅 머신건, Git Bisect

5651 단어 gitproductivity
Git bisect는 디버깅을 쉽게 만들어주는 환상적인 도구입니다. 하지만 적극적으로 사용하는 사람은 거의 없습니다.

이 빠른 기사에서는 git bisect가 버그 원인이 있는 위치를 상당히 빠르게 지적할 수 있는 방법을 보여줍니다.

하지만 먼저 이야기하자면...

델타 디버깅



델타 디버깅은 여러 단계를 수행하는 프로세스이며 각 단계에서 계획은 "문제"의 절반을 제거하는 것입니다. 디버깅의 바이너리 검색이라고 생각하시면 됩니다. 또는 이 용어를 유명하게 만든 사람Andreas Zeller은 다음과 같이 말합니다.

Delta Debugging automates the scientific method of debugging. The basic idea of the scientific method is to establish a hypothesis on why something does not work. You test this hypothesis, and you refine or reject it depending on the test outcome. When debugging, people are doing this all the time. Manually. Delta Debugging automates this process



Git bisect는 git으로 델타 디버깅을 적용하는 방법입니다.

주입된 버그가 있고 근본 원인을 찾으려고 한다고 가정하면 솔루션 조사의 모든 단계에서 솔루션 공간의 절반을 제거합니다. 구성, 코드, 입력...무엇이든. 더 명확하게 하기 위해 예를 보겠습니다.

예시



작업을 추적하기 위해 저장소를 초기화합니다.

mkdir test_git_bisect && cd test_git_bisect && git init


신기원을 얻고 다음으로 변환하는 스크립트를 만들 것이라고 가정해 봅시다.

datetime


epochs만 포함해야 하는 입력 파일(epochs.txt라는 이름)을 사용하여 이를 수행합니다.

git bisect를 원활하게 실행하려면 꽤 많은 커밋이 필요합니다.

우리가 사용할 Python 스크립트parse_epochs.py는 특별한 것이 아닙니다.


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)



첫 번째 변경 사항을 커밋해 보겠습니다.
git add . && git commit -m "Created epoch parser"
그런 다음 입력을 만듭니다.
for i in {1..100}; do sleep 3; date +%s >> epochs.txt; done
기본적으로 스크립트를 시작한 시간(+3초)부터 5분 후까지의 모든 에포크(3초 단계)입니다.

다시 변경 사항을 커밋합니다.
git add . && git commit -m "Generated the first version of input"
이제 초기 스크립트를 실행하면 모든 입력이 날짜로 구문 분석됩니다.

$ 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
...


이제 입력을 수정하여 오류가 발생하도록 합시다.

echo "random string" >> epochs.txt


그리고 다시 커밋

git add . && git commit -m "Added faulty input"


엔트로피를 위해 예제를 더 복잡하게 만들기 위해 잘못된 입력(커밋)을 더 추가해 보겠습니다.

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"


우리가 만든 커밋 로그는 다음과 같습니다.

$ 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


스크립트를 다시 실행하면 분명히 다음 오류와 함께 실패할 것입니다.

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'



이 문제를 해결하려면 git bisect가 필요한 것 같습니다. 그렇게 하려면 조사를 시작해야 합니다.
git bisect start
하나의 커밋을 나쁜 것으로 표시하고(보통 마지막 커밋) 하나의 커밋을 좋은 것으로 표시합니다. 이것은 우리가 입력을 생성했을 때 두 번째 커밋이 될 것입니다:

git bisect bad b811d35 && git bisect good d02eae8


그 후 git bisect는 좋은 커밋과 나쁜 커밋 사이의 기록을 둘로 나눕니다. 당신은 그것을함으로써 볼 수 있습니다

git bisect visualize
범인으로 간주되는 커밋을 확인하고

git show


현재 체크 아웃 된 것을 인쇄하려면, 우리의 경우

dbf75cd


스크립트를 실행하면 여전히 실패합니다. 따라서 현재 커밋을 불량으로 표시합니다.
git bisect bad dbf75cd
이 경우 git의 출력을 언급할 가치가 있습니다.

git bisect bad dbf75cd
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[cbfa2f5f52b7e8a0c3a510a151ac7653377cfae1] Added faulty input


Git은 우리가 거의 다 왔다는 것을 알고 있습니다. 야!!!

스크립트를 다시 실행하면 물론 실패합니다. 그리고 나쁜 자식으로 표시하면 다음과 같이 말합니다.

git bisect bad cbfa2f5
cbfa2f5f52b7e8a0c3a510a151ac7653377cfae1 is the first bad commit


그때까지 버그를 수정하거나 잘못된 코드/입력/구성을 저지른 사람에게 연락할 수 있습니다. 세부 정보를 얻는 방법은 다음과 같습니다.

$ git show -s --format='%an, %ae' cbfa2f5
Periklis Gkolias, [email protected]


결론



이 기사를 읽어 주셔서 감사합니다. 이 훌륭한 도구에 대한 귀하의 생각에 대해 자유롭게 의견을 말하십시오.

좋은 웹페이지 즐겨찾기