참조 문헌

안드레아스 젤러(Andreas Zeller) 저, Why Programs Fail:프로그램은 왜 실패하는가?. 류 광역, (주)사이텍미디어 p.115 ~ p.155

참조 링크

- 없음

4장, 문제점 재현 내용

문제점을 재현이 무엇이며, 문제점 재현하는 방법에 대해서 소개하고 있다.

문제점 재현은 어떤 의미인가?

문제가 발생했을 때, 문제가 재현되지 않으면, 문제가 어디서 시작 하는지, 어떤 증상이 있는지 확인하기 매우 어려워, 문제의 관찰/수정이 매우 어려워 진다. 경험적으로 문제점을 재현하지 못하면, 문제 수정을 할 수 없는 경우가 95%는 족히 넘을 것이다. 그래서 문제가 발생되면, 문제 재현이 제일 먼저 해야 할 일이다. 문제를 재현하게 되면, 문제을 통제된 환경에서 관찰할 수 하고, 문제 해결 후 문제가 고쳐졌는지 확인 할 수 있다.

문제점은 어떻게 재현할 수 있는가?

문제를 재현하기 위해선 크게 문제가 발생한 환경을 재현하고, 문제점 발생 과정을 재현하여, 문제점을 재현할 수 있다. 경험적으로 문제점 환경 재현은 릴리즈 버전, OS, 하드웨어 순으로 많이 발생하며, 대부분 릴리즈 버전만 맞추면 되었다. (진짜 특이하게 메모리 불량에서 걸린적이 있었고, 5년간 딱 1번 있었다.) 그러므로 환경에 대해서는 생략한다.

문제점 발생 과정은 어떻게 재현 할 수 있는가?

프로그램은 인과관계가 매우 명확하다. 입력이 똑같으면, 결과는 언제나 똑같기 때문이다. 즉 문제점 발생 당시, 모든 입력이 동일하면, 문제는 반드시 발생한다. 그러므로 입력을 재현하면, 문제점을 재현할 수 있다. 경험적으로 입력 재현이 어려운 경우가 많이 있다. : )

프로그램 입력은 무엇이며, 어떻게 재현할 수 있는가?

다음은 프로그램 입력의 종류이다.

  • 데이터 입력
    - 파일, DB 등 저장된 자료, 이 경우 매우 쉽게 재현이 가능하다.(다시 읽으면 되니까)

  • 사용자 입력
    - 프로그램 사용자의 입력인데, 재현이 조금 까다롭다.

  • 통신 입력
    - 스레드간, 프로세스간, 컴퓨터간 통신이 있으며, 역시 재현이 까다롭다.

  • 시간 입력
    - 수행에 많은 영향을 미치며, 경우에 따라 재현이 까다롭다.

  • 난수 입력
    - 시드에 의한 난수 생성 구조라면, 재현이 쉽다.

  • 운영 환경 입력
    - 프로그램/OS 등 처럼 프로그램이 실행하기 위한 상호작용 들인데, 재현이 까다롭다.

  • 프로세스, 스레드 일정
    - 개발 단계부터 영향을 적게 받는 구조로 프로그램을 만들어야 한다.그렇지 않으면, 재현의 매우 어렵다.

이 밖에도 의도하지 않았으나, 프로그램에 영향을 주는 입력들이 있다.

  • 물리적 사건
    - 하드웨어 결함 등이 있다. 재현이 불가능에 가깝다.

  • 디버깅 도구
    - 디버깅 도구가 프로그램 수행에 끼어들면서, 변수가 초기화 등이 변경 되는 경우가 있다.

먼저 입력 재현이 상대적으로 쉬운 데이터, 난수, 시간(시간 변경 가능한 구조로 만들면 된다.)은 생략하고, 문제가 일어날 확율이 적은 운영 환경, 물리적 사건 입력도 생략, 재현이 매우 어려운 프로세스, 스레드 일정도 생략 한다.

사용자 입력 재현 방법

표준적인 방법은 3장 표현층 재현 방법이지만, 사용자에게 이 정보를 기대할 수 없으며, 매우 불안정하다. 그러므로 더 높은 수준의 입력 재현 방법이 필요한데, 이러한 도구는 거의 없다고, 책에 설명 되어 있다.

경험적으로 사용자 입력 부분을 데이터로 만들어야 한다고 생각한다. 예를 들어 프로그램 내부적으로 사용자 입력을 데이터 형태로 변환하고, 데이터를 특정 Queue 에 쌓은 후, 데이터를 하나씩 꺼내서 사용자 입력을 받는 구조로 짜야 한다. 그리고 이 데이터를 기록했다가, 재생하고 싶을 때, Quque 에 넣으므로써, 재생이 가능하게 만들수 있다. 경우에 따라 성능저하가 예상 된다.

통신 입력 재현 방법

네트워크 전송을 갈무리/조사/재생 하는 도구가 존재한다. 경험적으론 네트워크 전송 내용을 파일로그로 남기면 편하게 되었다. 이러한 개념으로 스레드간, 프로세스간 통신도 파일 로그로 남기면, 조사는 쉽게 된다. 자동화도 이 파일 로그로 재현 할수 있다.

디버깅 도구의 영향

프로그램에 디버깅 도구가 끼어들게 되면 변수 초기화가 달라지거나, 잘못된 디버깅 도구 사용으로 다른 문제점이 발생될 수 있다. 게다가 디버깅 도구에 버그가 있을 수도 있다. 디버깅 도구가 끼어들면서 생길수 있는 영향도 고려해야 한다.

기타 입력 재현 방법

  • 모크 객체
    - 특정 객체의 상호작용을 흉내내고 기록/재생하도록 객체를 만들수 있다.

여담

내 경험으론 클라-서버 통신 중 클라의 행동이 서버에 영향을 줘 서버가 크래쉬를 일으키는 경우가 많이 있는데, 이를 추적하기 위해서 클라가 준 모든 패킷 처리의 시작과 끝에 로그를 남겼었다. 그 후 클라 행동 재현이 쉬워졌고, 더욱 쉽게 디버깅을 할 수 있었다.

이번 장에서 "입력 변수 재현에 대하여" 고민을 해야 한다고 느끼게 되었다.

:wq


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기