Debug loop

디버깅은 재현 조건을 고정하고 실패 범위를 좁힌다

감으로 로그를 늘리는 대신, 같은 입력에서 재현되는지 확인하고 관찰 범위를 반씩 줄여 원인을 분리한다.

단계
해야 할 일
남겨야 할 증거
1. 재현
입력, 빌드 옵션, 환경 변수를 고정한다.
seed, 입력 파일, 실행 명령
2. 관찰
중단점, 로그, sanitizer 중 하나로 실패 지점을 본다.
스택, 변수 값, 오류 메시지
3. 범위 축소
모듈, 함수, 조건문 순서로 의심 범위를 줄인다.
통과/실패를 가르는 최소 조건
4. 검증
수정 후 같은 재현 조건과 회귀 테스트를 실행한다.
실패 재현 불가, 관련 테스트 통과
메모리 오류ASan, Valgrind로 경계 밖 접근과 use-after-free를 확인한다.
동시성 오류TSan과 재현 seed로 경쟁 조건을 반복 확인한다.
논리 오류불변식과 최소 입력으로 잘못된 분기를 좁힌다.

좋은 디버깅 기록은 “무엇을 고쳤다”가 아니라 “어떤 조건에서 실패했고, 어떤 증거로 사라졌는가”를 남긴다.