디버깅 실전 · 코드 레벨 디버깅 · 실습
트레이스백에서 계측까지
목표
트레이스백에서 원인을 3분 안에 특정하고, 고치는 데서 멈추지 않고 다음번을 위한 계측까지 심을 수 있게 됩니다.
왜 중요한가
트레이스백은 아래에서 위로 읽습니다. 맨 아랫줄이 예외 종류와 이유를 말하고, 그 바로 위가 실제로 터진 코드 줄이며, 위쪽은 거기까지 도달한 경로입니다. 그리고 예외 메시지에는 대개 문제를 일으킨 실제 값이 들어 있어서, 그 값으로 원본 데이터를 검색하면 몇 초 만에 범인 행을 찾습니다.
또 하나 중요한 것은 트레이스백이 표준출력이 아니라 표준오류로 나간다는 사실입니다. 고객사 배치 잡의 크론 설정에 2>&1 이 빠져 있어서 몇 달째 실패 원인이 어디에도 안 남고 있는 경우가 정말 흔합니다. "로그에 아무것도 없다" 는 말을 들으면 이것부터 확인하세요.
마지막으로, 고치고 끝내면 다음 주에 같은 일이 반복됩니다. 건너뛴 행을 기록하게 만드는 한 줄이 다음번 조사 시간을 30분에서 1분으로 줄입니다. 이것이 계측 심기이고, 재현되지 않는 문제를 다루는 정공법이기도 합니다.
단계
1. /root/trace 를 만들고 /opt/app/report.py 를 /root/trace/report.py 로 복사하세요.
2. 실패하는 실행의 출력을 표준오류까지 포함해 /root/trace/traceback.txt 에 저장하세요.
3. 발생한 예외의 이름만 /root/trace/error_type.txt 에 적으세요.
4. 실행을 처음으로 멈춰 세운 행의 id 값을 /root/trace/bad_row.txt 에 적으세요.
5. /root/trace/report.py 를 사양대로 고쳐 종료 코드 0 으로 끝나게 만드세요.
6. 고친 스크립트의 출력을 /root/trace/out.txt 에 저장하세요. rows=18 total=130400 이 나와야 합니다.
7. 건너뛴 행을 한 줄에 하나씩 /root/trace/skipped.log 에 남기도록 계측을 넣으세요.
8. 같은 스크립트를 /opt/data/orders_api.csv 에 대해 실행하고 출력을 /root/trace/out2.txt 에 저장하세요.
참고
python3 report.py > /root/trace/traceback.txt 2>&1grep -n abc /opt/data/orders.csv로 예외 메시지의 값을 원본에서 찾을 수 있습니다.report.py는 인자로 파일 경로를 받습니다. 8번은python3 report.py /opt/data/orders_api.csv형태입니다.- 진단 출력은 표준오류로 내보내고 리다이렉션으로 파일에 담는 방식이 가장 깔끔합니다. 예:
python3 report.py > out.txt 2> skipped.log - 8번 파일에는 건너뛸 행이 없습니다. 8번 실행이
skipped.log를 덮어쓰지 않도록 다른 경로로 보내거나 버리세요. - 흔한 실수 1: 2번에서
2>&1을 빠뜨려 빈 파일이 되는 것. - 흔한 실수 2: 7번에서 건너뛴 행을 화면에만 출력하는 것. 파일로 남아야 다음 사람이 봅니다.
단계 8개
- 작업 사본 만들기
- 실패 원문 확보하기
- 예외 종류 적기
- 최초 실패 행 특정하기
- 종료 코드 0 으로 만들기
- 집계 결과 저장하기
- 건너뛴 행 기록하기
- 다른 입력에 돌려 보기