LabHub
배우기 러닝패스 코스

デバッグ実戦

トレースバックから計装まで

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

트레이스백에서 원인을 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 에 저장하세요.

참고

작업 사본 만들기

/root/trace 를 만들고 /opt/app/report.py/root/trace/report.py 로 복사하세요.

/root/trace 를 만들고 /opt/app/report.py 를 그 안으로 복사하세요.

실패 원문 확보하기

실패하는 실행의 출력을 표준오류까지 포함해 /root/trace/traceback.txt 에 저장하세요.

트레이스백은 표준출력이 아니라 표준오류로 나갑니다. 리다이렉션에 2>&1 이 필요합니다.

예외 종류 적기

발생한 예외의 이름만 /root/trace/error_type.txt 에 적으세요.

트레이스백 맨 아랫줄의 콜론 앞부분이 예외 이름입니다. 이름만 적으세요.

최초 실패 행 특정하기

실행을 처음으로 멈춰 세운 행의 id 값을 /root/trace/bad_row.txt 에 적으세요.

예외 메시지에 실제 값이 들어 있습니다. 원본 CSV 에서 그 값을 가진 행의 id 를 찾으세요.

종료 코드 0 으로 만들기

/root/trace/report.py 를 사양대로 고쳐 종료 코드 0 으로 끝나게 만드세요.

docstring 의 사양에 유효한 행의 조건 세 가지가 적혀 있습니다. 조건에 맞지 않으면 건너뛰고 계속 진행해야 합니다.

집계 결과 저장하기

고친 스크립트의 출력을 /root/trace/out.txt 에 저장하세요. rows=18 total=130400 이 나와야 합니다.

고친 스크립트의 출력을 그대로 파일로 넘기세요. rows= 와 total= 두 값이 다 필요합니다.

건너뛴 행 기록하기

건너뛴 행을 한 줄에 하나씩 /root/trace/skipped.log 에 남기도록 계측을 넣으세요.

다음번에 같은 일이 나면 1분 만에 끝나도록 계측을 심는 단계입니다. 건너뛴 행 하나당 한 줄씩 남기세요.

다른 입력에 돌려 보기

같은 스크립트를 /opt/data/orders_api.csv 에 대해 실행하고 출력을 /root/trace/out2.txt 에 저장하세요.

오늘 데이터에만 맞춘 수정은 수정이 아닙니다. /opt/data/orders_api.csv 로 같은 스크립트를 돌려 결과를 저장하세요.