Effective Debugging/Chapter 3. 범용 도구를 활용한 기법

created : 2020-04-07T11:44:40+00:00
modified : 2020-09-26T14:27:39+00:00

읽을거리

  • The Art of Command Line(https://github.com/jlevy/the-art-of-command-line)

Item 22. 유닉스 명령줄 도구로 디버깅 데이터 분석하기

  • 아래와 같은 순서로 스크립트를 작성한다.
    • 가져오기(Fetching)
    • 선택하기(Selecting)
    • 처리하기(Processing)
    • 정리하기(Summarizing)
  • 읽을거리를 참고해서 CLI 사용법을 좀 더 잘 익히자

기억할 사항

  • 텍스트 형태의 레코드를 가져오고, 선택하고, 처리하고, 정리하는 유닉스 명령어를 이용하여 디버깅 데이터를 분석한다.
  • 여러 가지 유닉스 명령을 파이프라인으로 조합하는 방식으로 복잡한 분석 작업을 간단히 처리할 수 있다.

Item 23. 명령줄 도구 옵션과 관용 표현 활용하기

  • grep에서 제공하는 다양한 옵션을 활용하면 탐색 범위를 줄일 수 있다.
  • 프로그램의 에러 메시지를 분석할 때는 표준 에러를 리다이렉션한다.
  • 로그 파일에 추가되는 내용을 모니터링하고 싶다면 tail -f 명령을 활용한다.

Item 24. 코드 편집기로 디버깅 데이터 탐색하기

  • 철자가 틀린 식별자를 찾을 때는 편집기에서 제공하는 검색 기능을 활용한다.
  • 차이점이 눈에 띄도록 텍스트파일을 적절히 수정한다.
  • 로그 파일을 좀 더 읽기 좋도록 적절히 수정한다.

Item 25. 작업 환경 최적화하기

  • Path 환경 변수에 실행할 프로그램에 관련된 디렉터리가 빠짐없이 담겨 있는지 확인한다. 디벅이 과정에서 시스템 관리자 권한의 명령을 실행해야 하는 경우도 종종 있다. 따라서 이러한 명령에 대한 경로도 포함해야 한다.
  • 쉘과 편집기에서 자동 완성 기능을 사용하도록 설정한다.
  • 쉘 프롬프트와 터미널 바에 사용자 계정과 현재 디렉터리, 호스트 이름이 표시되도록 설정한다. 디버깅하는 과정에서 여러 호스트와 계정을 오갈 수 있기 때문에 현재 상태를 명확히 알 수 있도록 계정과 위치 정보를 표시한다.
  • 명령줄에서 편집할 때 자신이 사용할 편집기와 연동하도록 키 바인딩을 설정한다. 이렇게 해두면 데이터 분석 파이프라인을 점진적으로 만들어나가는 작업을 훨씬 효율적으로 수행할 수 있다.
  • 자주 사용하는 명령과 흔히 저지르는 입력 오류에 대해 앨리어스나 단축키를 만든다.
  • 버전 관리 시스템을 비롯한 다양한 유틸리티에서 자신이 주로 사용하는 페이징 프로그램(lessmore처럼 파일의 내용을 페이지 단위로 출력하는 프로그램)과 편집기를 활용하도록 환경변수를 설정한다.
  • 입력한 명령을 모두 히스토리 파일에 기록하도록 설정한다. 이렇게 하면 디버깅할 때 자주 사용하거나 중요한 구문을 몇 달이 지난 뒤에도 쉽게 찾아낼 수 있다. 이때 구문 앞에 공백을 붙여서 (패스워드를 담은 부분처럼) 명령을 호출하는 부분은 기록하지 않도록 설정한다.
  • 쉘의 경로 이름 확장 기능 또는 *과 같은 와일드카드 문자로 표현하는 글로빙(globbing)을 실행할 때 서브 디렉터리에 있는 파일도 포함하도록 설정한다. 이렇게 하면 하위 계층에 있는 모든 디렉터리에 대해 적용되는 ** 와일드 카드를 사용할 수 있기 때문에, 계층이 깊게 구성된 디렉터리에 대해 실행하는 명령을 간결하게작성할 수 있다.

기억할 사항

  • 사용하는 도구를 적절히 설정하여 생산성을 향상시킨다.
  • 여러 호스트에 걸쳐 작업할 때는 디버깅 환경에 대한 설정 파일을 버전 관리 시스템을 통해 관리한다.

Item 26. 버전 관리 시스템으로 버그 원인과 히스토리 추적하기

  • 가령 버그가 발생한 버전의 구간을 알고 있고, 오류가 발생하면 0이 아닌 코드를 반환하며 종료하는 테스트 스크립트도 있다면, 그 버전 사이에서 발생한 모든 변경 내역을 이진 탐색으로 검색해서 해당 버그를 발생시킨 지점을 찾아준다.

    git bisect start V1.1.0 V1.2.3 git bisect run test.sh git reset

  • 잠시 작업한걸 숨기고 싶을 때

    git stash save {wanted name} git stash pop

기억할 사항

  • 버전 관리 시스템에 기록된 파일의 변경 내역을 분석하면 버그가 언제 어떻게 생겼는지 알아낼 수 있다.
  • 버전 관리 시스템을 활용하여 정상적인 버전과 버그가 있는 버전을 비교한다.

Item 27. 독립적인 프로세스로 구성된 시스템에서 모니터링 도구 사용하기

모니터링할 대상

  • 어플리케이션의 엔드 투 엔드(end-to-end) 가용성
  • 웹 서비스, 데이터베이스 테이블, 정적 웹 페이지, 인터랙티브 웹 폼, 리포팅 서비스 등과 같이 어플리케이션을 구성하는 요소들
  • 응답 지연 시간, 큐에 저장되거나 완료된 명령, 활동 중인 사용자의 수, 실패한 트랜잭션, 발생한 에러, 리포팅 된 충돌 사항 등과 같이 핵심적인 측정 지표
  • ghi 도구를 활용하는 쉘 스크립트를 작성하자

기억할 사항

  • 모니터링 환경을 구축하여 개발하고자 하는 서비스에 관련된 모든 부분의 상태를 지속적으로 확인한다.
  • 장애가 발생하는 즉시 알림을 보내도록 설정하면 에러가 나타난 상태에서 디버깅 작업을 수행할 수 있다.
  • 오류 발생 내역을 분석하면 문제의 원인을 정확히 찾아내는 데 도움되는 패턴을 도출할 수 있다.