Debugging
디버깅(Debugging)은 프로그램에서 발생한 오류의 원인을 찾아내고 수정하는 일련의 과정이다. “버그(Bug)를 잡는다”는 어원 그대로, 문제 현상을 단서로 삼아 거꾸로 원인을 추적하는 작업이다. 코드를 작성하는 시간보다 디버깅에 쓰는 시간이 훨씬 더 많다는 사실은 거의 모든 개발자가 동의한다.
디버깅의 기본 단계
- 재현: 문제를 안정적으로 재현할 수 있어야 한다.
- 격리: 어떤 입력/조건에서만 발생하는지 좁힌다.
- 가설: 원인에 대한 가설을 세운다.
- 검증: 로그·디버거·테스트로 가설을 검증한다.
- 수정: 원인을 제거한다.
- 회귀 검증: 다른 부분이 망가지지 않았는지 확인한다.
자주 쓰는 도구·기법
- 로그(logging): 가장 보편적이고 강력한 도구
- 디버거(breakpoint, step, watch): 실행 흐름을 직접 관찰
- 이분 탐색(bisect): 어느 커밋에서 결함이 들어왔는지 추적
- 러버덕 디버깅: 누군가에게(또는 인형에게) 코드를 설명하다 보면 원인이 보인다
- 유닛 테스트: 결함을 좁히고, 수정 후 회귀 검증
흔한 함정
- 증상과 원인을 혼동한다 — 같은 증상이 여러 원인에서 나올 수 있다
- 첫 가설에 집착한다 — 데이터가 가설을 부정하면 가설을 버린다
- “내 환경에서는 됨” — 환경 차이를 가설에 포함시켜야 한다
- 로그만 늘린다 — 가설 없는 로그는 노이즈
좋은 자세
- 이상한 현상은 반드시 이유가 있다. 우연이 아니다.
- 알고 있는 것과 추측한 것을 분리한다.
- 한 번에 한 가지만 바꾼다 — 두 변수를 동시에 바꾸면 원인 추적이 망가진다.